Files
MyClub/frontend/build/static/js/main.dd323bc8.js.map
T
Tomas Dvorak 84a8acf944 update
2026-03-02 20:20:56 +01:00

1 line
5.1 MiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"version":3,"file":"static/js/main.dd323bc8.js","mappings":"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","sources":["pages/ClothingPage.tsx","services/navigation.ts","pages/PlayersPage.tsx","pages/ForgotPasswordPage.tsx","components/admin/PageHeader.tsx","pages/admin/CompetitionAliasesAdminPage.tsx","components/newsletter/NewsletterSubscribe.tsx","components/common/HelpTooltipCard.tsx","pages/admin/SponsorsAdminPage.tsx","services/admin/newsletter.ts","services/admin/comments.ts","pages/admin/CommentsAdminPage.tsx","pages/legal/PrivacyPolicyPage.tsx","services/banners.ts","components/admin/AdminSidebar.tsx","hooks/useAdminNavScrollRetention.ts","components/admin/AdminHeader.tsx","components/admin/AdminSearchModal.tsx","components/admin/AdminSupportButton.tsx","components/admin/AdminHealthIndicator.tsx","layouts/AdminLayout.tsx","hooks/useFastAdminScroll.ts","pages/admin/TeamsAdminPage.tsx","pages/admin/NewsletterAdminPage.tsx","pages/admin/NavigationAdminPage.tsx","pages/TablesPage.tsx","services/sweepstakes.ts","services/instagram.ts","components/admin/InstagramGeneratorButton.tsx","components/elements/SpartaNavbar.tsx","pages/admin/ShortlinksAdminPage.tsx","components/widgets/ArticlesWidget.tsx","components/widgets/TeamsWidget.tsx","components/admin/WeatherWidget.tsx","components/admin/AdminHelp.tsx","pages/admin/AdminDashboardPage.tsx","services/public/newsletter.ts","config.ts","services/contact.ts","pages/NewsletterUnsubscribePage.tsx","hooks/usePageElementConfig.ts","services/seo.ts","hooks/useSettings.ts","components/scoreboard/ScoreboardPreview.tsx","pages/admin/AboutAdminPage.tsx","components/home/CompetitionMatches.tsx","pages/AboutPage.tsx","components/gallery/PhotoModal.tsx","pages/AlbumDetailPage.tsx","pages/PollsPage.tsx","services/setup.ts","services/comments.ts","utils/aiModels.ts","services/imageProcessing.ts","components/common/CustomRichEditor.tsx","components/common/RichTextEditor.tsx","services/youtube.ts","pages/OverlaySponsorsPage.tsx","components/polls/EmbeddedPoll.tsx","utils/url.ts","pages/admin/AnalyticsAdminPage.tsx","pages/admin/EngagementAdminPage.tsx","pages/ForbiddenPage.tsx","services/matchOverrides.ts","pages/MatchesPage.tsx","contexts/AuthContext.tsx","pages/SponsorsPage.tsx","services/players.ts","services/contactInfo.ts","pages/legal/TermsPage.tsx","utils/colors.ts","services/ai.ts","services/zonerama.ts","components/common/ConfirmationDialog.tsx","pages/admin/ScoreboardAdminPage.tsx","services/admin/contactMessages.ts","components/common/Pagination.tsx","components/admin/MessageDetailModal.tsx","pages/admin/MessagesAdminPage.tsx","pages/GalleryPage.tsx","services/articles.ts","contexts/ConfirmDialogContext.tsx","components/admin/UniversalTranslator.tsx","pages/admin/AdminActivitiesPage.tsx","components/polls/PollCard.tsx","services/errorReporter.ts","pages/admin/FinancialDashboard.tsx","services/categories.ts","utils/errorTranslator.ts","pages/RegisterPage.tsx","pages/admin/QRCodesAdminPage.tsx","services/eventService.ts","pages/CalendarPage.tsx","hooks/useCountdown.ts","components/common/LanguageSwitcher.tsx","components/engagement/AchievementsModal.tsx","components/engagement/RewardsModal.tsx","hooks/useNavbarData.ts","components/Navbar.tsx","components/layout/MainLayout.tsx","services/facr/facrApi.ts","services/analyticsService.ts","hooks/useFacrApi.ts","services/adminMatches.ts","services/facr/cache.ts","services/actionLog.ts","pages/MatchDetailPage.tsx","i18n/index.ts","components/common/ServiceWorkerUpdateListener.tsx","components/CookieBanner.tsx","components/seo/DefaultSEO.tsx","components/ProtectedRoute.tsx","App.tsx","hooks/useFontLoader.ts","App.lazy.tsx","reportWebVitals.ts","serviceWorkerRegistration.ts","index.tsx","services/api.ts","components/common/ThumbnailPreview.tsx","services/pageElements.ts","services/shortlinks.ts","services/scoreboard.ts","pages/admin/PrefetchAdminPage.tsx","components/home/VideosSection.tsx","config/fonts.ts","components/admin/PollLinker.tsx","pages/admin/SweepstakesAdminPage.tsx","config/facr.ts","components/elements/SpartaHorizontalSlider.tsx","pages/premium/PremiumHomePage.tsx","pages/admin/BannersAdminPage.tsx","pages/AuthPage.tsx","components/common/ColorPicker.tsx","components/widgets/MatchesWidget.tsx","components/home/ContactMap.tsx","utils/logoUtils.ts","components/common/TeamLogo.tsx","hooks/useIntersectionObserver.ts","hooks/usePublicSettings.ts","services/relatedClubs.ts","services/search.ts","pages/SearchPage.tsx","components/layout/Footer.tsx","services/aiUsage.ts","components/common/AIPromptInput.tsx","pages/admin/UsersAdminPage.tsx","utils/sportLogosAPI.ts","components/comments/CommentsSection.tsx","services/rembg.ts","components/common/ColorPickerPopover.tsx","pages/SetupPage.tsx","pages/admin/PollsAdminPage.tsx","utils/aiTextProcessing.ts","pages/admin/MobileScoreboardControlPage.tsx","services/admin/engagement.ts","hooks/useUmami.ts","pages/admin/I18nAdminPage.tsx","services/public.ts","hooks/useAutoSave.ts","pages/StylePreviewPage.tsx","pages/admin/SettingsAdminPage.tsx","pages/admin/AdminDocsPage.tsx","components/pack/StandingsCard.tsx","services/competitionAliases.ts","components/ui/HorizontalScroller.tsx","pages/premium/PremiumBlogPage.tsx","services/polls.ts","services/articleSave.ts","components/admin/AlbumPhotoPicker.tsx","components/admin/BlogTranslator.tsx","pages/admin/ArticlesAdminPage.tsx","utils/auth.ts","components/common/MatchWeather.tsx","components/common/DateRangePicker.tsx","components/scoreboard/MyClubOverlay.tsx","pages/OverlayScoreboardPage.tsx","pages/VideosPage.tsx","hooks/useClubTheme.ts","pages/premium/PremiumLayout.tsx","components/home/MatchModal.tsx","components/admin/MapStyleSelector.tsx","utils/mapUrlParser.ts","components/admin/MapLinkImporter.tsx","services/settings.ts","components/events/EventLocationMap.tsx","pages/ActivityDetailPage.tsx","pages/ResetPasswordPage.tsx","hooks/useBlogTranslation.ts","pages/admin/ContactsAdminPage.tsx","pages/NotFoundPage.tsx","pages/ActivitiesCalendarPage.tsx","contexts/ClubThemeContext.tsx","services/clothing.ts","components/common/SaveStatusIndicator.tsx","pages/premium/PremiumNotFound.tsx","components/common/SponsorsSection.tsx","components/common/NewsletterCTA.tsx","utils/umami.ts","components/pack/NextMatch.tsx","pages/admin/AdminResetPasswordPage.tsx","services/manualFacrAdmin.ts","pages/admin/ManualFacrAdminPage.tsx","utils/categorySort.ts","components/home/MerchSection.tsx","components/ui/theme-toggle.tsx","services/engagement.ts","pages/admin/AdminVideosPage.tsx","components/common/UploadPanel.tsx","components/home/ClubHeroTopbar.tsx","components/pack/ActivitiesList.tsx","components/sweepstakes/SweepstakeWidget.tsx","pages/HomePage.tsx","pages/PlayerDetailPage.tsx","components/pack/NewsList.tsx","components/common/AILoadingModal.tsx","pages/admin/MatchesAdminPage.tsx","services/admin/prefetch.ts","utils/imageUtils.ts","services/sponsors.ts","pages/admin/AdminMerchPage.tsx","services/translation.ts","pages/admin/GalleryAdminPage.tsx","pages/admin/SweepstakeVisualPage.tsx","pages/ArticleDetailPage.tsx","pages/legal/CookiePolicyPage.tsx","pages/admin/PlayersAdminPage.tsx","pages/BlogPage.tsx","components/home/ClubModal.tsx","pages/ContactPage.tsx","utils/nationality.ts","pages/NewsletterPreferencesPage.tsx","components/common/FilePreview.tsx","pages/ClubPage.tsx","pages/SemiAdminPage.tsx","services/files.ts","pages/admin/FilesAdminPage.tsx","components/widgets/Widget.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { \n Box, \n Container, \n Heading, \n SimpleGrid, \n Text, \n Image, \n Badge, \n VStack, \n HStack,\n Link as ChakraLink,\n Button,\n useColorModeValue,\n Spinner,\n Center\n} from '@chakra-ui/react';\nimport MainLayout from '../components/layout/MainLayout';\nimport { getClothing, ClothingItem } from '../services/clothing';\nimport { FiExternalLink } from 'react-icons/fi';\nimport { Helmet } from 'react-helmet-async';\n\nconst ClothingPage: React.FC = () => {\n const [items, setItems] = useState<ClothingItem[]>([]);\n const [loading, setLoading] = useState(true);\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const eshopUrl = process.env.REACT_APP_ESHOP_URL;\n\n useEffect(() => {\n const fetchItems = async () => {\n try {\n const data = await getClothing();\n setItems(data);\n } catch (e) {\n console.error('Failed to fetch clothing items:', e);\n } finally {\n setLoading(false);\n }\n };\n\n fetchItems();\n }, []);\n\n if (loading) {\n return (\n <MainLayout>\n <Container maxW=\"7xl\" py={8}>\n <Center minH=\"50vh\">\n <Spinner size=\"xl\" color=\"blue.500\" />\n </Center>\n </Container>\n </MainLayout>\n );\n }\n\n return (\n <MainLayout>\n <Helmet>\n <title>Oblečení a Fan Shop</title>\n <meta name=\"description\" content=\"Podpořte svůj tým! Oblečení, dresy a merchandise našeho klubu.\" />\n </Helmet>\n \n <Container maxW=\"7xl\" py={8}>\n <VStack spacing={6} align=\"stretch\">\n <Box>\n <Heading as=\"h1\" size=\"xl\" mb={3}>\n Oblečení a Fan Shop\n </Heading>\n <Text fontSize=\"lg\" color=\"gray.600\">\n Podpořte svůj tým! Prohlédněte si naši nabídku dresů, triček a dalšího merchandisingu.\n </Text>\n {eshopUrl && (\n <Box mt={4}>\n <Button\n as={ChakraLink}\n href={eshopUrl}\n isExternal\n colorScheme=\"blue\"\n rightIcon={<FiExternalLink />}\n size=\"sm\"\n >\n Přejít do plného e-shopu\n </Button>\n </Box>\n )}\n </Box>\n\n {items.length === 0 ? (\n <Center minH=\"40vh\">\n <VStack spacing={3}>\n <Text fontSize=\"lg\" color=\"gray.500\">\n Zatím zde nejsou žádné položky.\n </Text>\n <Text fontSize=\"sm\" color=\"gray.400\">\n Brzy zde najdete naše oblečení a merchandise.\n </Text>\n </VStack>\n </Center>\n ) : (\n <SimpleGrid columns={{ base: 1, sm: 2, md: 3, lg: 4 }} spacing={6}>\n {items.map((item) => (\n <ChakraLink\n key={item.id}\n href={item.url || '#'}\n isExternal={!!item.url}\n _hover={{ textDecoration: 'none' }}\n role=\"group\"\n >\n <Box\n bg={cardBg}\n borderWidth=\"1px\"\n borderColor={borderColor}\n borderRadius=\"xl\"\n overflow=\"hidden\"\n transition=\"all 0.3s\"\n _groupHover={{\n transform: 'translateY(-4px)',\n boxShadow: 'lg',\n }}\n >\n {/* Image */}\n <Box position=\"relative\" paddingTop=\"100%\" overflow=\"hidden\">\n <Image\n src={item.image_url}\n alt={item.title}\n position=\"absolute\"\n top={0}\n left={0}\n width=\"100%\"\n height=\"100%\"\n objectFit=\"cover\"\n fallbackSrc=\"/images/placeholder-clothing.jpg\"\n />\n {item.url && (\n <Box\n position=\"absolute\"\n top={2}\n right={2}\n bg=\"white\"\n borderRadius=\"full\"\n p={2}\n opacity={0}\n _groupHover={{ opacity: 1 }}\n transition=\"opacity 0.2s\"\n >\n <FiExternalLink size={16} />\n </Box>\n )}\n </Box>\n\n {/* Content */}\n <VStack align=\"stretch\" p={4} spacing={2}>\n <Heading as=\"h3\" size=\"sm\" noOfLines={2}>\n {item.title}\n </Heading>\n\n {item.description && (\n <Text fontSize=\"sm\" color=\"gray.600\" noOfLines={2}>\n {item.description}\n </Text>\n )}\n\n <HStack justify=\"space-between\" mt={2}>\n {item.price && item.price > 0 ? (\n <Badge colorScheme=\"blue\" fontSize=\"md\" px={2} py={1}>\n {item.price} {item.currency || 'Kč'}\n </Badge>\n ) : (\n <Box />\n )}\n {item.url && (\n <Text fontSize=\"xs\" color=\"blue.500\">\n Zobrazit →\n </Text>\n )}\n </HStack>\n </VStack>\n </Box>\n </ChakraLink>\n ))}\n </SimpleGrid>\n )}\n </VStack>\n </Container>\n </MainLayout>\n );\n};\n\nexport default ClothingPage;\n","import api, { API_URL as API_BASE_URL } from './api';\n\nexport interface NavigationItem {\n id?: number;\n label: string;\n url?: string;\n icon?: string;\n type: 'internal' | 'external' | 'dropdown' | 'page';\n page_type?: string;\n page_id?: number;\n visible: boolean;\n display_order: number;\n parent_id?: number;\n children?: NavigationItem[];\n target?: '_self' | '_blank';\n css_class?: string;\n requires_auth?: boolean;\n requires_admin?: boolean;\n allow_editor?: boolean;\n}\n\nexport interface SocialLink {\n id?: number;\n platform: string;\n url: string;\n display_order: number;\n visible: boolean;\n icon?: string;\n}\n\n// Normalize backend objects (backend may return `ID` instead of `id`)\nfunction normalizeNavItem(raw: any): NavigationItem {\n if (!raw || typeof raw !== 'object') return raw as NavigationItem;\n const id = raw.id ?? raw.ID;\n const children = Array.isArray(raw.children)\n ? raw.children.map((c: any) => normalizeNavItem(c))\n : undefined;\n return {\n id,\n label: raw.label,\n url: raw.url,\n icon: raw.icon,\n type: raw.type,\n page_type: raw.page_type,\n page_id: raw.page_id,\n visible: raw.visible,\n display_order: raw.display_order,\n parent_id: raw.parent_id,\n children,\n target: raw.target,\n css_class: raw.css_class,\n requires_auth: raw.requires_auth,\n requires_admin: raw.requires_admin,\n allow_editor: raw.allow_editor,\n } as NavigationItem;\n}\n\nfunction normalizeSocialLink(raw: any): SocialLink {\n if (!raw || typeof raw !== 'object') return raw as SocialLink;\n const id = raw.id ?? raw.ID;\n return {\n id,\n platform: raw.platform,\n url: raw.url,\n display_order: raw.display_order,\n visible: raw.visible,\n icon: raw.icon,\n } as SocialLink;\n}\n\n// Public endpoints\nexport const getNavigationItems = async (): Promise<NavigationItem[]> => {\n const response = await api.get(`/navigation`);\n const data = Array.isArray(response.data) ? response.data : [];\n return data.map((it: any) => normalizeNavItem(it));\n};\n\nexport const getSocialLinks = async (): Promise<SocialLink[]> => {\n const response = await api.get(`/social-links`);\n const data = Array.isArray(response.data) ? response.data : [];\n return data.map((it: any) => normalizeSocialLink(it));\n};\n\n// Admin endpoints\nexport const getAllNavigationItems = async (): Promise<NavigationItem[]> => {\n const response = await api.get(`/admin/navigation`);\n const data = Array.isArray(response.data) ? response.data : [];\n return data.map((it: any) => normalizeNavItem(it));\n};\n\nexport const createNavigationItem = async (item: Partial<NavigationItem>): Promise<NavigationItem> => {\n const response = await api.post(`/admin/navigation`, item);\n return normalizeNavItem(response.data);\n};\n\nexport const updateNavigationItem = async (id: number, item: Partial<NavigationItem>): Promise<NavigationItem> => {\n const response = await api.put(`/admin/navigation/${id}`, item);\n return normalizeNavItem(response.data);\n};\n\nexport const deleteNavigationItem = async (id: number): Promise<void> => {\n await api.delete(`/admin/navigation/${id}`);\n};\n\nexport const reorderNavigationItems = async (orders: { id: number; display_order: number }[]): Promise<void> => {\n await api.post(`/admin/navigation/reorder`, orders);\n};\n\n// Editor-allowed admin navigation (for editors' sidebar)\nexport const getEditorAllowedAdminNav = async (): Promise<NavigationItem[]> => {\n const response = await api.get(`/admin/navigation/editor`);\n const data = Array.isArray(response.data) ? response.data : [];\n return data.map((it: any) => normalizeNavItem(it));\n};\n\n// Social links admin endpoints\nexport const getAllSocialLinks = async (): Promise<SocialLink[]> => {\n const response = await api.get(`/admin/social-links`);\n const data = Array.isArray(response.data) ? response.data : [];\n return data.map((it: any) => normalizeSocialLink(it));\n};\n\nexport const createSocialLink = async (link: Partial<SocialLink>): Promise<SocialLink> => {\n const response = await api.post(`/admin/social-links`, link);\n return normalizeSocialLink(response.data);\n};\n\nexport const updateSocialLink = async (id: number, link: Partial<SocialLink>): Promise<SocialLink> => {\n const response = await api.put(`/admin/social-links/${id}`, link);\n return normalizeSocialLink(response.data);\n};\n\nexport const deleteSocialLink = async (id: number): Promise<void> => {\n await api.delete(`/admin/social-links/${id}`);\n};\n\nexport const reorderSocialLinks = async (orders: { id: number; display_order: number }[]): Promise<void> => {\n await api.post(`/admin/social-links/reorder`, orders);\n};\n\nexport const seedDefaultNavigation = async (): Promise<{ message: string; count: number; seeded: boolean }> => {\n const response = await api.post(`/admin/navigation/seed`, {});\n return response.data;\n};\n","import { Box, Container, Heading, HStack, Image, SimpleGrid, Spinner, Stack, Text, VStack, useColorModeValue, Badge, Input, Select, Checkbox, InputGroup, InputLeftElement } from '@chakra-ui/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { getPlayers } from '../services/public';\nimport type { Player } from '../services/public';\nimport { assetUrl } from '../utils/url';\nimport { Link as RouterLink } from 'react-router-dom';\nimport MainLayout from '../components/layout/MainLayout';\nimport NewsletterCTA from '../components/common/NewsletterCTA';\n// nationality display removed per requirements\nimport { useMemo, useState } from 'react';\nimport { SearchIcon } from '@chakra-ui/icons';\nimport { useTranslation } from 'react-i18next';\n\nconst PlayersPage: React.FC = () => {\n const { t } = useTranslation();\n const { data, isLoading, isError } = useQuery<Player[]>({ queryKey: ['players-all'], queryFn: () => getPlayers({ active: false }) });\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const textSecondary = useColorModeValue('gray.600', 'gray.400');\n\n const [q, setQ] = useState('');\n const [gender, setGender] = useState('');\n const [position, setPosition] = useState('');\n const [activeOnly, setActiveOnly] = useState(true);\n\n const positions = useMemo(() => {\n const all = (data || []).map(p => p.position).filter(Boolean) as string[];\n return Array.from(new Set(all));\n }, [data]);\n\n const filtered = useMemo(() => {\n let list = (data || []).slice();\n if (activeOnly) list = list.filter(p => p.is_active !== false);\n if (gender) list = list.filter(p => (p.gender || '').toLowerCase() === gender);\n if (position) list = list.filter(p => (p.position || '') === position);\n if (q.trim()) {\n const needle = q.trim().toLowerCase();\n list = list.filter(p => {\n const name = `${p.first_name} ${p.last_name}`.trim().toLowerCase();\n const pos = (p.position || '').toLowerCase();\n const jersey = typeof p.jersey_number === 'number' ? String(p.jersey_number) : '';\n return name.includes(needle) || pos.includes(needle) || jersey.includes(needle);\n });\n }\n return list;\n }, [data, q, gender, position, activeOnly]);\n\n if (isLoading) {\n return (\n <MainLayout>\n <Container maxW=\"7xl\" py={8}>\n <Spinner />\n </Container>\n </MainLayout>\n );\n }\n\n if (isError) {\n return (\n <MainLayout>\n <Container maxW=\"7xl\" py={8}>\n <Text color=\"red.500\">{t('players.loading_error')}</Text>\n </Container>\n </MainLayout>\n );\n }\n\n return (\n <MainLayout>\n <Box>\n <Container maxW=\"7xl\" py={{ base: 6, md: 10 }}>\n <VStack align=\"stretch\" spacing={6}>\n <Heading as=\"h1\" size={{ base: 'xl', md: '2xl' }}>{t('players.title')}</Heading>\n <SimpleGrid columns={{ base: 1, md: 4 }} spacing={4}>\n <InputGroup>\n <InputLeftElement pointerEvents=\"none\">\n <SearchIcon color=\"gray.400\" />\n </InputLeftElement>\n <Input value={q} onChange={(e)=>setQ(e.target.value)} placeholder={t('players.search_placeholder')} />\n </InputGroup>\n <Select value={gender} onChange={(e)=>setGender(e.target.value)} placeholder={t('players.gender')}>\n <option value=\"men\">{t('players.male')}</option>\n <option value=\"women\">{t('players.female')}</option>\n </Select>\n <Select value={position} onChange={(e)=>setPosition(e.target.value)} placeholder={t('players.position')}>\n {positions.map((pos)=> (\n <option key={pos} value={pos}>{pos}</option>\n ))}\n </Select>\n <HStack>\n <Checkbox isChecked={activeOnly} onChange={(e)=>setActiveOnly(e.target.checked)}>{t('players.active_only')}</Checkbox>\n </HStack>\n </SimpleGrid>\n <SimpleGrid columns={{ base: 1, sm: 2, md: 3, lg: 4 }} spacing={6}>\n {filtered.map((p) => (\n <Stack\n key={p.id}\n as={RouterLink}\n to={`/hraci/${p.id}`}\n borderWidth=\"1px\"\n borderColor={borderColor}\n borderRadius=\"lg\"\n p={4}\n bg={cardBg}\n _hover={{ boxShadow: 'lg', transform: 'translateY(-4px)' }}\n transition=\"all 0.2s ease\"\n spacing={3}\n >\n <Box position=\"relative\" borderRadius=\"md\" overflow=\"hidden\">\n <Image \n src={assetUrl(p.image_url) || '/logo512.png'} \n alt={`${p.first_name} ${p.last_name}`} \n objectFit=\"cover\" \n w=\"100%\"\n h=\"240px\"\n />\n {typeof p.jersey_number === 'number' && (\n <Badge position=\"absolute\" top=\"10px\" left=\"10px\" colorScheme=\"blue\" fontSize=\"0.85rem\" px={3} py={1} borderRadius=\"md\" boxShadow=\"sm\">#{p.jersey_number}</Badge>\n )}\n </Box>\n <Text fontWeight=\"bold\" fontSize=\"lg\">{p.first_name} {p.last_name}</Text>\n <Text color={textSecondary}>{p.position}</Text>\n {/* Národnost skryta */}\n </Stack>\n ))}\n </SimpleGrid>\n </VStack>\n </Container>\n \n {/* Newsletter CTA */}\n <NewsletterCTA />\n </Box>\n </MainLayout>\n );\n}\n\nexport default PlayersPage;\n","import { useState } from 'react';\nimport { Box, Button, FormControl, FormLabel, Input, VStack, Heading, useToast, Text, HStack, PinInput, PinInputField } from '@chakra-ui/react';\nimport api from '../services/api';\nimport { PasswordHelpTooltip } from '../components/common/HelpTooltipCard';\n\ntype ResetStep = 'email' | 'code' | 'new_password' | 'success';\n\nconst ForgotPasswordPage: React.FC = () => {\n const [email, setEmail] = useState('');\n const [code, setCode] = useState('');\n const [newPassword, setNewPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [step, setStep] = useState<ResetStep>('email');\n const toast = useToast();\n\n const handleInitiateReset = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!email) return;\n \n setIsLoading(true);\n try {\n await api.post('/auth/initiate-password-reset', { email });\n setStep('code');\n toast({\n title: 'Kód odeslán',\n description: 'Ověřovací kód byl odeslán na váš e-mail.',\n status: 'success',\n duration: 5000,\n isClosable: true,\n });\n } catch (error: any) {\n toast({\n title: 'Chyba',\n description: error.response?.data?.message || 'Nepodařilo se odeslat ověřovací kód',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleVerifyCode = async (e: React.FormEvent) => {\n e.preventDefault();\n if (code.length !== 6) return;\n \n setIsLoading(true);\n try {\n await api.post('/auth/verify-reset-code', { email, code });\n setStep('new_password');\n } catch (error: any) {\n toast({\n title: 'Chyba',\n description: error.response?.data?.message || 'Neplatný ověřovací kód',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleCompleteReset = async (e: React.FormEvent) => {\n e.preventDefault();\n if (newPassword !== confirmPassword) {\n toast({\n title: 'Chyba',\n description: 'Hesla se neshodují',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n return;\n }\n \n if (newPassword.length < 8) {\n toast({\n title: 'Chyba',\n description: 'Heslo musí mít alespoň 8 znaků',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n return;\n }\n \n setIsLoading(true);\n try {\n await api.post('/auth/complete-password-reset', {\n email,\n code,\n new_password: newPassword,\n });\n \n setStep('success');\n toast({\n title: 'Úspěch',\n description: 'Vaše heslo bylo úspěšně změněno. Nyní se můžete přihlásit.',\n status: 'success',\n duration: 5000,\n isClosable: true,\n });\n } catch (error: any) {\n toast({\n title: 'Chyba',\n description: error.response?.data?.message || 'Nepodařilo se změnit heslo',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n } finally {\n setIsLoading(false);\n }\n };\n\n const renderStep = () => {\n switch (step) {\n case 'email':\n return (\n <VStack as=\"form\" onSubmit={handleInitiateReset} spacing={4} align=\"stretch\">\n <Heading as=\"h2\" size=\"lg\" textAlign=\"center\" mb={4}>Obnova hesla</Heading>\n <Text textAlign=\"center\" mb={4}>\n Zadejte e-mailovou adresu vašeho účtu. Pošleme vám ověřovací kód pro obnovu hesla.\n </Text>\n <FormControl id=\"email\" isRequired>\n <FormLabel>E-mail</FormLabel>\n <Input \n type=\"email\" \n value={email} \n onChange={(e) => setEmail(e.target.value)} \n placeholder=\"vas@email.cz\" \n size=\"lg\"\n />\n </FormControl>\n <Button \n type=\"submit\" \n colorScheme=\"blue\" \n size=\"lg\"\n isLoading={isLoading}\n loadingText=\"Odesílání...\"\n >\n Odeslat ověřovací kód\n </Button>\n </VStack>\n );\n \n case 'code':\n return (\n <VStack as=\"form\" onSubmit={handleVerifyCode} spacing={6} align=\"center\">\n <Heading as=\"h2\" size=\"lg\" textAlign=\"center\">Ověřte svou identitu</Heading>\n <Text textAlign=\"center\">\n Zadejte 6místný ověřovací kód, který jsme zaslali na adresu {email}\n </Text>\n \n <HStack spacing={3} justify=\"center\">\n <PinInput \n value={code}\n onChange={(value) => setCode(value)}\n isDisabled={isLoading}\n autoFocus\n otp\n >\n {[...Array(6)].map((_, i) => (\n <PinInputField key={i} />\n ))}\n </PinInput>\n </HStack>\n \n <Button \n type=\"submit\" \n colorScheme=\"blue\" \n size=\"lg\"\n isDisabled={code.length !== 6}\n isLoading={isLoading}\n loadingText=\"Ověřování...\"\n width=\"100%\"\n >\n Ověřit kód\n </Button>\n \n <Button \n variant=\"link\" \n onClick={() => setStep('email')}\n isDisabled={isLoading}\n >\n Změnit e-mail\n </Button>\n </VStack>\n );\n \n case 'new_password':\n return (\n <VStack as=\"form\" onSubmit={handleCompleteReset} spacing={4} align=\"stretch\">\n <Heading as=\"h2\" size=\"lg\" textAlign=\"center\">Nastavení nového hesla</Heading>\n <Text textAlign=\"center\" mb={4}>\n Zadejte nové heslo pro váš účet {email}\n </Text>\n \n <FormControl id=\"newPassword\" isRequired>\n <FormLabel display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n <Box>Nové heslo</Box>\n <PasswordHelpTooltip />\n </FormLabel>\n <Input \n type=\"password\" \n value={newPassword}\n onChange={(e) => setNewPassword(e.target.value)}\n placeholder=\"Zadejte nové heslo\"\n size=\"lg\"\n />\n </FormControl>\n \n <FormControl id=\"confirmPassword\" isRequired>\n <FormLabel>Potvrzení hesla</FormLabel>\n <Input \n type=\"password\" \n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n placeholder=\"Zadejte heslo znovu\"\n size=\"lg\"\n />\n </FormControl>\n \n <Button \n type=\"submit\" \n colorScheme=\"blue\" \n size=\"lg\"\n isLoading={isLoading}\n loadingText=\"Ukládání...\"\n isDisabled={!newPassword || newPassword !== confirmPassword}\n >\n Nastavit nové heslo\n </Button>\n </VStack>\n );\n \n case 'success':\n return (\n <VStack spacing={6} textAlign=\"center\">\n <Box p={4} bg=\"green.50\" borderRadius=\"md\" width=\"100%\">\n <Text color=\"green.800\" fontWeight=\"medium\">\n Vaše heslo bylo úspěšně změněno!\n </Text>\n </Box>\n <Text>\n Nyní se můžete přihlásit pomocí svého nového hesla.\n </Text>\n <Button \n as=\"a\" \n href=\"/login\" \n colorScheme=\"blue\" \n size=\"lg\"\n width=\"100%\"\n >\n Přejít na přihlášení\n </Button>\n </VStack>\n );\n \n default:\n return null;\n }\n };\n\n return (\n <Box minH=\"100vh\" display=\"flex\" alignItems=\"center\" justifyContent=\"center\" bg=\"gray.50\" p={4}>\n <Box w=\"100%\" maxW=\"md\" p={8} bg=\"white\" borderWidth={1} borderRadius={8} boxShadow=\"lg\">\n {renderStep()}\n </Box>\n </Box>\n );\n};\n\nexport default ForgotPasswordPage;\n","import { Box, Heading, Text, HStack, Button, ButtonProps, useColorModeValue, VStack, Icon, Flex, Badge } from '@chakra-ui/react';\nimport { ReactElement, ReactNode } from 'react';\n\ninterface PageHeaderProps {\n title: string;\n description?: string;\n icon?: any; // Icon component\n badge?: {\n label: string;\n colorScheme?: string;\n };\n action?: {\n label: string;\n icon?: ReactElement;\n onClick: () => void;\n colorScheme?: ButtonProps['colorScheme'];\n isLoading?: boolean;\n isDisabled?: boolean;\n };\n children?: ReactNode;\n}\n\nexport const PageHeader = ({\n title,\n description,\n icon,\n badge,\n action,\n children,\n}: PageHeaderProps) => {\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const iconBg = useColorModeValue('blue.50', 'blue.900');\n const iconColor = useColorModeValue('blue.600', 'blue.300');\n \n return (\n <Box \n mb={8} \n pb={6} \n borderBottomWidth=\"1px\" \n borderColor={borderColor}\n >\n <Flex justify=\"space-between\" align=\"flex-start\" wrap=\"wrap\" gap={4}>\n <HStack spacing={4} align=\"flex-start\" flex={1}>\n {icon && (\n <Box \n p={3} \n bg={iconBg} \n borderRadius=\"xl\"\n display={{ base: 'none', md: 'block' }}\n >\n <Icon as={icon} boxSize={6} color={iconColor} />\n </Box>\n )}\n <VStack align=\"flex-start\" spacing={2} flex={1}>\n <HStack spacing={3} wrap=\"wrap\">\n <Heading \n size=\"xl\" \n fontWeight=\"extrabold\"\n bgGradient={useColorModeValue(\n 'linear(to-r, gray.800, gray.600)',\n 'linear(to-r, white, gray.300)'\n )}\n bgClip=\"text\"\n >\n {title}\n </Heading>\n {badge && (\n <Badge \n colorScheme={badge.colorScheme || 'blue'} \n fontSize=\"sm\" \n px={3} \n py={1} \n borderRadius=\"full\"\n >\n {badge.label}\n </Badge>\n )}\n </HStack>\n {description && (\n <Text \n color={useColorModeValue('gray.600', 'gray.400')}\n fontSize=\"md\"\n maxW=\"2xl\"\n >\n {description}\n </Text>\n )}\n </VStack>\n </HStack>\n \n {action && (\n <Button\n leftIcon={action.icon}\n onClick={action.onClick}\n colorScheme={action.colorScheme || 'blue'}\n isLoading={action.isLoading}\n isDisabled={action.isDisabled}\n size=\"lg\"\n shadow=\"sm\"\n _hover={{ shadow: 'md', transform: 'translateY(-1px)' }}\n transition=\"all 0.2s\"\n >\n {action.label}\n </Button>\n )}\n </Flex>\n \n {children}\n </Box>\n );\n};\n","import React, { useEffect, useMemo, useState } from 'react';\nimport {\n Box,\n Button,\n Flex,\n HStack,\n IconButton,\n Input,\n Table,\n Tbody,\n Td,\n Text,\n Th,\n Thead,\n Tr,\n useToast,\n VStack,\n Badge,\n useColorModeValue,\n} from '@chakra-ui/react';\nimport { FiTrash2, FiSave, FiRefreshCcw, FiDownload, FiEdit3, FiMove } from 'react-icons/fi';\nimport {\n CompetitionAlias,\n getCompetitionAliasesAdmin,\n upsertCompetitionAlias,\n deleteCompetitionAlias,\n reorderCompetitionAliases,\n} from '../../services/competitionAliases';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport { PageHeader } from '../../components/admin/PageHeader';\nimport { useConfirmDialog } from '../../contexts/ConfirmDialogContext';\nimport { API_URL } from '../../services/api';\n\nconst CompetitionAliasesAdminPage: React.FC = () => {\n const cardBg = useColorModeValue('white', 'gray.800');\n const toast = useToast();\n const [items, setItems] = useState<CompetitionAlias[]>([]);\n const [loading, setLoading] = useState<boolean>(false);\n const [editing, setEditing] = useState<Record<string, { alias: string }>>({});\n const [draggedIndex, setDraggedIndex] = useState<number | null>(null);\n const [reorderMode, setReorderMode] = useState<boolean>(false);\n const { confirm } = useConfirmDialog();\n\n const load = async () => {\n setLoading(true);\n try {\n const data = await getCompetitionAliasesAdmin();\n setItems(data || []);\n } catch (e: any) {\n toast({ title: 'Chyba při načítání', description: e?.message || 'Nelze načíst aliasy', status: 'error' });\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n // Load current aliases, then silently try to import missing ones from FACR cache\n load().then(async () => {\n await importFromFacrAuto();\n });\n }, []);\n\n const importFromFacr = async () => {\n setLoading(true);\n try {\n // Attempt to fetch cache JSON served by backend/static\n const resolveBackendUrl = (path: string) => {\n try {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (path.startsWith('/cache') || path.startsWith('/uploads')) {\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n return new URL(path, origin).toString();\n }\n return path;\n } catch {\n return path;\n }\n };\n\n const url = resolveBackendUrl('/cache/prefetch/facr_club_info.json');\n const res = await fetch(url, { cache: 'no-cache' });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const data = await res.json();\n const comps: Array<{ id?: string; code?: string; name?: string }> = Array.isArray(data?.competitions) ? data.competitions : [];\n // Fetch fresh aliases to avoid using potentially stale state\n const latest = await getCompetitionAliasesAdmin();\n const existing = new Set((latest || []).map(i => i.code));\n const missing = comps\n .map(c => ({ code: String(c.code || c.id || '').trim(), name: String(c.name || '').trim() }))\n .filter(c => c.code);\n const newOnes = missing.filter(c => !existing.has(c.code));\n if (!newOnes.length) {\n toast({ title: 'Žádné nové soutěže', description: 'Všechny soutěže již mají alias.', status: 'info' });\n return;\n }\n // Bulk upsert with alias defaulting to competition name\n await Promise.all(newOnes.map(c => upsertCompetitionAlias(c.code, { alias: c.name || c.code, original_name: c.name || undefined })));\n await load();\n toast({ title: 'Import dokončen', description: `Přidáno: ${newOnes.length}`, status: 'success' });\n } catch (e: any) {\n toast({ title: 'Import selhal', description: e?.message || 'Nelze načíst FACR soutěže', status: 'error' });\n } finally {\n setLoading(false);\n }\n };\n\n // Silent auto-import on mount: upserts only when missing; minimal toast\n const importFromFacrAuto = async () => {\n try {\n const resolveBackendUrl = (path: string) => {\n try {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (path.startsWith('/cache') || path.startsWith('/uploads')) {\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n return new URL(path, origin).toString();\n }\n return path;\n } catch {\n return path;\n }\n };\n\n const url = resolveBackendUrl('/cache/prefetch/facr_club_info.json');\n const res = await fetch(url, { cache: 'no-cache' });\n if (!res.ok) return; // silent\n const data = await res.json();\n const comps: Array<{ id?: string; code?: string; name?: string }> = Array.isArray(data?.competitions) ? data.competitions : [];\n const latest = await getCompetitionAliasesAdmin();\n const existing = new Set((latest || []).map(i => i.code));\n const missing = comps\n .map(c => ({ code: String(c.code || c.id || '').trim(), name: String(c.name || '').trim() }))\n .filter(c => c.code);\n const newOnes = missing.filter(c => !existing.has(c.code));\n if (!newOnes.length) return;\n await Promise.all(newOnes.map(c => upsertCompetitionAlias(c.code, { alias: c.name || c.code, original_name: c.name || undefined })));\n await load();\n toast({ title: 'Alias soutěží doplněny', description: `Přidáno: ${newOnes.length}`, status: 'success', duration: 3000 });\n } catch {\n // silent on auto\n }\n };\n\n const onSave = async (code: string) => {\n const data = editing[code];\n if (!data) return;\n if (!data.alias?.trim()) {\n toast({ title: 'Alias je povinný', status: 'warning' });\n return;\n }\n try {\n // Preserve original_name if present on the existing item to avoid losing it on edit\n const existing = items.find((i) => i.code === code);\n const payload: { alias: string; original_name?: string } = { alias: data.alias.trim() };\n if (existing?.original_name) payload.original_name = existing.original_name;\n const saved = await upsertCompetitionAlias(code, payload);\n setItems((prev) => prev.map((i) => (i.code === code ? saved : i)));\n setEditing((prev) => { const n = { ...prev }; delete n[code]; return n; });\n toast({ title: 'Uloženo', status: 'success' });\n } catch (e: any) {\n toast({ title: 'Uložení selhalo', description: e?.message || 'Zkuste znovu', status: 'error' });\n }\n };\n\n const onDelete = async (code: string) => {\n const ok = await confirm({\n title: 'Smazat alias',\n message: `Smazat alias pro soutěž ${code}?`,\n confirmText: 'Smazat',\n cancelText: 'Zrušit',\n isDanger: true,\n });\n if (!ok) return;\n try {\n await deleteCompetitionAlias(code);\n setItems((prev) => prev.filter((i) => i.code !== code));\n setEditing((prev) => { const n = { ...prev }; delete n[code]; return n; });\n toast({ title: 'Smazáno', status: 'success' });\n } catch (e: any) {\n toast({ title: 'Smazání selhalo', description: e?.message || 'Zkuste znovu', status: 'error' });\n }\n };\n\n // In reorder mode, show items as-is (ordered by display_order from backend)\n // In normal mode, sort by code for editing\n const sorted = useMemo(() => {\n if (!items) return [];\n if (reorderMode) return items;\n\n const normalizeOrder = (value?: number) => {\n if (!value || value <= 0) return Number.MAX_SAFE_INTEGER;\n return value;\n };\n\n return [...items].sort((a, b) => {\n const orderA = normalizeOrder(a.display_order);\n const orderB = normalizeOrder(b.display_order);\n if (orderA !== orderB) return orderA - orderB;\n return a.code.localeCompare(b.code);\n });\n }, [items, reorderMode]);\n\n const onSaveAll = async () => {\n const entries = Object.entries(editing);\n if (!entries.length) {\n toast({ title: 'Nic k uložení', status: 'info' });\n return;\n }\n setLoading(true);\n try {\n // Validate\n for (const [code, data] of entries) {\n if (!data?.alias?.trim()) {\n throw new Error(`Alias je povinný pro ${code}`);\n }\n }\n // Save all in parallel\n // When saving multiple edits, preserve original_name from existing items where available\n const savedList = await Promise.all(\n entries.map(([code, data]) => {\n const existing = items.find((i) => i.code === code);\n const payload: { alias: string; original_name?: string } = { alias: data.alias.trim() };\n if (existing?.original_name) payload.original_name = existing.original_name;\n return upsertCompetitionAlias(code, payload);\n })\n );\n // Merge into items\n setItems((prev) => {\n const map = new Map(prev.map((i) => [i.code, i] as const));\n for (const s of savedList) map.set(s.code, s);\n return Array.from(map.values()).sort((a, b) => a.code.localeCompare(b.code));\n });\n setEditing({});\n toast({ title: 'Vše uloženo', status: 'success' });\n } catch (e: any) {\n toast({ title: 'Hromadné uložení selhalo', description: e?.message || 'Zkuste znovu', status: 'error' });\n } finally {\n setLoading(false);\n }\n };\n\n const hasChanges = Object.keys(editing).length > 0;\n\n // Drag-and-drop handlers\n const handleDragStart = (e: React.DragEvent<HTMLTableRowElement>, index: number) => {\n setDraggedIndex(index);\n e.dataTransfer.effectAllowed = 'move';\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLTableRowElement>, index: number) => {\n e.preventDefault();\n if (draggedIndex === null || draggedIndex === index) return;\n \n // Reorder items array\n const newItems = [...items];\n const draggedItem = newItems[draggedIndex];\n newItems.splice(draggedIndex, 1);\n newItems.splice(index, 0, draggedItem);\n \n setItems(newItems);\n setDraggedIndex(index);\n };\n\n const handleDragEnd = () => {\n setDraggedIndex(null);\n };\n\n const saveReorder = async () => {\n setLoading(true);\n try {\n // Assign display_order based on current position (1-indexed)\n const reordered = items.map((item, idx) => ({\n code: item.code,\n display_order: idx + 1,\n }));\n await reorderCompetitionAliases(reordered);\n toast({ title: 'Pořadí uloženo', status: 'success' });\n setReorderMode(false);\n await load();\n } catch (e: any) {\n toast({ title: 'Chyba při ukládání pořadí', description: e?.message || 'Zkuste znovu', status: 'error' });\n } finally {\n setLoading(false);\n }\n };\n\n const cancelReorder = () => {\n setReorderMode(false);\n load(); // Reload to reset order\n };\n\n return (\n <AdminLayout requireAdmin={false}>\n <Box maxW=\"1400px\" mx=\"auto\">\n <PageHeader\n title=\"Alias soutěží\"\n description=\"Spravujte zobrazované názvy soutěží. Můžete je importovat z cache (FACR) a upravit aliasy.\"\n />\n\n {/* Action Bar */}\n <Flex \n align=\"center\" \n justify=\"space-between\" \n mb={6} \n wrap=\"wrap\" \n gap={3}\n bg={cardBg}\n p={4}\n borderRadius=\"lg\"\n shadow=\"sm\"\n borderWidth=\"1px\"\n borderColor=\"gray.200\"\n >\n <HStack spacing={3}>\n {!reorderMode ? (\n <>\n <Button \n leftIcon={<FiRefreshCcw />} \n onClick={load} \n isLoading={loading} \n variant=\"outline\"\n size=\"md\"\n _hover={{ bg: 'gray.50', borderColor: 'gray.400' }}\n >\n Obnovit\n </Button>\n <Button \n leftIcon={<FiSave />} \n onClick={onSaveAll} \n isDisabled={!hasChanges} \n isLoading={loading} \n colorScheme=\"green\"\n size=\"md\"\n variant={hasChanges ? 'solid' : 'outline'}\n _hover={hasChanges ? { bg: 'green.600' } : {}}\n >\n Uložit vše {hasChanges && <Badge ml={2} colorScheme=\"green\" variant=\"solid\">{Object.keys(editing).length}</Badge>}\n </Button>\n <Button \n leftIcon={<FiMove />} \n onClick={() => setReorderMode(true)} \n isLoading={loading} \n colorScheme=\"purple\"\n size=\"md\"\n variant=\"outline\"\n _hover={{ bg: 'purple.50', borderColor: 'purple.400' }}\n >\n Změnit pořadí\n </Button>\n </>\n ) : (\n <>\n <Button \n leftIcon={<FiSave />} \n onClick={saveReorder} \n isLoading={loading} \n colorScheme=\"green\"\n size=\"md\"\n >\n Uložit pořadí\n </Button>\n <Button \n onClick={cancelReorder} \n isDisabled={loading} \n variant=\"outline\"\n size=\"md\"\n >\n Zrušit\n </Button>\n </>\n )}\n </HStack>\n {!reorderMode && (\n <Button \n leftIcon={<FiDownload />} \n onClick={importFromFacr} \n isLoading={loading} \n colorScheme=\"blue\"\n size=\"md\"\n shadow=\"sm\"\n >\n Importovat ze soutěží\n </Button>\n )}\n </Flex>\n\n {/* Table Section */}\n <Box \n bg={cardBg} \n borderWidth=\"1px\" \n borderColor=\"gray.200\"\n borderRadius=\"lg\" \n overflow=\"hidden\"\n shadow=\"sm\"\n >\n <Box overflowX=\"auto\">\n <Table variant=\"simple\" size=\"md\">\n <Thead bg={useColorModeValue('gray.50', 'gray.900')}>\n <Tr>\n {reorderMode && (\n <Th width=\"60px\" textTransform=\"uppercase\" fontSize=\"xs\" fontWeight=\"bold\" color=\"gray.600\" letterSpacing=\"wide\">\n Pořadí\n </Th>\n )}\n <Th \n width=\"200px\" \n textTransform=\"uppercase\" \n fontSize=\"xs\" \n fontWeight=\"bold\" \n color=\"gray.600\"\n letterSpacing=\"wide\"\n >\n Kód\n </Th>\n {!reorderMode && (\n <>\n <Th \n textTransform=\"uppercase\" \n fontSize=\"xs\" \n fontWeight=\"bold\" \n color=\"gray.600\"\n letterSpacing=\"wide\"\n >\n Původní název\n </Th>\n <Th \n textTransform=\"uppercase\" \n fontSize=\"xs\" \n fontWeight=\"bold\" \n color=\"gray.600\"\n letterSpacing=\"wide\"\n >\n Alias\n </Th>\n <Th \n isNumeric\n textTransform=\"uppercase\" \n fontSize=\"xs\" \n fontWeight=\"bold\" \n color=\"gray.600\"\n letterSpacing=\"wide\"\n >\n Akce\n </Th>\n </>\n )}\n {reorderMode && (\n <Th \n textTransform=\"uppercase\" \n fontSize=\"xs\" \n fontWeight=\"bold\" \n color=\"gray.600\"\n letterSpacing=\"wide\"\n >\n Alias\n </Th>\n )}\n </Tr>\n </Thead>\n <Tbody>\n {sorted.map((it, idx) => {\n const ed = editing[it.code] ?? { alias: it.alias };\n const isEdited = editing[it.code] !== undefined;\n \n if (reorderMode) {\n // Reorder mode: simplified draggable row\n return (\n <Tr \n key={it.code}\n draggable\n onDragStart={(e) => handleDragStart(e, idx)}\n onDragOver={(e) => handleDragOver(e, idx)}\n onDragEnd={handleDragEnd}\n cursor=\"move\"\n bg={draggedIndex === idx ? 'blue.50' : undefined}\n _hover={{ bg: 'gray.100' }}\n transition=\"background 0.15s\"\n opacity={draggedIndex === idx ? 0.5 : 1}\n >\n <Td>\n <HStack spacing={2}>\n <Box as={FiMove} color=\"gray.500\" />\n <Text fontWeight=\"bold\" color=\"gray.700\">{idx + 1}</Text>\n </HStack>\n </Td>\n <Td>\n <Badge \n colorScheme=\"blue\" \n variant=\"subtle\" \n fontFamily=\"mono\" \n fontSize=\"sm\"\n px={2}\n py={1}\n >\n {it.code}\n </Badge>\n </Td>\n <Td>\n <Text fontSize=\"sm\" fontWeight=\"medium\">{it.alias}</Text>\n </Td>\n </Tr>\n );\n }\n \n // Edit mode: full editing capabilities\n return (\n <Tr \n key={it.code}\n _hover={{ bg: 'gray.50' }}\n transition=\"background 0.15s\"\n >\n <Td>\n <HStack>\n <Badge \n colorScheme=\"blue\" \n variant=\"subtle\" \n fontFamily=\"mono\" \n fontSize=\"sm\"\n px={2}\n py={1}\n >\n {it.code}\n </Badge>\n {isEdited && (\n <Box as={FiEdit3} color=\"orange.500\" size={14} />\n )}\n </HStack>\n </Td>\n <Td>\n <Text fontSize=\"sm\" color=\"gray.600\" fontWeight=\"medium\">\n {it.original_name || <Text as=\"span\" color=\"gray.400\">—</Text>}\n </Text>\n </Td>\n <Td>\n <Input \n size=\"md\" \n value={ed.alias} \n onChange={(e) => setEditing((prev) => ({ ...prev, [it.code]: { alias: e.target.value } }))} \n bg={isEdited ? 'orange.50' : 'white'}\n borderColor={isEdited ? 'orange.300' : 'gray.200'}\n _hover={{ borderColor: isEdited ? 'orange.400' : 'blue.300', bg: 'white' }}\n _focus={{ borderColor: 'blue.500', bg: 'white', shadow: 'sm' }}\n fontWeight=\"medium\"\n />\n </Td>\n <Td isNumeric>\n <HStack justify=\"flex-end\" spacing={2}>\n <IconButton \n aria-label=\"Uložit\" \n icon={<FiSave />} \n size=\"sm\" \n onClick={() => onSave(it.code)}\n colorScheme=\"green\"\n variant=\"ghost\"\n _hover={{ bg: 'green.50' }}\n />\n <IconButton \n aria-label=\"Smazat\" \n icon={<FiTrash2 />} \n size=\"sm\" \n colorScheme=\"red\" \n variant=\"ghost\"\n _hover={{ bg: 'red.50' }}\n onClick={() => onDelete(it.code)} \n />\n </HStack>\n </Td>\n </Tr>\n );\n })}\n {sorted.length === 0 && (\n <Tr>\n <Td colSpan={4}>\n <VStack py={12} spacing={3}>\n <Box color=\"gray.300\" fontSize=\"4xl\">\n <FiEdit3 />\n </Box>\n <Text color=\"gray.500\" fontSize=\"md\" fontWeight=\"medium\">\n Žádné aliasy zatím nejsou\n </Text>\n <Text color=\"gray.400\" fontSize=\"sm\">\n Importujte ze soutěží (FACR) pomocí tlačítka nahoře\n </Text>\n </VStack>\n </Td>\n </Tr>\n )}\n </Tbody>\n </Table>\n </Box>\n </Box>\n\n {/* Summary Footer */}\n {sorted.length > 0 && (\n <Box \n mt={4} \n p={4} \n bg={useColorModeValue('gray.50', 'gray.900')} \n borderRadius=\"md\" \n borderWidth=\"1px\"\n borderColor=\"gray.200\"\n >\n <HStack justify=\"space-between\" wrap=\"wrap\">\n <Text fontSize=\"sm\" color=\"gray.600\">\n Celkem aliasů: <Badge colorScheme=\"blue\" ml={1}>{sorted.length}</Badge>\n </Text>\n {hasChanges && (\n <HStack spacing={2}>\n <Badge colorScheme=\"orange\" variant=\"subtle\">\n {Object.keys(editing).length} neuložených změn\n </Badge>\n <Button \n size=\"sm\" \n colorScheme=\"green\" \n onClick={onSaveAll}\n leftIcon={<FiSave />}\n >\n Uložit vše\n </Button>\n </HStack>\n )}\n </HStack>\n </Box>\n )}\n </Box>\n </AdminLayout>\n );\n};\n\nexport default CompetitionAliasesAdminPage;\n","import { useState } from 'react';\nimport { \n Box, \n Button, \n Flex, \n FormControl, \n FormErrorMessage, \n Input, \n Text, \n useToast,\n VStack,\n useColorModeValue\n} from '@chakra-ui/react';\nimport { useForm } from 'react-hook-form';\nimport { subscribeToNewsletter } from '../../services/public';\nimport { trackNewsletterSubscribe, trackFormSubmit } from '../../utils/umami';\nimport { useTranslation } from 'react-i18next';\n\ntype FormData = {\n email: string;\n};\n\nexport default function NewsletterSubscribe() {\n const { t } = useTranslation();\n const [isLoading, setIsLoading] = useState(false);\n const toast = useToast();\n const {\n register,\n handleSubmit,\n reset,\n formState: { errors },\n } = useForm<FormData>();\n\n const onSubmit = async (data: FormData) => {\n setIsLoading(true);\n try {\n await subscribeToNewsletter(data.email);\n \n // Track successful newsletter subscription\n trackNewsletterSubscribe(window.location.pathname);\n trackFormSubmit('Newsletter Subscribe', true);\n \n toast({\n title: t('newsletter.subscribe_success'),\n description: t('newsletter.subscribe_success_desc'),\n status: 'success',\n duration: 7000,\n isClosable: true,\n });\n try { window.dispatchEvent(new CustomEvent('engagement:refresh')); } catch {}\n reset();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : t('newsletter.subscribe_error_desc');\n \n // Track failed subscription\n trackFormSubmit('Newsletter Subscribe', false);\n \n toast({\n title: t('newsletter.subscribe_error'),\n description: errorMessage,\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n } finally {\n setIsLoading(false);\n }\n };\n \n const headingColor = useColorModeValue('gray.800', 'white');\n const textColor = useColorModeValue('gray.600', 'gray.300');\n const disclaimerColor = useColorModeValue('gray.500', 'gray.400');\n\n return (\n <Box w=\"100%\" maxW=\"xl\" mx=\"auto\" p={4}>\n <VStack spacing={3} align=\"stretch\">\n <Text fontSize=\"xl\" fontWeight=\"bold\" textAlign=\"center\" color={headingColor}>\n {t('newsletter.subscribe')}\n </Text>\n <Text textAlign=\"center\" color={textColor} mb={2}>\n {t('newsletter.subscribe_description')}\n </Text>\n \n <form onSubmit={handleSubmit(onSubmit)}>\n <VStack spacing={3}>\n <FormControl isInvalid={!!errors.email}>\n <Input\n id=\"email\"\n type=\"email\"\n placeholder={t('newsletter.email_label')}\n autoComplete=\"email\"\n {...register('email', {\n required: t('newsletter.email_required'),\n pattern: {\n value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i,\n message: t('newsletter.email_invalid'),\n },\n })}\n size=\"md\"\n disabled={isLoading}\n />\n <FormErrorMessage>\n {errors.email && errors.email.message}\n </FormErrorMessage>\n </FormControl>\n \n <Button\n type=\"submit\"\n colorScheme=\"blue\"\n size=\"md\"\n width=\"100%\"\n isLoading={isLoading}\n loadingText={t('newsletter.loading')}\n data-umami-event=\"Newsletter Submit\"\n data-umami-event-location={window.location.pathname}\n >\n {t('newsletter.subscribe_button')}\n </Button>\n </VStack>\n </form>\n \n <Text fontSize=\"xs\" color={disclaimerColor} textAlign=\"center\" mt={2}>\n {t('newsletter.consent_text')}\n </Text>\n </VStack>\n </Box>\n );\n}\n","import React from 'react';\nimport {\n Box,\n Text,\n HStack,\n Stack,\n Popover,\n PopoverTrigger,\n PopoverContent,\n PopoverBody,\n PopoverArrow,\n useColorModeValue,\n Portal,\n Icon,\n} from '@chakra-ui/react';\nimport { CheckCircleIcon, InfoOutlineIcon } from '@chakra-ui/icons';\n\nexport interface HelpTooltipCardProps {\n label: string;\n title: string;\n items?: string[];\n showStrengthBars?: boolean;\n}\n\n/**\n * HelpTooltipCard\n *\n * Reusable rich tooltip/popover used for contextual help next to form fields.\n * Triggered by a small pill with label text; shows a card with colored bars\n * and a checklist inside, visually similar to password requirement examples.\n */\nexport const HelpTooltipCard: React.FC<HelpTooltipCardProps> = ({ label, title, items, showStrengthBars = false }) => {\n const bg = useColorModeValue('white', 'gray.800');\n const border = useColorModeValue('gray.200', 'gray.700');\n const pillBg = useColorModeValue('white', 'gray.700');\n const pillBorder = useColorModeValue('gray.200', 'gray.600');\n const iconColor = useColorModeValue('gray.600', 'gray.200');\n\n return (\n <Popover trigger=\"hover\" openDelay={150} closeDelay={100} placement=\"right-start\">\n <PopoverTrigger>\n <Box\n as=\"button\"\n type=\"button\"\n borderRadius=\"full\"\n bg={pillBg}\n borderWidth=\"1px\"\n borderColor={pillBorder}\n boxShadow=\"sm\"\n fontSize=\"xs\"\n fontWeight=\"medium\"\n _hover={{ boxShadow: 'md', transform: 'translateY(-1px)' }}\n transition=\"all 0.15s ease-out\"\n display=\"inline-flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n w=\"18px\"\n h=\"18px\"\n aria-label={label}\n >\n <Icon as={InfoOutlineIcon} boxSize={3} color={iconColor} />\n </Box>\n </PopoverTrigger>\n <Portal>\n <PopoverContent\n maxW=\"sm\"\n bg={bg}\n borderColor={border}\n boxShadow=\"2xl\"\n borderRadius=\"xl\"\n _focus={{ boxShadow: '2xl' }}\n >\n <PopoverArrow />\n <PopoverBody p={4}>\n <Stack spacing={3}>\n {showStrengthBars && (\n <HStack spacing={1.5}>\n <Box flex=\"1\" h=\"2px\" borderRadius=\"full\" bg=\"red.400\" />\n <Box flex=\"1\" h=\"2px\" borderRadius=\"full\" bg=\"orange.400\" />\n <Box flex=\"1\" h=\"2px\" borderRadius=\"full\" bg=\"green.400\" />\n </HStack>\n )}\n\n <Text fontSize=\"sm\" fontWeight=\"semibold\">\n {title}\n </Text>\n\n {items && items.length > 0 && (\n <Stack as=\"ul\" spacing={1.5} pl={0} m={0} style={{ listStyle: 'none' }}>\n {items.map((item) => (\n <HStack as=\"li\" key={item} align=\"flex-start\" spacing={2}>\n <Icon as={CheckCircleIcon} color=\"green.400\" boxSize={3.5} mt={0.5} />\n <Text fontSize=\"sm\" color=\"gray.700\" _dark={{ color: 'gray.200' }}>\n {item}\n </Text>\n </HStack>\n ))}\n </Stack>\n )}\n </Stack>\n </PopoverBody>\n </PopoverContent>\n </Portal>\n </Popover>\n );\n};\n\nexport const PasswordHelpTooltip: React.FC<{ label?: string }> = ({ label = 'Požadavky na heslo' }) => {\n return (\n <HelpTooltipCard\n label={label}\n title=\"Silné heslo by mělo obsahovat:\"\n items={[\n 'Minimálně 8 znaků (povinné)',\n 'Kombinaci malých a velkých písmen',\n 'Čísla a ideálně speciální znaky',\n ]}\n showStrengthBars\n />\n );\n};\n\nexport default HelpTooltipCard;\n","import {\n Box,\n Button,\n Heading,\n HStack,\n IconButton,\n Image,\n Input,\n Link,\n Modal,\n ModalBody,\n ModalCloseButton,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalOverlay,\n Table,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n FormControl,\n FormLabel,\n Switch,\n useDisclosure,\n useToast,\n VStack,\n useColorModeValue,\n Text,\n Select,\n NumberInput,\n NumberInputField,\n Badge,\n} from '@chakra-ui/react';\nimport { useState } from 'react';\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { FiEdit2, FiPlus, FiTrash2, FiUpload, FiExternalLink } from 'react-icons/fi';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport { useConfirmDialog } from '../../contexts/ConfirmDialogContext';\nimport { Sponsor, getSponsors, createSponsor, updateSponsor, deleteSponsor } from '../../services/sponsors';\nimport { API_URL } from '../../services/api';\nimport UploadPanel from '../../components/common/UploadPanel';\n\nconst SponsorsAdminPage: React.FC = () => {\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const inputBg = useColorModeValue('white', 'gray.700');\n const normalizeImageUrl = (url?: string) => {\n if (!url || url === '') return '/sponsor-placeholder.svg';\n if (/^https?:\\/\\//i.test(url)) return url;\n const origin = new URL(API_URL, window.location.origin).origin;\n if (url.startsWith('/uploads/')) return `${origin}${url}`;\n return `${origin}${url.startsWith('/') ? '' : '/'}${url}`;\n };\n const toast = useToast();\n const qc = useQueryClient();\n const { data, isLoading } = useQuery({ queryKey: ['admin-sponsors'], queryFn: getSponsors });\n\n const [editing, setEditing] = useState<Partial<Sponsor> | null>(null);\n const { isOpen, onOpen, onClose } = useDisclosure();\n const { confirm } = useConfirmDialog();\n\n const openCreate = () => { setEditing({ name: '', is_active: true, tier: 'standard', display_order: 0 }); onOpen(); };\n const openEdit = (s: Sponsor) => { setEditing({ ...s }); onOpen(); };\n const closeModal = () => { setEditing(null); onClose(); };\n\n const createMut = useMutation({\n mutationFn: (payload: any) => createSponsor(payload),\n onSuccess: (created: any) => {\n // If backend returned the created sponsor, merge into cache for immediate UI update\n try {\n qc.setQueryData(['admin-sponsors'], (old: any) => {\n const list = Array.isArray(old) ? old : (old?.data || []);\n const newList = [created, ...list];\n // if cache shape is { data, total, page }, attempt to preserve\n if (old && old.data) return { ...old, data: newList };\n return newList;\n });\n } catch (e) {\n // ignore cache update errors\n }\n toast({ title: 'Sponzor vytvořen', status: 'success' });\n qc.invalidateQueries({ queryKey: ['admin-sponsors'] });\n closeModal();\n },\n onError: (e: any) => toast({ title: 'Vytvoření selhalo', description: e?.response?.data?.chyba || 'Chyba', status: 'error' }),\n });\n const updateMut = useMutation({\n mutationFn: ({ id, payload }: { id: number | string; payload: any }) => updateSponsor(id, payload),\n onSuccess: (updated: any) => {\n // Optimistically merge returned sponsor into cache to avoid transient undefined fields\n try {\n qc.setQueryData(['admin-sponsors'], (old: any) => {\n const list = Array.isArray(old) ? old : (old?.data || []);\n const newList = (list || []).map((it: any) => (it?.id === updated?.id ? { ...it, ...updated } : it));\n if (old && old.data) return { ...old, data: newList };\n return newList;\n });\n } catch {}\n toast({ title: 'Sponzor aktualizován', status: 'success' });\n qc.invalidateQueries({ queryKey: ['admin-sponsors'] });\n closeModal();\n },\n onError: (e: any) => toast({ title: 'Aktualizace selhala', description: e?.response?.data?.chyba || 'Chyba', status: 'error' }),\n });\n const deleteMut = useMutation({\n mutationFn: (id: number) => deleteSponsor(id),\n onSuccess: () => { toast({ title: 'Sponzor smazán', status: 'success' }); qc.invalidateQueries({ queryKey: ['admin-sponsors'] }); },\n onError: (e: any) => toast({ title: 'Smazání selhalo', description: e?.response?.data?.chyba || 'Chyba', status: 'error' }),\n });\n\n const onSubmit = async () => {\n if (!editing) return;\n const payload = {\n name: editing.name || '',\n website_url: editing.website_url || '',\n logo_url: editing.logo_url || '',\n is_active: editing.is_active ?? true,\n tier: editing.tier || 'standard',\n display_order: editing.display_order ?? 0,\n };\n if ((editing as any).id != null) {\n await updateMut.mutateAsync({ id: (editing as any).id, payload });\n } else {\n await createMut.mutateAsync(payload);\n }\n };\n\n const toggleActive = async (s: Sponsor) => {\n if (s.id == null) return;\n try {\n await updateMut.mutateAsync({ id: s.id, payload: { is_active: !s.is_active } });\n toast({ title: 'Stav sponzora aktualizován', status: 'success' });\n } catch (err) {\n toast({ title: 'Aktualizace selhala', status: 'error' });\n }\n };\n\n return (\n <AdminLayout requireAdmin={false}>\n <Box>\n <HStack justify=\"space-between\" mb={4}>\n <Heading size=\"lg\">Správa sponzorů</Heading>\n <Button leftIcon={<FiPlus />} colorScheme=\"blue\" onClick={openCreate}>\n Nový sponzor\n </Button>\n </HStack>\n <Text color=\"gray.500\" mb={6}>\n Správa sponzorů a partnerů klubu. Můžete přidávat, upravovat a odebírat sponzory, kteří se zobrazují na webu.\n </Text>\n\n <Box\n bg={useColorModeValue('white', 'gray.800')}\n borderWidth=\"1px\"\n borderRadius=\"lg\"\n overflowX=\"auto\"\n boxShadow=\"sm\"\n mb={6}\n >\n <Table size=\"sm\">\n <Thead>\n <Tr>\n <Th w=\"80px\">Logo</Th>\n <Th>Název</Th>\n <Th>Úroveň</Th>\n <Th>Pořadí</Th>\n <Th>Web</Th>\n <Th w=\"120px\">Aktivní</Th>\n <Th w=\"160px\">Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {isLoading && (<Tr><Td colSpan={7}>Načítám...</Td></Tr>)}\n {!isLoading && (data || []).map((s) => (\n <Tr key={s.id} opacity={s.is_active ? 1 : 0.6}>\n <Td>\n <Image src={normalizeImageUrl(s.logo_url)} alt={s.name} boxSize=\"48px\" objectFit=\"contain\" />\n </Td>\n <Td>{s.name}</Td>\n <Td>\n <Badge colorScheme={s.tier === 'general' ? 'green' : 'blue'}>\n {s.tier === 'general' ? 'Hlavní partner' : 'Partner'}\n </Badge>\n </Td>\n <Td>{s.display_order ?? 0}</Td>\n <Td>\n {s.website_url ? (\n <HStack>\n <Link href={s.website_url} color=\"blue.500\" isExternal fontSize=\"sm\">{s.website_url}</Link>\n <FiExternalLink />\n </HStack>\n ) : '-'}\n </Td>\n <Td>\n <Switch isChecked={!!s.is_active} onChange={() => toggleActive(s)} />\n </Td>\n <Td>\n <HStack spacing={2}>\n <IconButton\n aria-label=\"Upravit\"\n icon={<FiEdit2 />}\n size=\"sm\"\n onClick={() => openEdit(s)}\n />\n <IconButton\n aria-label=\"Smazat\"\n icon={<FiTrash2 />}\n size=\"sm\"\n colorScheme=\"red\"\n variant=\"outline\"\n onClick={async () => {\n const ok = await confirm({\n title: 'Smazat sponzora',\n message: `Opravdu chcete smazat sponzora \"${s.name}\"?`,\n confirmText: 'Smazat',\n cancelText: 'Zrušit',\n isDanger: true,\n });\n if (!ok) return;\n try {\n await deleteMut.mutateAsync(s.id as number);\n toast({ title: 'Sponzor smazán', status: 'success' });\n } catch (err) {\n toast({ title: 'Smazání sponzora selhalo', status: 'error' });\n }\n }}\n />\n </HStack>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n\n <Modal isOpen={isOpen} onClose={closeModal} size=\"lg\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>{(editing as any)?.id ? 'Upravit sponzora' : 'Nový sponzor'}</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack align=\"stretch\" spacing={4}>\n <FormControl isRequired>\n <FormLabel>Název</FormLabel>\n <Input value={editing?.name || ''} onChange={(e) => setEditing((p) => ({ ...(p as any), name: e.target.value }))} />\n </FormControl>\n <FormControl>\n <FormLabel>Web (URL)</FormLabel>\n <Input value={editing?.website_url || ''} onChange={(e) => setEditing((p) => ({ ...(p as any), website_url: e.target.value }))} />\n </FormControl>\n <FormControl>\n <FormLabel>Logo</FormLabel>\n <VStack align=\"stretch\" spacing={3}>\n <UploadPanel\n label=\"Logo sponzora\"\n description=\"Nahrajte logo sponzora (doporučeno PNG/SVG, max. 10 MB).\"\n accept=\"image/*\"\n multiple={false}\n maxFiles={1}\n allowUrlImport\n urlPlaceholder=\"/uploads/... nebo https://example.com/logo.png\"\n onChange={(files) => {\n const last = files[files.length - 1];\n if (!last) {\n setEditing((prev) => ({ ...(prev || {}), logo_url: '' }));\n return;\n }\n setEditing((prev) => ({ ...(prev || {}), logo_url: last.url || '' }));\n }}\n />\n {editing?.logo_url && (\n <HStack>\n <Image src={normalizeImageUrl(editing.logo_url)} alt=\"logo\" boxSize=\"56px\" objectFit=\"contain\" />\n <Text fontSize=\"sm\" color=\"gray.500\">{editing.logo_url}</Text>\n </HStack>\n )}\n </VStack>\n </FormControl>\n <FormControl>\n <FormLabel>Úroveň partnera</FormLabel>\n <Select value={editing?.tier || 'standard'} onChange={(e) => setEditing((p) => ({ ...(p as any), tier: e.target.value }))}>\n <option value=\"general\">Hlavní partner</option>\n <option value=\"standard\">Partner</option>\n </Select>\n </FormControl>\n <FormControl>\n <FormLabel>Pořadí zobrazení</FormLabel>\n <NumberInput value={editing?.display_order ?? 0} onChange={(val) => setEditing((p) => ({ ...(p as any), display_order: parseInt(val) || 0 }))} min={0}>\n <NumberInputField />\n </NumberInput>\n <Text fontSize=\"xs\" color=\"gray.500\" mt={1}>Menší číslo = vyšší pozice</Text>\n </FormControl>\n <FormControl display=\"flex\" alignItems=\"center\">\n <FormLabel mb=\"0\">Aktivní</FormLabel>\n <Switch isChecked={!!editing?.is_active} onChange={(e) => setEditing((p) => ({ ...(p as any), is_active: e.target.checked }))} />\n </FormControl>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" mr={3} onClick={closeModal}>Zrušit</Button>\n <Button colorScheme=\"blue\" onClick={onSubmit} isLoading={createMut.isLoading || updateMut.isLoading}>Uložit</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </Box>\n </AdminLayout>\n );\n};\n\nexport default SponsorsAdminPage;\n","import { api } from '../api';\n\nexport interface NewsletterSubscriber {\n id: number;\n email: string;\n is_active: boolean;\n created_at: string;\n updated_at: string;\n}\n\nexport interface NewsletterSendData {\n subject: string;\n content: string; // backend accepts either 'content' or 'body'\n}\n\nexport const getNewsletterSubscribers = async (): Promise<NewsletterSubscriber[]> => {\n const response = await api.get<NewsletterSubscriber[]>(`/admin/newsletter/subscribers`);\n return response.data;\n};\n\nexport const sendNewsletter = async (data: NewsletterSendData): Promise<{ message: string }> => {\n // Backend will accept either 'content' or 'body'. We send 'content'.\n const response = await api.post<{ message: string }>(\n `/admin/newsletter/send`,\n {\n subject: data.subject,\n content: data.content,\n },\n // Increase timeout to 60s to accommodate SMTP and bulk send delays\n { timeout: 60000 }\n );\n return response.data;\n};\n\nexport const sendNewsletterTest = async (email?: string): Promise<{ message: string; recipient: string }> => {\n const payload = email ? { email } : {};\n // Allow more time for SMTP connection during test sends\n const response = await api.post<{ message: string; recipient: string }>(\n `/admin/newsletter/test`,\n payload,\n { timeout: 60000 }\n );\n return response.data;\n};\n\nexport type NewsletterTestType = 'newsletter' | 'welcome' | 'welcome_back' | 'blogs' | 'events' | 'matches' | 'scores' | 'weekly';\nexport interface NewsletterTestPayload {\n email?: string;\n emails?: string[];\n type?: NewsletterTestType;\n}\n\nexport type AdminSmtpTestPayload = {\n host: string;\n port: number;\n username?: string;\n password?: string;\n from: string;\n to: string;\n subject?: string;\n body?: string;\n use_tls?: boolean;\n};\n\nexport const adminSendSmtpTest = async (payload: AdminSmtpTestPayload): Promise<{ ok: boolean; message?: string; error?: string }> => {\n const res = await api.post('/admin/newsletter/smtp-test', payload, { timeout: 60000 });\n return res.data;\n};\n\nexport const sendNewsletterTestAdvanced = async (payload: NewsletterTestPayload): Promise<{ message: string; recipients?: string[]; recipient?: string; type: string }> => {\n // Allow more time for SMTP connection during test sends\n const response = await api.post<{ message: string; recipients?: string[]; recipient?: string; type: string }>(\n `/admin/newsletter/test`,\n payload,\n { timeout: 60000 }\n );\n return response.data;\n};\n\nexport interface NewsletterStatus {\n total_subscribers: number;\n active_subscribers: number;\n sample_recipients: string[];\n interval_minutes: number;\n next_approximate: string;\n newsletter_enabled?: boolean;\n // Scheduling detail (optional; provided by backend)\n weekly_enabled?: boolean;\n weekly_day?: 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat';\n weekly_hour?: number;\n weekly_next_scheduled?: string;\n matches_enabled?: boolean;\n reminder_lead_hours?: number;\n results_enabled?: boolean;\n quiet_start?: number;\n quiet_end?: number;\n}\n\nexport const getNewsletterStatus = async (): Promise<NewsletterStatus> => {\n const response = await api.get<NewsletterStatus>(`/admin/newsletter/status`);\n return response.data as any;\n};\n\nexport type DigestType = 'blogs' | 'events' | 'matches' | 'scores' | 'weekly';\n\nexport const sendNewsletterDigest = async (type: DigestType, competitions?: string): Promise<{ message: string; recipients: number; type: string }> => {\n const response = await api.post(`/admin/newsletter/send-digest`, { type, competitions });\n return response.data;\n};\n\nexport const setNewsletterAutomation = async (enabled: boolean): Promise<{ newsletter_enabled: boolean }> => {\n const response = await api.patch(`/admin/newsletter/enable`, { enabled });\n return response.data;\n};\n\nexport interface NewsletterPreviewPayload {\n preferences?: Record<string, boolean> & { competitions?: string };\n}\nexport interface NewsletterPreviewResponse {\n subject: string;\n html: string;\n}\n\nexport const previewNewsletter = async (payload: NewsletterPreviewPayload): Promise<NewsletterPreviewResponse> => {\n const response = await api.post<NewsletterPreviewResponse>(`/admin/newsletter/preview`, payload);\n return response.data;\n};\n\nexport interface EmailStatRow {\n id: number;\n created_at: string;\n subject: string;\n recipient: string;\n type: string;\n status: string;\n opens: number;\n clicks: number;\n spam: number;\n unsubs: number;\n}\n\nexport const getRecentEmailStats = async (): Promise<EmailStatRow[]> => {\n const response = await api.get<{ data: EmailStatRow[] }>(`/admin/newsletter/stats/recent`);\n return response.data?.data || [];\n};\n\nexport interface EmailEventRow {\n id: number;\n created_at: string;\n email_log_id: number;\n event_type: string;\n meta?: Record<string, any>;\n}\n\nexport const getEmailEventsForLog = async (id: number): Promise<EmailEventRow[]> => {\n const response = await api.get<{ data: EmailEventRow[] }>(`/admin/newsletter/stats/${id}/events`);\n return response.data?.data || [];\n};\n\nexport const deleteSubscriber = async (id: number): Promise<void> => {\n await api.delete(`/admin/newsletter/subscribers/${id}`);\n};\n\nexport const toggleSubscriberStatus = async (id: number, isActive: boolean): Promise<NewsletterSubscriber> => {\n const response = await api.patch<NewsletterSubscriber>(\n `/admin/newsletter/subscribers/${id}/status`,\n { is_active: isActive }\n );\n return response.data;\n};\n\nexport const updateSubscriberPreferences = async (id: number, preferences: Record<string, boolean>) => {\n const response = await api.patch<NewsletterSubscriber>(`/admin/newsletter/subscribers/${id}/preferences`, preferences);\n return response.data;\n};\n\nexport const createNewsletterSubscriber = async (email: string, preferences?: Record<string, boolean>): Promise<NewsletterSubscriber> => {\n const response = await api.post<NewsletterSubscriber>(`/admin/newsletter/subscribers`, {\n email,\n preferences,\n });\n return response.data;\n};\n\nexport interface AresCustomerInfo {\n name: string;\n ico: string;\n dic?: string;\n address: string;\n city: string;\n found: boolean;\n}\n\nexport const searchByICO = async (ico: string): Promise<AresCustomerInfo> => {\n const response = await api.get<AresCustomerInfo>(`/admin/invoices/ares-search/${encodeURIComponent(ico)}`);\n return response.data;\n};\n","import api from '../../services/api';\nimport { CommentItem } from '../../services/comments';\n\nexport type AdminCommentsList = {\n items: CommentItem[];\n total: number;\n page: number;\n page_size: number;\n};\n\nexport async function adminListComments(params: { status?: 'visible'|'hidden'; target_type?: string; target_id?: string; user_id?: string; page?: number; page_size?: number; }): Promise<AdminCommentsList> {\n const res = await api.get('/admin/comments', { params });\n return res.data as AdminCommentsList;\n}\n\nexport async function adminUpdateCommentStatus(id: number, status: 'visible'|'hidden'): Promise<{ ok: boolean }>{\n const res = await api.patch(`/admin/comments/${id}/status`, { status });\n return res.data as { ok: boolean };\n}\n\nexport async function adminBanUser(user_id: number, reason: string, duration_hours?: number): Promise<{ ok: boolean }>{\n const res = await api.post('/admin/comments/ban', { user_id, reason, duration_hours: duration_hours || 0 });\n return res.data as { ok: boolean };\n}\n\nexport type CommentBan = {\n id: number;\n user_id: number;\n reason?: string;\n until?: string | null;\n created_at: string;\n created_by_id?: number;\n user?: {\n id: number;\n first_name?: string;\n last_name?: string;\n email?: string;\n role?: string;\n username?: string;\n };\n};\n\nexport async function adminListBans(): Promise<{ items: CommentBan[] }>{\n const res = await api.get('/admin/comments/bans');\n return res.data as { items: CommentBan[] };\n}\n\nexport async function adminLiftBan(id: number): Promise<{ ok: boolean }>{\n const res = await api.post(`/admin/comments/bans/${id}/lift`);\n return res.data as { ok: boolean };\n}\n\nexport type UnbanRequest = {\n id: number;\n user_id: number;\n message: string;\n status: 'pending'|'approved'|'rejected';\n created_at: string;\n resolved_by_id?: number | null;\n resolved_at?: string | null;\n user?: {\n id: number;\n first_name?: string;\n last_name?: string;\n email?: string;\n role?: string;\n username?: string;\n };\n};\n\nexport async function adminListUnbanRequests(): Promise<{ items: UnbanRequest[] }>{\n const res = await api.get('/admin/comments/unban-requests');\n return res.data as { items: UnbanRequest[] };\n}\n\nexport async function adminResolveUnban(id: number, action: 'approve'|'reject'): Promise<{ ok: boolean }>{\n const res = await api.post(`/admin/comments/unban-requests/${id}/resolve`, { action });\n return res.data as { ok: boolean };\n}\n","import React from 'react';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport { Box, Heading, HStack, VStack, Button, Select, Input, Table, Thead, Tbody, Tr, Th, Td, Text, Badge, IconButton, useToast, Modal, ModalOverlay, ModalContent, ModalHeader, ModalBody, ModalFooter, ModalCloseButton, useDisclosure, FormControl, FormLabel, NumberInput, NumberInputField, Switch, Tooltip } from '@chakra-ui/react';\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { adminListComments, adminUpdateCommentStatus, adminBanUser, adminListUnbanRequests, adminResolveUnban, adminListBans, adminLiftBan } from '../../services/admin/comments';\nimport { deleteComment } from '../../services/comments';\nimport { FiTrash2, FiEye, FiEyeOff } from 'react-icons/fi';\nimport { getArticles } from '../../services/articles';\nimport { getEvents } from '../../services/eventService';\nimport { getCachedYouTube } from '../../services/youtube';\nimport api from '../../services/api';\nimport { adminListUsers } from '../../services/admin/engagement';\n\nconst CommentsAdminPage: React.FC = () => {\n const [status, setStatus] = React.useState<string>('');\n const [targetType, setTargetType] = React.useState<string>('');\n const [targetId, setTargetId] = React.useState<string>('');\n const [userId, setUserId] = React.useState<string>('');\n const [page, setPage] = React.useState<number>(1);\n const [reportedOnly, setReportedOnly] = React.useState<boolean>(false);\n const toast = useToast();\n const qc = useQueryClient();\n\n const [targetOptions, setTargetOptions] = React.useState<Array<{ value: string; label: string }>>([]);\n const [targetLoading, setTargetLoading] = React.useState<boolean>(false);\n const [userOptions, setUserOptions] = React.useState<Array<{ value: string; label: string }>>([]);\n const [userLoading, setUserLoading] = React.useState<boolean>(false);\n\n const listQ = useQuery({\n queryKey: ['admin-comments', { status, targetType, targetId, userId, page }],\n queryFn: () => adminListComments({ status: status as any, target_type: targetType, target_id: targetId, user_id: userId, page, page_size: 50 }),\n keepPreviousData: true,\n });\n\n const unbanQ = useQuery({\n queryKey: ['admin-unban-requests'],\n queryFn: adminListUnbanRequests,\n });\n\n const bansQ = useQuery({\n queryKey: ['admin-comment-bans'],\n queryFn: adminListBans,\n });\n\n const updateStatusMut = useMutation({\n mutationFn: (args: { id: number; s: 'visible'|'hidden' }) => adminUpdateCommentStatus(args.id, args.s),\n onSuccess: async () => { await qc.invalidateQueries({ queryKey: ['admin-comments'] }); },\n });\n const deleteMut = useMutation({\n mutationFn: (id: number) => deleteComment(id),\n onSuccess: async () => { await qc.invalidateQueries({ queryKey: ['admin-comments'] }); toast({ status: 'success', title: 'Smazáno' }); },\n });\n\n const [banUserId, setBanUserId] = React.useState<number | null>(null);\n const banModal = useDisclosure();\n const [banReason, setBanReason] = React.useState<string>('Porušení pravidel diskuse');\n const [banHours, setBanHours] = React.useState<number>(0);\n const banMut = useMutation({\n mutationFn: () => adminBanUser(banUserId || 0, banReason, banHours),\n onSuccess: async () => { banModal.onClose(); setBanUserId(null); toast({ status: 'success', title: 'Uživatel zablokován' }); },\n });\n\n const resolveUnbanMut = useMutation({\n mutationFn: (args: { id: number; action: 'approve'|'reject' }) => adminResolveUnban(args.id, args.action),\n onSuccess: async () => {\n await qc.invalidateQueries({ queryKey: ['admin-unban-requests'] });\n await qc.invalidateQueries({ queryKey: ['admin-comment-bans'] });\n toast({ status: 'success', title: 'Vyřízeno' });\n },\n });\n\n const liftBanMut = useMutation({\n mutationFn: (id: number) => adminLiftBan(id),\n onSuccess: async () => { await qc.invalidateQueries({ queryKey: ['admin-comment-bans'] }); toast({ status: 'success', title: 'Ban zrušen' }); },\n });\n\n React.useEffect(() => {\n const load = async () => {\n if (!targetType) { setTargetOptions([]); return; }\n try {\n setTargetLoading(true);\n if (targetType === 'article') {\n const res = await getArticles({ page: 1, page_size: 100 });\n setTargetOptions((res.data || []).map((a: any) => ({ value: String(a.id), label: `${a.title} (#${a.id})` })));\n } else if (targetType === 'event') {\n const res = await getEvents();\n setTargetOptions((res || []).map((e: any) => ({ value: String(e.id), label: `${e.title} (#${e.id})` })));\n } else if (targetType === 'gallery_album') {\n const r = await api.get('/gallery/albums');\n const arr = Array.isArray(r.data) ? r.data : (r.data?.data || r.data?.albums || []);\n setTargetOptions((arr || []).map((al: any) => ({ value: String(al.id), label: `${al.title} (${al.date || ''})` })));\n } else if (targetType === 'youtube_video') {\n const yt = await getCachedYouTube();\n const vids = yt?.videos || [];\n setTargetOptions(vids.map((v: any) => ({ value: String(v.video_id), label: `${v.title} (${v.published_date || ''})` })));\n } else {\n setTargetOptions([]);\n }\n } catch (e: any) {\n setTargetOptions([]);\n } finally {\n setTargetLoading(false);\n }\n };\n load();\n }, [targetType]);\n\n React.useEffect(() => {\n const loadUsers = async () => {\n try {\n setUserLoading(true);\n const users = await adminListUsers();\n setUserOptions((users || []).map((u: any) => ({ value: String(u.id), label: `${u.name || u.email} (#${u.id})` })));\n } catch {\n setUserOptions([]);\n } finally {\n setUserLoading(false);\n }\n };\n loadUsers();\n }, []);\n\n const itemsAll = listQ.data?.items || [];\n const items = React.useMemo(() => {\n if (!reportedOnly) return itemsAll;\n return itemsAll.filter((c: any) => (c as any).reports && (c as any).reports > 0);\n }, [itemsAll, reportedOnly]);\n\n return (\n <AdminLayout>\n <Box>\n <Heading size=\"md\" mb={4}>Komentáře (moderace)</Heading>\n <VStack align=\"stretch\" spacing={3} mb={4}>\n <HStack>\n <Select placeholder=\"Stav\" value={status} onChange={(e) => { setStatus(e.target.value); setPage(1); }} maxW=\"200px\">\n <option value=\"visible\">Viditelné</option>\n <option value=\"hidden\">Skryté</option>\n </Select>\n <Select placeholder=\"Typ cíle\" value={targetType} onChange={(e) => { setTargetType(e.target.value); setPage(1); setTargetId(''); }} maxW=\"220px\">\n <option value=\"article\">Článek</option>\n <option value=\"event\">Aktivita</option>\n <option value=\"gallery_album\">Galerie</option>\n <option value=\"youtube_video\">YouTube video</option>\n </Select>\n {targetType && (\n <Select placeholder={targetLoading ? 'Načítání…' : 'Cíl'} value={targetId} onChange={(e) => { setTargetId(e.target.value); setPage(1); }} maxW=\"320px\" isDisabled={targetLoading}>\n {targetOptions.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </Select>\n )}\n <Select placeholder={userLoading ? 'Načítání uživatelů…' : 'Uživatel'} value={userId} onChange={(e) => { setUserId(e.target.value); setPage(1); }} maxW=\"260px\" isDisabled={userLoading}>\n {userOptions.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </Select>\n <HStack>\n <Text fontSize=\"sm\" color=\"gray.500\">Jen nahlášené</Text>\n <Switch isChecked={reportedOnly} onChange={(e)=>setReportedOnly(e.target.checked)} />\n </HStack>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => { setStatus(''); setTargetType(''); setTargetId(''); setUserId(''); setReportedOnly(false); setPage(1); }}>Reset</Button>\n </HStack>\n </VStack>\n\n <Box borderWidth=\"1px\" borderRadius=\"md\" overflowX=\"auto\">\n <Table size=\"sm\">\n <Thead>\n <Tr>\n <Th>ID</Th>\n <Th>Uživatel</Th>\n <Th>Cíl</Th>\n <Th>Obsah</Th>\n <Th>Spam</Th>\n <Th>Hlášení</Th>\n <Th>Stav</Th>\n <Th>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {items.map((c) => (\n <Tr key={c.id}>\n <Td>#{c.id}</Td>\n <Td>#{c.user?.id} {c.user?.first_name} {c.user?.last_name}</Td>\n <Td>\n <Badge mr={2}>{c.target_type}</Badge>\n <Text as=\"span\">{c.target_label || c.target_id}</Text>\n </Td>\n <Td maxW=\"420px\"><Text noOfLines={2}>{c.content}</Text></Td>\n <Td>{(c as any).spam_score ? <Badge colorScheme={(c as any).spam_score > 0.5 ? 'orange' : 'green'}>{(c as any).spam_score.toFixed(2)}</Badge> : '-'}</Td>\n <Td>{(c as any).reports ? <Badge colorScheme={(c as any).reports > 2 ? 'red' : 'yellow'}>{(c as any).reports}</Badge> : '-'}</Td>\n <Td>\n <Tooltip label={c.status === 'visible' ? 'Viditelné' : 'Skryté'}>\n <IconButton\n aria-label={c.status === 'visible' ? 'Viditelné' : 'Skryté'}\n size=\"xs\"\n variant=\"ghost\"\n colorScheme={c.status === 'visible' ? 'green' : 'gray'}\n icon={c.status === 'visible' ? <FiEye /> : <FiEyeOff />}\n onClick={() => updateStatusMut.mutate({ id: c.id, s: (c.status === 'visible' ? 'hidden' : 'visible') as any })}\n />\n </Tooltip>\n </Td>\n <Td>\n <HStack>\n <IconButton aria-label=\"Smazat\" size=\"xs\" icon={<FiTrash2 />} onClick={() => deleteMut.mutate(c.id)} />\n <Button size=\"xs\" variant=\"outline\" onClick={() => { setBanUserId(c.user?.id as any); banModal.onOpen(); }}>Ban</Button>\n </HStack>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n\n <HStack mt={3} justify=\"space-between\">\n <Text fontSize=\"sm\" color=\"gray.500\">Stránka {page} • {listQ.data?.total || 0} komentářů</Text>\n <HStack>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setPage(p => Math.max(1, p - 1))} isDisabled={page <= 1}>Předchozí</Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setPage(p => p + 1)} isDisabled={(itemsAll.length === 0) || ((itemsAll.length < 50) && (listQ.data?.total || 0) <= (page * 50))}>Další</Button>\n </HStack>\n </HStack>\n\n <Heading size=\"sm\" mt={6} mb={2}>Žádosti o odblokování</Heading>\n <Box borderWidth=\"1px\" borderRadius=\"md\" overflowX=\"auto\">\n <Table size=\"sm\">\n <Thead>\n <Tr>\n <Th>ID</Th>\n <Th>Uživatel</Th>\n <Th>Text</Th>\n <Th>Stav</Th>\n <Th>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {(unbanQ.data?.items || []).map((r) => (\n <Tr key={r.id}>\n <Td>#{r.id}</Td>\n <Td>#{r.user?.id} {r.user?.first_name} {r.user?.last_name} <Text as=\"span\" color=\"gray.500\" fontSize=\"sm\">{r.user?.email}</Text></Td>\n <Td maxW=\"480px\"><Text noOfLines={2}>{r.message}</Text></Td>\n <Td>\n {r.status === 'pending' && <Badge colorScheme=\"yellow\">Čeká na vyřízení</Badge>}\n {r.status === 'approved' && <Badge colorScheme=\"green\">Schváleno</Badge>}\n {r.status === 'rejected' && <Badge colorScheme=\"red\">Zamítnuto</Badge>}\n </Td>\n <Td>\n <HStack>\n <Button size=\"xs\" colorScheme=\"green\" variant=\"outline\" onClick={() => resolveUnbanMut.mutate({ id: r.id, action: 'approve' })}>Povolit</Button>\n <Button size=\"xs\" colorScheme=\"red\" variant=\"outline\" onClick={() => resolveUnbanMut.mutate({ id: r.id, action: 'reject' })}>Zamítnout</Button>\n </HStack>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n\n <Heading size=\"sm\" mt={6} mb={2}>Zablokovaní uživatelé</Heading>\n <Box borderWidth=\"1px\" borderRadius=\"md\" overflowX=\"auto\">\n <Table size=\"sm\">\n <Thead>\n <Tr>\n <Th>ID</Th>\n <Th>Uživatel</Th>\n <Th>Důvod</Th>\n <Th>Zabanován</Th>\n <Th>Platné do</Th>\n <Th>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {(bansQ.data?.items || []).map((b) => {\n const untilText = !b.until ? 'Trvale' : new Date(b.until).toLocaleString();\n return (\n <Tr key={b.id}>\n <Td>#{b.id}</Td>\n <Td>#{b.user?.id} {b.user?.first_name} {b.user?.last_name} <Text as=\"span\" color=\"gray.500\" fontSize=\"sm\">{b.user?.email}</Text></Td>\n <Td>{b.reason || '-'}</Td>\n <Td>{new Date(b.created_at).toLocaleString()}</Td>\n <Td>{untilText}</Td>\n <Td>\n <Button size=\"xs\" variant=\"outline\" onClick={() => liftBanMut.mutate(b.id)}>Zrušit ban</Button>\n </Td>\n </Tr>\n );\n })}\n </Tbody>\n </Table>\n </Box>\n\n {/* Ban modal */}\n <Modal isOpen={banModal.isOpen} onClose={banModal.onClose} isCentered>\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Zablokovat uživatele #{banUserId}</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack align=\"stretch\" spacing={3}>\n <FormControl>\n <FormLabel>Důvod</FormLabel>\n <Input value={banReason} onChange={(e) => setBanReason(e.target.value)} />\n </FormControl>\n <FormControl>\n <FormLabel>Doba (hodiny) 0 = trvale</FormLabel>\n <NumberInput min={0} value={banHours} onChange={(v) => setBanHours(Number(v) || 0)}>\n <NumberInputField />\n </NumberInput>\n </FormControl>\n <HStack>\n <Text fontSize=\"sm\" color=\"gray.500\">Rychlá volba:</Text>\n <Button size=\"xs\" variant=\"outline\" onClick={()=>setBanHours(24)}>24h</Button>\n <Button size=\"xs\" variant=\"outline\" onClick={()=>setBanHours(24*7)}>7 dní</Button>\n <Button size=\"xs\" variant=\"outline\" onClick={()=>setBanHours(0)}>Trvale</Button>\n </HStack>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <HStack>\n <Button onClick={banModal.onClose}>Zrušit</Button>\n <Button colorScheme=\"red\" isLoading={banMut.isPending} onClick={() => banMut.mutate()}>Zablokovat</Button>\n </HStack>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </Box>\n </AdminLayout>\n );\n};\n\nexport default CommentsAdminPage;\n","import { Container, Heading, Text, List, ListItem, Link, Box, useColorModeValue, VStack, Divider } from '@chakra-ui/react';\nimport MainLayout from '../../components/layout/MainLayout';\n\nconst PrivacyPolicyPage: React.FC = () => {\n const textColor = useColorModeValue('gray.700', 'gray.300');\n const headingColor = useColorModeValue('gray.900', 'gray.100');\n const boxBg = useColorModeValue('blue.50', 'blue.900');\n const boxText = useColorModeValue('blue.900', 'blue.100');\n\n return (\n <MainLayout>\n <Container maxW=\"3xl\" py={8}>\n <VStack align=\"stretch\" spacing={6}>\n <Heading as=\"h1\" size=\"xl\" mb={2} color={headingColor}>Zásady ochrany osobních údajů</Heading>\n <Text fontSize=\"sm\" color={textColor}>\n Poslední aktualizace: {new Date().toLocaleDateString('cs-CZ')}\n </Text>\n \n <Box bg={boxBg} p={4} borderRadius=\"md\">\n <Text fontWeight=\"bold\" mb={2} color={boxText}>Důležité upozornění</Text>\n <Text fontSize=\"sm\" color={boxText}>\n Respektujeme vaše soukromí. Tato stránka popisuje, jak zpracováváme vaše osobní údaje v souladu s platnými právními předpisy (zejména nařízením GDPR - Nařízení Evropského parlamentu a Rady (EU) 2016/679).\n </Text>\n </Box>\n\n <Divider />\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>1. Správce osobních údajů</Heading>\n <Text color={textColor} mb={2}>\n Správcem osobních údajů je provozovatel těchto webových stránek. Kontaktní údaje správce naleznete na stránce <Link href=\"/kontakt\" color=\"brand.primary\">Kontakt</Link>.\n </Text>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>2. Jaké osobní údaje zpracováváme</Heading>\n <Text color={textColor} mb={2}>Zpracováváme následující kategorie osobních údajů:</Text>\n <List spacing={2} mb={4} styleType=\"disc\" pl={6} color={textColor}>\n <ListItem><strong>Kontaktní údaje:</strong> jméno, příjmení, e-mailová adresa, telefonní číslo - poskytnuté dobrovolně prostřednictvím kontaktního formuláře nebo při registraci k newsletteru</ListItem>\n <ListItem><strong>IP adresa:</strong> automaticky zaznamenávaná při návštěvě webu pro účely bezpečnosti, analýzy návštěvnosti a prevence zneužití</ListItem>\n <ListItem><strong>Technické údaje:</strong> informace o zařízení, prohlížeči, operačním systému, datum a čas návštěvy, navštívené stránky</ListItem>\n <ListItem><strong>Cookies:</strong> soubory ukládané do vašeho zařízení (viz samostatná <Link href=\"/pravidla-cookies\" color=\"brand.primary\">Pravidla používání cookies</Link>)</ListItem>\n <ListItem><strong>Analytické údaje:</strong> anonymizovaná data o chování na webu prostřednictvím analytických nástrojů</ListItem>\n </List>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>3. Zdroje dat a vlastnictví obsahu</Heading>\n <Box bg={boxBg} p={4} borderRadius=\"md\" mb={4}>\n <Text fontWeight=\"bold\" mb={2} color={boxText}>Důležité právní upozornění</Text>\n <Text fontSize=\"sm\" color={boxText}>\n Tento web zobrazuje data z externích zdrojů, která NEVLASTNÍME a která jsou majetkem příslušných organizací.\n </Text>\n </Box>\n <List spacing={3} mb={4} styleType=\"disc\" pl={6} color={textColor}>\n <ListItem>\n <strong>Data FAČR (Fotbalová asociace České republiky):</strong> Veškeré informace o zápasech, tabulkách, soutěžích a výsledcích pocházejí z veřejných API a webových stránek FAČR (<Link href=\"https://www.fotbal.cz\" isExternal color=\"brand.primary\">www.fotbal.cz</Link>). Tato data jsou majetkem FAČR a zobrazujeme je pouze pro informační účely v souladu s veřejnou dostupností.\n </ListItem>\n <ListItem>\n <strong>Loga klubů a týmů:</strong> Loga zobrazená na webu jsou majetkem příslušných fotbalových klubů a organizací. Používáme je pouze pro identifikační účely v rámci sportovního zpravodajství.\n </ListItem>\n <ListItem>\n <strong>Fotografie a mediální obsah:</strong> Fotografie a videa mohou pocházet z různých zdrojů včetně veřejných galerií, YouTube a dalších platforem. Veškerá autorská práva náleží jejich původním autorům.\n </ListItem>\n </List>\n <Text fontSize=\"sm\" color={textColor}>\n Pokud jste vlastníkem obsahu a máte námitky proti jeho použití, prosím kontaktujte nás prostřednictvím <Link href=\"/kontakt\" color=\"brand.primary\">kontaktního formuláře</Link>.\n </Text>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>4. Účel zpracování</Heading>\n <List spacing={2} mb={4} styleType=\"disc\" pl={6} color={textColor}>\n <ListItem><strong>Komunikace:</strong> Vyřízení vašich dotazů, požadavků a zpětné vazby</ListItem>\n <ListItem><strong>Newsletter:</strong> Zasílání novinek a informací (pouze se souhlasem)</ListItem>\n <ListItem><strong>Bezpečnost webu:</strong> Ochrana před útoky, prevence zneužití, detekce podvodů</ListItem>\n <ListItem><strong>Analýza návštěvnosti:</strong> Zlepšování uživatelského zážitku a optimalizace obsahu</ListItem>\n <ListItem><strong>Plnění právních povinností:</strong> Dodržování zákonných požadavků</ListItem>\n </List>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>5. Právní základ zpracování</Heading>\n <List spacing={2} mb={4} styleType=\"disc\" pl={6} color={textColor}>\n <ListItem><strong>Souhlas (čl. 6 odst. 1 písm. a GDPR):</strong> Pro newsletter a analytické cookies</ListItem>\n <ListItem><strong>Oprávněný zájem (čl. 6 odst. 1 písm. f GDPR):</strong> Bezpečnost webu, prevence zneužití, anonymizovaná analytika</ListItem>\n <ListItem><strong>Plnění smlouvy (čl. 6 odst. 1 písm. b GDPR):</strong> Poskytování služeb</ListItem>\n </List>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>6. Doba uchovávání údajů</Heading>\n <List spacing={2} mb={4} styleType=\"disc\" pl={6} color={textColor}>\n <ListItem><strong>Kontaktní údaje:</strong> Po dobu nezbytnou pro vyřízení požadavku, maximálně 3 roky</ListItem>\n <ListItem><strong>IP adresy:</strong> 90 dní pro účely bezpečnosti a analýzy</ListItem>\n <ListItem><strong>Analytické údaje:</strong> Anonymizovaně až 26 měsíců</ListItem>\n <ListItem><strong>Newsletter:</strong> Do odvolání souhlasu</ListItem>\n </List>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>7. Předávání údajů třetím stranám</Heading>\n <Text color={textColor} mb={2}>Vaše osobní údaje můžeme předávat:</Text>\n <List spacing={2} mb={4} styleType=\"disc\" pl={6} color={textColor}>\n <ListItem><strong>Poskytovatelé hostingu:</strong> Pro technický provoz webu</ListItem>\n <ListItem><strong>Analytické nástroje:</strong> Pro měření návštěvnosti (anonymizovaně)</ListItem>\n <ListItem><strong>E-mailové služby:</strong> Pro zasílání newsletterů</ListItem>\n </List>\n <Text fontSize=\"sm\" color={textColor}>\n Všichni zpracovatelé jsou pečlivě vybráni a zavázáni k ochraně vašich údajů v souladu s GDPR.\n </Text>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>8. Vaše práva</Heading>\n <Text color={textColor} mb={2}>Máte následující práva:</Text>\n <List spacing={2} mb={4} styleType=\"disc\" pl={6} color={textColor}>\n <ListItem><strong>Právo na přístup:</strong> Můžete požádat o informace o zpracování vašich údajů</ListItem>\n <ListItem><strong>Právo na opravu:</strong> Můžete požadovat opravu nepřesných údajů</ListItem>\n <ListItem><strong>Právo na výmaz:</strong> Můžete požadovat smazání vašich údajů („právo být zapomenut\")</ListItem>\n <ListItem><strong>Právo na omezení zpracování:</strong> Můžete požadovat omezení zpracování</ListItem>\n <ListItem><strong>Právo na přenositelnost:</strong> Můžete požádat o předání údajů</ListItem>\n <ListItem><strong>Právo vznést námitku:</strong> Můžete se bránit zpracování na základě oprávněného zájmu</ListItem>\n <ListItem><strong>Právo odvolat souhlas:</strong> Kdykoliv můžete odvolat souhlas se zpracováním</ListItem>\n </List>\n <Text color={textColor} mb={4}>\n Pro uplatnění vašich práv nás kontaktujte prostřednictvím stránky <Link href=\"/kontakt\" color=\"brand.primary\">Kontakt</Link>.\n </Text>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>9. Bezpečnost údajů</Heading>\n <Text color={textColor} mb={4}>\n Používáme přiměřená technická a organizační opatření k ochraně vašich osobních údajů před neoprávněným přístupem, ztrátou, zničením nebo změnou. Data jsou přenášena šifrovaně prostřednictvím HTTPS protokolu.\n </Text>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>10. Stížnosti</Heading>\n <Text color={textColor} mb={4}>\n Pokud se domníváte, že s vašimi údaji není nakládáno v souladu se zákonem, máte právo podat stížnost u dozorového úřadu:\n </Text>\n <Box bg={boxBg} p={4} borderRadius=\"md\">\n <Text fontWeight=\"bold\" color={boxText}>Úřad pro ochranu osobních údajů</Text>\n <Text fontSize=\"sm\" color={boxText}>Pplk. Sochora 27, 170 00 Praha 7</Text>\n <Text fontSize=\"sm\" color={boxText}>Web: <Link href=\"https://www.uoou.cz\" isExternal color=\"brand.primary\">www.uoou.cz</Link></Text>\n </Box>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>11. Změny těchto zásad</Heading>\n <Text color={textColor}>\n Vyhrazujeme si právo tyto zásady aktualizovat. O významných změnách vás budeme informovat prostřednictvím webu.\n </Text>\n </Box>\n </VStack>\n </Container>\n </MainLayout>\n );\n};\n\nexport default PrivacyPolicyPage;\n","import api from './api';\n\nexport interface Banner {\n id: number | string;\n name: string;\n image_url?: string;\n click_url?: string;\n placement?: string;\n width?: number;\n height?: number;\n is_active?: boolean;\n display_order?: number;\n}\n\nexport async function getBanners(params?: { active?: boolean; placement?: string }): Promise<Banner[]> {\n const res = await api.get<any>('/banners', { params });\n const body = res.data;\n const list = Array.isArray(body) ? body : (Array.isArray(body?.data) ? body.data : []);\n return (list || []).map((b: any) => ({\n ...b,\n id: b.id ?? b.ID ?? b.Id ?? b.iD,\n }));\n}\n\nexport async function createBanner(payload: { name: string; image_url?: string; click_url?: string; placement?: string; width?: number; height?: number; is_active?: boolean; display_order?: number }) {\n const res = await api.post<Banner>('/banners', payload);\n return res.data;\n}\n\nexport async function updateBanner(id: number | string, payload: Partial<{ name: string; image_url?: string; click_url?: string; placement?: string; width?: number; height?: number; is_active?: boolean; display_order?: number }>) {\n const res = await api.put<Banner>(`/banners/${id}`, payload);\n return res.data;\n}\n\nexport async function deleteBanner(id: number | string) {\n const res = await api.delete<{ zprava: string }>(`/banners/${id}`);\n return res.data;\n}\n","import { Box, VStack, Text, useColorModeValue, Icon, Link as ChakraLink, Divider, Image, Flex, Spinner, Collapse, IconButton } from '@chakra-ui/react';\nimport { Link as RouterLink, useLocation } from 'react-router-dom';\nimport { useEffect, useRef, useCallback, useState, useMemo } from 'react';\nimport { useAdminNavScrollRetention } from '../../hooks/useAdminNavScrollRetention';\nimport { \n FaTachometerAlt, \n FaUsers, \n FaFutbol, \n FaCalendarAlt, \n FaNewspaper, \n FaHandshake, \n FaImage, \n FaEnvelope, \n FaCog, \n FaPalette,\n FaHome,\n FaSignOutAlt,\n FaPaperPlane,\n FaAward,\n FaSyncAlt,\n FaBook,\n FaMobileAlt,\n FaChartBar,\n FaFolder,\n FaAddressBook,\n FaBars,\n FaPoll,\n FaPaintBrush,\n FaVideo,\n FaCamera,\n FaTshirt,\n FaBullhorn,\n FaUserShield,\n FaFileAlt,\n FaLink,\n FaComments,\n FaGift,\n FaQrcode,\n FaTools,\n FaDollarSign,\n FaFileInvoice,\n FaReceipt,\n FaUserFriends,\n FaMoneyBillWave,\n FaCogs,\n FaDatabase,\n FaRocket,\n FaFileInvoiceDollar,\n FaTimes\n} from 'react-icons/fa';\nimport { ChevronDownIcon, ChevronRightIcon } from '@chakra-ui/icons';\nimport { useAuth } from '../../contexts/AuthContext';\nimport { useQuery } from '@tanstack/react-query';\nimport { getUpcomingEvents } from '../../services/eventService';\nimport { getAllNavigationItems, NavigationItem, seedDefaultNavigation, getEditorAllowedAdminNav } from '../../services/navigation';\nimport { usePublicSettings } from '../../hooks/usePublicSettings';\nimport { assetUrl } from '../../utils/url';\n\ninterface NavItemProps {\n icon: any;\n to?: string;\n children: React.ReactNode;\n onClick?: (e?: React.MouseEvent) => void;\n}\n\nconst NavItem = ({ icon, to, children, onClick }: NavItemProps) => {\n const location = useLocation();\n // Use exact matching for navigation items to prevent multiple active states\n const isActive = to ? location.pathname === to : false;\n const activeBg = useColorModeValue('blue.50', 'blue.900');\n const activeColor = useColorModeValue('blue.600', 'blue.300');\n const hoverBg = useColorModeValue('gray.100', 'gray.700');\n \n const handleClick = (e: React.MouseEvent) => {\n // Call the onClick handler first\n if (onClick) {\n onClick(e);\n // If onClick called preventDefault, respect it\n if (e.isDefaultPrevented()) {\n return;\n }\n }\n \n // For external links or non-router navigation, allow default behavior\n // For RouterLink, React Router will handle the navigation\n };\n \n // If onClick is provided without `to`, render as a button-like link\n const LinkComponent = to ? RouterLink : 'a';\n const linkProps = to ? { to } : { href: '#' };\n \n return (\n <ChakraLink\n as={LinkComponent}\n {...linkProps}\n display=\"flex\"\n alignItems=\"center\"\n px={3}\n py={2.5}\n borderRadius=\"lg\"\n bg={isActive ? activeBg : 'transparent'}\n color={isActive ? activeColor : 'inherit'}\n fontWeight={isActive ? 'semibold' : 'medium'}\n fontSize=\"sm\"\n _hover={{\n textDecoration: 'none',\n bg: isActive ? activeBg : hoverBg,\n transform: 'translateX(2px)',\n }}\n transition=\"all 0.2s ease\"\n onClick={handleClick}\n data-navitem=\"true\"\n data-active={isActive ? 'true' : undefined}\n position=\"relative\"\n _before={isActive ? {\n content: '\"\"',\n position: 'absolute',\n left: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n width: '3px',\n height: '60%',\n bg: activeColor,\n borderRadius: 'full',\n } : {}}\n >\n <Icon as={icon} mr={3} boxSize={4} />\n <Text flex={1}>{children}</Text>\n </ChakraLink>\n );\n};\n\ninterface AdminSidebarProps {\n isOpen: boolean;\n onClose: () => void;\n bg?: string;\n borderRight?: string;\n borderColor?: string;\n}\n\n// Icon mapping for navigation items\nconst getIconForPageType = (pageType?: string): any => {\n const iconMap: Record<string, any> = {\n dashboard: FaTachometerAlt,\n analytics: FaChartBar,\n teams: FaUsers,\n matches: FaCalendarAlt,\n activities: FaCalendarAlt,\n players: FaFutbol,\n articles: FaNewspaper,\n categories: FaFileAlt,\n about: FaBook,\n videos: FaVideo,\n gallery: FaImage,\n scoreboard: FaTachometerAlt,\n scoreboard_remote: FaMobileAlt,\n clothing: FaTshirt,\n sponsors: FaHandshake,\n banners: FaBullhorn,\n messages: FaEnvelope,\n contacts: FaAddressBook,\n newsletter: FaPaperPlane,\n polls: FaPoll,\n navigation: FaBars,\n competition_aliases: FaAward,\n prefetch: FaRocket, // Better icon for prefetch & cache\n users: FaUserShield,\n settings: FaPalette,\n files: FaFolder,\n media: FaFolder,\n docs: FaBook,\n shortlinks: FaLink,\n comments: FaComments,\n engagement: FaAward,\n sweepstakes: FaGift,\n 'manual-data': FaTools,\n 'financial-dashboard': FaMoneyBillWave, // Better finance icon\n 'qr-codes': FaQrcode,\n 'invoices': FaFileInvoiceDollar, // Enhanced invoice icon\n 'invoice-settings': FaFileInvoiceDollar, // Enhanced invoice settings icon\n 'customers': FaUserFriends, // Better customers icon\n 'expenses': FaMoneyBillWave, // Better expenses icon\n 'manual_facr': FaTools, // For manual FACR\n };\n return iconMap[pageType || ''] || FaFileAlt;\n};\n\nconst AdminSidebar = ({ \n isOpen, \n onClose, \n bg: bgProp,\n borderRight = '1px',\n borderColor: borderColorProp\n}: AdminSidebarProps) => {\n const { logout, user } = useAuth();\n const { data: publicSettings } = usePublicSettings();\n const isAdmin = (user as any)?.role === 'admin';\n const defaultBg = useColorModeValue('white', '#1a1d29');\n const defaultBorderColor = useColorModeValue('gray.200', 'rgba(255, 255, 255, 0.12)');\n const textColor = useColorModeValue('gray.800', '#e2e8f0');\n const bg = bgProp || defaultBg;\n const borderColor = borderColorProp || defaultBorderColor;\n // Check if e-shop is enabled (from backend config)\n const isEshopEnabled = (publicSettings as any)?.eshop_enabled || false;\n // Check if club data mode is manual (to show manual data tab)\n const isManualClubDataMode = (publicSettings?.club_data_mode || '').toLowerCase() === 'manual';\n // Hoisted color tokens to keep hook calls stable across renders\n const dividerColor = useColorModeValue('gray.200', 'whiteAlpha.300');\n const categoryTextColor = useColorModeValue('gray.600', 'gray.300');\n const categoryIconColor = useColorModeValue('gray.500', 'gray.400');\n const headerMutedColor = useColorModeValue('gray.500', 'gray.400');\n const scrollThumb = useColorModeValue('gray.300', 'gray.600');\n const scrollThumbHover = useColorModeValue('gray.400', 'gray.500');\n const badgeBgGreen = useColorModeValue('green.100', 'green.900');\n const badgeColorGreen = useColorModeValue('green.700', 'green.200');\n const badgeBorderGreen = useColorModeValue('green.200', 'green.700');\n const badgeBgGray = useColorModeValue('gray.100', 'whiteAlpha.200');\n const badgeColorGray = useColorModeValue('gray.700', 'gray.300');\n const badgeBorderGray = useColorModeValue('gray.200', 'whiteAlpha.300');\n // Upcoming events count for badge\n const { data: upcomingEvents } = useQuery({ queryKey: ['admin-sidebar-upcoming-events'], queryFn: getUpcomingEvents });\n const upcomingCount = Array.isArray(upcomingEvents) ? upcomingEvents.length : 0;\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const seedFixRef = useRef<{ about: boolean }>({ about: false });\n const location = useLocation();\n // Use the updated scroll retention hook\n const { scrollToCurrentPage, isReady, debug } = useAdminNavScrollRetention({\n scrollContainerSelector: '[data-sidebar=\"true\"]',\n enableDebug: process.env.NODE_ENV === 'development'\n });\n\n // Helper function to render NavItem\n const renderNavItem = useCallback((props: NavItemProps) => {\n return <NavItem {...props} />;\n }, []);\n \n // Dynamic navigation state\n const [navItems, setNavItems] = useState<NavigationItem[]>([]);\n const [navLoading, setNavLoading] = useState(true);\n // presence checks consider children as well\n const hasItemDeep = useCallback((predicate: (it: NavigationItem) => boolean): boolean => {\n const check = (it: NavigationItem): boolean => {\n if (predicate(it)) return true;\n if (Array.isArray(it.children)) {\n return it.children.some(check);\n }\n return false;\n };\n return navItems.some(check);\n }, [navItems]);\n const hasShortlinks = useMemo(() => hasItemDeep(it => (it.page_type === 'shortlinks') || (it.url === '/admin/shortlinks')), [hasItemDeep]);\n const hasEngagement = useMemo(() => hasItemDeep(it => (it.page_type === 'engagement') || (it.url === '/admin/engagement')), [hasItemDeep]);\n const hasComments = useMemo(() => hasItemDeep(it => (it.page_type === 'comments') || (it.url === '/admin/komentare')), [hasItemDeep]);\n const hasSweepstakes = useMemo(() => hasItemDeep(it => (it.page_type === 'sweepstakes') || (it.url === '/admin/sweepstakes')), [hasItemDeep]);\n const hasCompetitionAliases = useMemo(() => hasItemDeep(it => (it.page_type === 'competition_aliases') || (it.url === '/admin/aliasy-soutezi')), [hasItemDeep]);\n const hasClothing = useMemo(() => hasItemDeep(it => (it.page_type === 'clothing') || (it.url === '/admin/obleceni')), [hasItemDeep]);\n const hasEshopProducts = useMemo(() => hasItemDeep(it => (it.page_type === 'eshop_products') || (it.url === '/admin/eshop-produkty')), [hasItemDeep]);\n const hasAbout = useMemo(() => hasItemDeep(it => (it.page_type === 'about') || (it.url === '/admin/o-klubu')), [hasItemDeep]);\n const hasVideos = useMemo(() => hasItemDeep(it => (it.page_type === 'videos') || (it.url === '/admin/videa')), [hasItemDeep]);\n const hasGallery = useMemo(() => hasItemDeep(it => (it.page_type === 'gallery') || (it.url === '/admin/galerie')), [hasItemDeep]);\n const hasScoreboard = useMemo(() => hasItemDeep(it => (it.page_type === 'scoreboard') || (it.url === '/admin/scoreboard')), [hasItemDeep]);\n const hasScoreboardRemote = useMemo(() => hasItemDeep(it => (it.page_type === 'scoreboard_remote') || (it.url === '/admin/scoreboard/remote')), [hasItemDeep]);\n const hasSponsors = useMemo(() => hasItemDeep(it => (it.page_type === 'sponsors') || (it.url === '/admin/sponzori')), [hasItemDeep]);\n const hasBanners = useMemo(() => hasItemDeep(it => (it.page_type === 'banners') || (it.url === '/admin/bannery')), [hasItemDeep]);\n const hasMessages = useMemo(() => hasItemDeep(it => (it.page_type === 'messages') || (it.url === '/admin/zpravy')), [hasItemDeep]);\n const hasContacts = useMemo(() => hasItemDeep(it => (it.page_type === 'contacts') || (it.url === '/admin/kontakty')), [hasItemDeep]);\n const hasNewsletter = useMemo(() => hasItemDeep(it => (it.page_type === 'newsletter') || (it.url === '/admin/newsletter')), [hasItemDeep]);\n const hasPolls = useMemo(() => hasItemDeep(it => (it.page_type === 'polls') || (it.url === '/admin/ankety')), [hasItemDeep]);\n const hasFiles = useMemo(() => hasItemDeep(it => (it.page_type === 'files') || (it.url === '/admin/soubory')), [hasItemDeep]);\n const hasNavigation = useMemo(() => hasItemDeep(it => (it.page_type === 'navigation') || (it.url === '/admin/navigace')), [hasItemDeep]);\n const hasUsers = useMemo(() => hasItemDeep(it => (it.page_type === 'users') || (it.url === '/admin/uzivatele')), [hasItemDeep]);\n const hasSettingsPage = useMemo(() => hasItemDeep(it => (it.page_type === 'settings') || (it.url === '/admin/nastaveni')), [hasItemDeep]);\n const hasAnalytics = useMemo(() => hasItemDeep(it => (it.page_type === 'analytics') || (it.url === '/admin/analytika')), [hasItemDeep]);\n const hasPrefetch = useMemo(() => hasItemDeep(it => (it.page_type === 'prefetch') || (it.url === '/admin/prefetch')), [hasItemDeep]);\n const hasManualData = useMemo(() => hasItemDeep(it => (it.page_type === 'manual_data') || (it.url === '/admin/manual-data')), [hasItemDeep]);\n \n\n // Collapsed state for admin categories (dropdown items)\n type CollapsedMap = Record<number, boolean>;\n const COLLAPSE_KEY = 'admin-sidebar-collapsed-v1';\n const [collapsed, setCollapsed] = useState<CollapsedMap>({});\n\n useEffect(() => {\n try {\n const raw = localStorage.getItem(COLLAPSE_KEY);\n if (raw) {\n const parsed = JSON.parse(raw) as CollapsedMap;\n if (parsed && typeof parsed === 'object') setCollapsed(parsed);\n }\n } catch {}\n }, []);\n\n useEffect(() => {\n // Ensure keys exist for current dropdown categories\n setCollapsed(prev => {\n const next: CollapsedMap = { ...prev };\n navItems.forEach(it => {\n if (it.type === 'dropdown' && typeof it.id === 'number' && typeof next[it.id] === 'undefined') {\n next[it.id] = false; // default expanded\n }\n });\n return next;\n });\n }, [navItems]);\n\n const toggleCollapsed = useCallback((id?: number) => {\n if (!id) return;\n setCollapsed(prev => {\n const next = { ...prev, [id]: !prev[id] } as CollapsedMap;\n try { localStorage.setItem(COLLAPSE_KEY, JSON.stringify(next)); } catch {}\n return next;\n });\n }, []);\n\n // The scroll handling is now managed by the useAdminNavScrollRetention hook\n\n // Load dynamic navigation from API\n useEffect(() => {\n let active = true;\n // Editors: load editor-allowed admin navigation\n if (!isAdmin) {\n (async () => {\n try {\n setNavLoading(true);\n const editorItems = await getEditorAllowedAdminNav();\n if (active) {\n setNavItems(editorItems || []);\n }\n } catch (e) {\n if (active) setNavItems([]);\n } finally {\n if (active) setNavLoading(false);\n }\n })();\n return () => { active = false };\n }\n (async () => {\n try {\n const items = await getAllNavigationItems();\n if (active && Array.isArray(items)) {\n // Filter only admin navigation items\n const adminItems = items.filter(item => item.requires_admin);\n \n // Auto-seed if admin navigation is empty and user is admin\n if (adminItems.length === 0 && isAdmin) {\n try {\n console.log('Admin navigation empty, auto-seeding...');\n await seedDefaultNavigation();\n const newItems = await getAllNavigationItems();\n if (active && Array.isArray(newItems)) {\n const newAdminItems = newItems.filter(item => item.requires_admin);\n setNavItems(newAdminItems);\n }\n } catch (seedError) {\n console.error('Auto-seed failed:', seedError);\n // Continue with empty navigation (will show fallback)\n setNavItems(adminItems);\n }\n } else {\n // If admin navigation exists but specific required items are missing (e.g., 'about'),\n // trigger idempotent seed to backfill missing ones and reload once.\n const hasAboutItem = adminItems.some(it => {\n if (it.page_type === 'about') return true;\n if (Array.isArray(it.children)) {\n return it.children.some(c => c.page_type === 'about' || c.url === '/admin/o-klubu');\n }\n return false;\n });\n if (!hasAboutItem && isAdmin && !seedFixRef.current.about) {\n try {\n seedFixRef.current.about = true;\n await seedDefaultNavigation();\n const reloaded = await getAllNavigationItems();\n if (active && Array.isArray(reloaded)) {\n const reloadedAdmin = reloaded.filter(item => item.requires_admin);\n setNavItems(reloadedAdmin);\n }\n } catch (e) {\n console.warn('Seed backfill for about failed:', e);\n setNavItems(adminItems);\n }\n } else {\n setNavItems(adminItems);\n }\n }\n }\n } catch (error) {\n console.error('Failed to load admin navigation:', error);\n } finally {\n if (active) setNavLoading(false);\n }\n })();\n return () => { active = false };\n }, [isAdmin]);\n\n // Auto-scroll to current page when navigation loads\n useEffect(() => {\n if (isReady && !navLoading) {\n scrollToCurrentPage();\n debug('Auto-scroll to current page after navigation load');\n }\n }, [isReady, navLoading, scrollToCurrentPage, debug]);\n\n return (\n <Box\n as=\"nav\"\n position=\"fixed\"\n left={0}\n top={0}\n bottom={0}\n width={{ base: '320px', md: '260px' }}\n bg={bg}\n borderRightWidth={borderRight}\n borderColor={borderColor}\n pt={{ base: 16, md: 5 }}\n display={{ base: isOpen ? 'block' : 'none', md: 'block' }}\n zIndex={{ base: 11, md: 10 }}\n overflowY=\"auto\"\n overflowX=\"hidden\"\n boxShadow={{ base: 'lg', md: 'none' }}\n transform={{ base: isOpen ? 'translateX(0)' : 'translateX(-100%)', md: 'translateX(0)' }}\n transition=\"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\"\n ref={scrollRef}\n onScroll={undefined}\n data-sidebar=\"true\"\n css={{\n '&::-webkit-scrollbar': { width: '4px' },\n '&::-webkit-scrollbar-track': { background: 'transparent' },\n '&::-webkit-scrollbar-thumb': { background: scrollThumb, borderRadius: '2px' },\n '&::-webkit-scrollbar-thumb:hover': { background: scrollThumbHover },\n }}\n >\n <VStack align=\"stretch\" spacing={{ base: 2, md: 1 }} px={{ base: 6, md: 3 }} pb={6}>\n {/* Close button for mobile */}\n <Flex justify=\"flex-end\" display={{ base: 'flex', md: 'none' }} w=\"100%\" mb={2}>\n <IconButton\n aria-label=\"Zavřít menu\"\n icon={<FaTimes />}\n variant=\"ghost\"\n onClick={onClose}\n size=\"sm\"\n borderRadius=\"full\"\n _hover={{ bg: useColorModeValue('gray.100', 'gray.700') }}\n />\n </Flex>\n \n <Box px={{ base: 6, md: 3 }} mb={{ base: 6, md: 4 }}>\n <Flex align=\"center\" gap={{ base: 4, md: 3 }} mb={2}>\n <Image \n src={assetUrl(publicSettings?.club_logo_url) || publicSettings?.club_logo_url || '/dist/img/logo-club-empty.svg'} \n alt=\"Club Logo\" \n boxSize={{ base: '56px', md: '48px' }}\n objectFit=\"contain\"\n fallbackSrc=\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Crect width='100' height='100' fill='%23e2e8f0'/%3E%3Ctext x='50' y='55' text-anchor='middle' font-size='40' fill='%23718096'%3EMC%3C/text%3E%3C/svg%3E\"\n borderRadius=\"md\"\n />\n <VStack align=\"start\" spacing={0}>\n <Text \n fontSize={{ base: '2xl', md: 'xl' }} \n fontWeight=\"extrabold\"\n color={useColorModeValue('gray.800', 'white')}\n letterSpacing=\"tight\"\n >\n My Club\n </Text>\n <Text fontSize={{ base: 'sm', md: 'xs' }} color={useColorModeValue('gray.500', 'gray.400')} fontWeight=\"semibold\" textTransform=\"uppercase\" letterSpacing=\"wider\">\n Admin Panel\n </Text>\n </VStack>\n </Flex>\n </Box>\n \n {renderNavItem({\n icon: FaHome, \n to: \"/\",\n onClick: onClose,\n children: \"Zpět na web\"\n })}\n \n <Divider my={2} />\n \n {/* Dynamic Navigation */}\n {navLoading ? (\n <Flex justify=\"center\" py={8}>\n <Spinner size=\"sm\" />\n </Flex>\n ) : navItems.length > 0 ? (\n // Render dynamic navigation with collapsible categories\n <>\n {navItems.filter(item => {\n // Hide E-shop category if e-shop is disabled\n if (item.label === 'E-shop' && !isEshopEnabled) {\n return false;\n }\n return item.visible;\n }).map((item, index) => {\n const isCategory = item.type === 'dropdown';\n const hasChildren = Array.isArray(item.children) && item.children.length > 0;\n const catCollapsed = !!(item.id && collapsed[item.id]);\n const categoryHeader = (\n <Box px={2} py={2} onClick={() => toggleCollapsed(item.id)} cursor=\"pointer\" role=\"button\" aria-expanded={!catCollapsed}>\n <Flex align=\"center\" gap={2}>\n <Box flex=\"1\" height=\"1px\" bg={dividerColor} />\n <Text fontSize=\"xs\" fontWeight=\"bold\" textTransform=\"uppercase\" letterSpacing=\"wider\" color={categoryTextColor}>\n {item.label}\n </Text>\n <Icon as={catCollapsed ? ChevronRightIcon : ChevronDownIcon} boxSize={3.5} color={categoryIconColor} />\n <Box flex=\"1\" height=\"1px\" bg={dividerColor} />\n </Flex>\n </Box>\n );\n\n if (isCategory) {\n return (\n <Box>\n {categoryHeader}\n {hasChildren && (\n <Collapse in={!catCollapsed} animateOpacity unmountOnExit>\n <VStack align=\"stretch\" spacing={1} px={1}>\n {item.children!.filter(c => {\n // Hide manual FACR if not in manual club data mode\n if (c.page_type === 'manual_facr' && !isManualClubDataMode) {\n return false;\n }\n return c.visible;\n }).map((child, cidx) => {\n const childIcon = getIconForPageType(child.page_type);\n const childUrl = child.url || '#';\n const showBadge = child.page_type === 'activities' && upcomingCount > 0;\n return renderNavItem({\n icon: childIcon,\n to: childUrl,\n onClick: onClose,\n children: (\n <Text as=\"span\">\n {child.label}\n {showBadge && (\n <Text as=\"span\" ml={2} fontSize=\"10px\" px={2} py={0.5} borderRadius=\"full\" bg={badgeBgGreen} color={badgeColorGreen} borderWidth=\"1px\" borderColor={badgeBorderGreen}>\n {upcomingCount}\n </Text>\n )}\n </Text>\n )\n });\n })}\n </VStack>\n </Collapse>\n )}\n </Box>\n );\n }\n\n // Non-category top-level item\n // Hide manual FACR if not in manual club data mode\n if (item.page_type === 'manual_facr' && !isManualClubDataMode) {\n return null;\n }\n const itemIcon = getIconForPageType(item.page_type);\n const itemUrl = item.url || '#';\n const isActivities = item.page_type === 'activities';\n const showBadge = isActivities && upcomingCount > 0;\n return renderNavItem({\n icon: itemIcon,\n to: itemUrl,\n onClick: onClose,\n children: (\n <Text as=\"span\">\n {item.label}\n {showBadge && (\n <Text as=\"span\" ml={2} fontSize=\"10px\" px={2} py={0.5} borderRadius=\"full\" bg={badgeBgGreen} color={badgeColorGreen} borderWidth=\"1px\" borderColor={badgeBorderGreen}>\n {upcomingCount}\n </Text>\n )}\n </Text>\n )\n });\n })}\n\n {/* Ensure Shortlinks is present even if not configured in dynamic nav (admins only) */}\n {isAdmin && !hasShortlinks && renderNavItem({\n icon: FaLink,\n to: \"/admin/shortlinks\",\n onClick: onClose,\n children: \"Zkrácené odkazy\"\n })}\n\n {/* Ensure Engagement page is present even if not configured in dynamic nav (admins only) */}\n {isAdmin && !hasEngagement && (\n <NavItem \n icon={FaAward}\n to=\"/admin/engagement\"\n onClick={onClose}\n >\n Odměny & Úspěchy\n </NavItem>\n )}\n\n {/* Ensure Comments moderation is present even if not configured in dynamic nav (admins only) */}\n {isAdmin && !hasComments && (\n <NavItem\n icon={FaComments}\n to=\"/admin/komentare\"\n onClick={onClose}\n >\n Komentáře\n </NavItem>\n )}\n {/* Ensure Sweepstakes is present even if not configured in dynamic nav (admins only) */}\n {isAdmin && !hasSweepstakes && (\n <NavItem\n icon={FaGift}\n to=\"/admin/sweepstakes\"\n onClick={onClose}\n >\n Soutěže\n </NavItem>\n )}\n {/* Ensure Competition Aliases is present even if not configured in dynamic nav (admins only) */}\n {isAdmin && !hasCompetitionAliases && (\n <NavItem\n icon={FaAward}\n to=\"/admin/aliasy-soutezi\"\n onClick={onClose}\n >\n Alias soutěží\n </NavItem>\n )}\n \n {/* Ensure Clothing is present even if not configured in dynamic nav (admins only) */}\n {isAdmin && !hasClothing && (\n <NavItem\n icon={FaTshirt}\n to=\"/admin/obleceni\"\n onClick={onClose}\n >\n Oblečení\n </NavItem>\n )}\n\n {/* Ensure E-shop products are present even if not configured in dynamic nav (admins only) - ONLY if e-shop is enabled */}\n {isAdmin && !hasEshopProducts && isEshopEnabled && (\n <NavItem\n icon={FaTshirt}\n to=\"/admin/eshop-produkty\"\n onClick={onClose}\n >\n Eshop produkty\n </NavItem>\n )}\n\n {/* Ensure About page (O klubu) and other core admin pages are present (admins only) */}\n {isAdmin && !hasAbout && (\n <NavItem\n icon={FaBook}\n to=\"/admin/o-klubu\"\n onClick={onClose}\n >\n O klubu\n </NavItem>\n )}\n {isAdmin && !hasVideos && (\n <NavItem\n icon={FaVideo}\n to=\"/admin/videa\"\n onClick={onClose}\n >\n Videa\n </NavItem>\n )}\n {isAdmin && !hasGallery && (\n <NavItem\n icon={FaImage}\n to=\"/admin/galerie\"\n onClick={onClose}\n >\n Galerie (Zonerama)\n </NavItem>\n )}\n {isAdmin && !hasScoreboard && (\n <NavItem\n icon={FaTachometerAlt}\n to=\"/admin/scoreboard\"\n onClick={onClose}\n >\n Tabule (Scoreboard)\n </NavItem>\n )}\n {isAdmin && !hasScoreboardRemote && (\n <NavItem\n icon={FaMobileAlt}\n to=\"/admin/scoreboard/remote\"\n onClick={onClose}\n >\n Scoreboard Remote\n </NavItem>\n )}\n {isAdmin && !hasSponsors && (\n <NavItem\n icon={FaHandshake}\n to=\"/admin/sponzori\"\n onClick={onClose}\n >\n Sponzoři\n </NavItem>\n )}\n {isAdmin && !hasBanners && (\n <NavItem\n icon={FaImage}\n to=\"/admin/bannery\"\n onClick={onClose}\n >\n Bannery\n </NavItem>\n )}\n {isAdmin && !hasMessages && (\n <NavItem\n icon={FaEnvelope}\n to=\"/admin/zpravy\"\n onClick={onClose}\n >\n Zprávy\n </NavItem>\n )}\n {isAdmin && !hasContacts && (\n <NavItem\n icon={FaAddressBook}\n to=\"/admin/kontakty\"\n onClick={onClose}\n >\n Kontakty\n </NavItem>\n )}\n {isAdmin && !hasNewsletter && (\n <NavItem\n icon={FaPaperPlane}\n to=\"/admin/newsletter\"\n onClick={onClose}\n >\n Zpravodaj\n </NavItem>\n )}\n {isAdmin && !hasPolls && (\n <NavItem\n icon={FaPoll}\n to=\"/admin/ankety\"\n onClick={onClose}\n >\n Ankety\n </NavItem>\n )}\n {isAdmin && !hasAnalytics && (\n <NavItem \n icon={FaChartBar} \n to=\"/admin/analytika\"\n onClick={onClose}\n >\n Analytika\n </NavItem>\n )}\n {isAdmin && !hasNavigation && (\n <NavItem \n icon={FaBars} \n to=\"/admin/navigace\"\n onClick={onClose}\n >\n Navigace\n </NavItem>\n )}\n {isAdmin && !hasUsers && (\n <NavItem \n icon={FaUsers} \n to=\"/admin/uzivatele\"\n onClick={onClose}\n >\n Uživatelé\n </NavItem>\n )}\n {isAdmin && !hasFiles && (\n <NavItem \n icon={FaFolder} \n to=\"/admin/soubory\"\n onClick={onClose}\n >\n Soubory\n </NavItem>\n )}\n {isAdmin && !hasSettingsPage && (\n <NavItem \n icon={FaPalette} \n to=\"/admin/nastaveni\"\n onClick={onClose}\n >\n Nastavení\n </NavItem>\n )}\n {isAdmin && !hasPrefetch && (\n <NavItem \n icon={FaSyncAlt}\n to=\"/admin/prefetch\"\n onClick={onClose}\n >\n Prefetch & Cache\n </NavItem>\n )}\n {isAdmin && !hasManualData && isManualClubDataMode && (\n <NavItem\n icon={FaFileAlt}\n to=\"/admin/manual-data\"\n onClick={onClose}\n >\n Manuální data soutěží\n </NavItem>\n )}\n </>\n ) : (\n // Fallback to hardcoded navigation\n <>\n <Text fontSize=\"xs\" fontWeight=\"bold\" px={4} py={2} color={headerMutedColor} textTransform=\"uppercase\" letterSpacing=\"wider\">\n Hlavní\n </Text>\n \n {isAdmin && (\n <NavItem \n icon={FaTachometerAlt} \n to=\"/admin\"\n onClick={onClose}\n >\n Nástěnka\n </NavItem>\n )}\n {isAdmin && isManualClubDataMode && (\n <NavItem \n icon={FaFileAlt} \n to=\"/admin/manual-data\"\n onClick={onClose}\n >\n Manuální data soutěží\n </NavItem>\n )}\n \n {isAdmin && (\n <NavItem \n icon={FaChartBar} \n to=\"/admin/analytika\"\n onClick={onClose}\n >\n Analytika\n </NavItem>\n )}\n \n <Text fontSize=\"xs\" fontWeight=\"bold\" px={4} py={2} color={headerMutedColor} textTransform=\"uppercase\" letterSpacing=\"wider\" mt={4}>\n Obsah\n </Text>\n {/* Core sports entities first */}\n {isAdmin && (\n <>\n <NavItem \n icon={FaUsers} \n to=\"/admin/tymy\"\n onClick={onClose}\n >\n Týmy\n </NavItem>\n <NavItem \n icon={FaCalendarAlt} \n to=\"/admin/zapasy\"\n onClick={onClose}\n >\n {/* Add subtle scroller hint */}\n <Text as=\"span\">\n Zápasy\n <Text as=\"span\" ml={2} fontSize=\"10px\" px={2} py={0.5} borderRadius=\"full\" bg={badgeBgGray} color={badgeColorGray} borderWidth=\"1px\" borderColor={badgeBorderGray}>\n scroller\n </Text>\n </Text>\n </NavItem>\n </>\n )}\n <NavItem \n icon={FaCalendarAlt} \n to=\"/admin/aktivity\"\n onClick={onClose}\n >\n <Text as=\"span\">\n Aktivity\n {upcomingCount > 0 && (\n <Text as=\"span\" ml={2} fontSize=\"10px\" px={2} py={0.5} borderRadius=\"full\" bg={badgeBgGreen} color={badgeColorGreen} borderWidth=\"1px\" borderColor={badgeBorderGreen}>\n {upcomingCount}\n </Text>\n )}\n </Text>\n </NavItem>\n {isAdmin && (\n <NavItem \n icon={FaFutbol} \n to=\"/admin/hraci\"\n onClick={onClose}\n >\n Hráči\n </NavItem>\n )}\n {/* Other content */}\n <NavItem \n icon={FaNewspaper} \n to=\"/admin/clanky\"\n onClick={onClose}\n >\n Články\n </NavItem>\n <NavItem \n icon={FaLink} \n to=\"/admin/shortlinks\"\n onClick={onClose}\n >\n Zkrácené odkazy\n </NavItem>\n {isAdmin && (\n <>\n <NavItem \n icon={FaBook} \n to=\"/admin/o-klubu\"\n onClick={onClose}\n >\n O klubu\n </NavItem>\n <NavItem \n icon={FaImage} \n to=\"/admin/videa\"\n onClick={onClose}\n >\n Videa\n </NavItem>\n <NavItem \n icon={FaImage} \n to=\"/admin/galerie\"\n onClick={onClose}\n >\n Galerie (Zonerama)\n </NavItem>\n <NavItem \n icon={FaTachometerAlt} \n to=\"/admin/scoreboard\"\n onClick={onClose}\n >\n Tabule (Scoreboard)\n </NavItem>\n <NavItem \n icon={FaMobileAlt} \n to=\"/admin/scoreboard/remote\"\n onClick={onClose}\n >\n Scoreboard Remote\n </NavItem>\n <NavItem \n icon={FaPalette} \n to=\"/admin/obleceni\"\n onClick={onClose}\n >\n Oblečení\n </NavItem>\n <NavItem \n icon={FaHandshake} \n to=\"/admin/sponzori\"\n onClick={onClose}\n >\n Sponzoři\n </NavItem>\n <NavItem \n icon={FaImage} \n to=\"/admin/bannery\"\n onClick={onClose}\n >\n Bannery\n </NavItem>\n <NavItem \n icon={FaEnvelope} \n to=\"/admin/zpravy\"\n onClick={onClose}\n >\n Zprávy\n </NavItem>\n <NavItem \n icon={FaComments}\n to=\"/admin/komentare\"\n onClick={onClose}\n >\n Komentáře\n </NavItem>\n <NavItem \n icon={FaAddressBook} \n to=\"/admin/kontakty\"\n onClick={onClose}\n >\n Kontakty\n </NavItem>\n <NavItem \n icon={FaPaperPlane} \n to=\"/admin/newsletter\"\n onClick={onClose}\n >\n Zpravodaj\n </NavItem>\n <NavItem \n icon={FaPoll} \n to=\"/admin/ankety\"\n onClick={onClose}\n >\n Ankety\n </NavItem>\n <NavItem \n icon={FaAward} \n to=\"/admin/engagement\"\n onClick={onClose}\n >\n Odměny & Úspěchy\n </NavItem>\n </>\n )}\n <Divider my={2} />\n \n {isAdmin && (\n <>\n <Text fontSize=\"xs\" fontWeight=\"bold\" px={4} py={2} color={headerMutedColor} textTransform=\"uppercase\" letterSpacing=\"wider\" mt={4}>\n Nastavení\n </Text>\n \n <NavItem \n icon={FaBars} \n to=\"/admin/navigace\"\n onClick={onClose}\n >\n Navigace\n </NavItem>\n \n <NavItem \n icon={FaAward} \n to=\"/admin/aliasy-soutezi\"\n onClick={onClose}\n >\n Alias soutěží\n </NavItem>\n\n <NavItem \n icon={FaSyncAlt}\n to=\"/admin/prefetch\"\n onClick={onClose}\n >\n Prefetch & Cache\n </NavItem>\n\n <NavItem \n icon={FaUsers} \n to=\"/admin/uzivatele\"\n onClick={onClose}\n >\n Uživatelé\n </NavItem>\n <NavItem \n icon={FaPalette} \n to=\"/admin/nastaveni\"\n onClick={onClose}\n >\n Nastavení\n </NavItem>\n <NavItem \n icon={FaLink} \n to=\"/admin/shortlinks\"\n onClick={onClose}\n >\n Zkrácené odkazy\n </NavItem>\n <NavItem \n icon={FaFolder} \n to=\"/admin/soubory\"\n onClick={onClose}\n >\n Soubory\n </NavItem>\n </>\n )}\n </>\n )}\n \n <Box mt=\"auto\" mb={4} px={2}>\n <ChakraLink\n as=\"button\"\n display=\"flex\"\n alignItems=\"center\"\n w=\"100%\"\n px={4}\n py={2}\n borderRadius=\"md\"\n _hover={{\n textDecoration: 'none',\n bg: useColorModeValue('red.50', 'red.900'),\n color: 'red.500',\n }}\n onClick={logout}\n color={useColorModeValue('red.500', 'red.300')}\n >\n <Icon as={FaSignOutAlt} mr={3} />\n <Text>Odhlásit se</Text>\n </ChakraLink>\n </Box>\n </VStack>\n </Box>\n );\n};\n\nexport default AdminSidebar;\n","import { useEffect, useRef, useCallback, useState } from 'react';\nimport { useLocation } from 'react-router-dom';\n\ninterface UseAdminNavScrollRetentionOptions {\n scrollContainerSelector?: string;\n navItemSelector?: string;\n enableDebug?: boolean;\n}\n\nexport const useAdminNavScrollRetention = (options: UseAdminNavScrollRetentionOptions = {}) => {\n const {\n scrollContainerSelector = '[data-sidebar=\"true\"]',\n navItemSelector = 'a[href*=\"/admin/\"]',\n enableDebug = false\n } = options;\n \n const location = useLocation();\n const scrollContainerRef = useRef<HTMLElement | null>(null);\n const isScrollingRef = useRef<boolean>(false);\n const [isReady, setIsReady] = useState(false);\n \n const debug = useCallback((message: string, data?: any) => {\n if (enableDebug) {\n console.log(`[AdminNavScroll] ${message}`, data || '');\n }\n }, [enableDebug]);\n\n // Always log critical events for debugging\n const log = useCallback((message: string, data?: any) => {\n console.log(`[AdminNavScroll] ${message}`, data || '');\n }, []);\n\n // Get scroll container element\n const getScrollContainer = useCallback((): HTMLElement | null => {\n if (scrollContainerRef.current) {\n return scrollContainerRef.current;\n }\n \n const container = document.querySelector(scrollContainerSelector) as HTMLElement;\n if (container) {\n scrollContainerRef.current = container;\n debug('Found scroll container:', container);\n }\n return container;\n }, [scrollContainerSelector, debug]);\n\n // Find the nav item for the current path\n const findCurrentNavItem = useCallback((): HTMLElement | null => {\n const container = getScrollContainer();\n if (!container) return null;\n\n // Find nav item that matches current pathname\n const navItems = container.querySelectorAll(navItemSelector);\n for (let i = 0; i < navItems.length; i++) {\n const item = navItems[i] as HTMLElement;\n const href = item.getAttribute('href');\n if (href === location.pathname) {\n log('Found current nav item:', { href, element: item });\n return item;\n }\n }\n\n // Try partial match if exact match not found\n for (let i = 0; i < navItems.length; i++) {\n const item = navItems[i] as HTMLElement;\n const href = item.getAttribute('href');\n if (href && location.pathname.startsWith(href) && href !== '/admin') {\n log('Found partial match nav item:', { href, pathname: location.pathname, element: item });\n return item;\n }\n }\n\n debug('No matching nav item found for:', location.pathname);\n return null;\n }, [getScrollContainer, navItemSelector, location.pathname, log, debug]);\n\n // Scroll to center the current nav item\n const scrollToCurrentPage = useCallback(() => {\n const container = getScrollContainer();\n if (!container || isScrollingRef.current) {\n return;\n }\n\n const navItem = findCurrentNavItem();\n if (!navItem) {\n debug('No nav item to scroll to');\n return;\n }\n\n isScrollingRef.current = true;\n\n // Calculate scroll position to center the item\n const containerRect = container.getBoundingClientRect();\n const itemRect = navItem.getBoundingClientRect();\n \n // Calculate item position relative to container\n const itemTopRelativeToContainer = itemRect.top - containerRect.top + container.scrollTop;\n const itemHeight = itemRect.height;\n const containerHeight = containerRect.height;\n \n // Center the item in the viewport\n const targetScrollTop = itemTopRelativeToContainer - (containerHeight / 2) + (itemHeight / 2);\n \n // Ensure we don't scroll beyond bounds\n const maxScrollTop = container.scrollHeight - containerHeight;\n const finalScrollTop = Math.max(0, Math.min(targetScrollTop, maxScrollTop));\n\n log('🎯 Centering nav item:', { \n pathname: location.pathname,\n itemTopRelativeToContainer,\n targetScrollTop,\n finalScrollTop,\n containerHeight,\n itemHeight\n });\n\n // Smooth scroll to position\n container.scrollTo({\n top: finalScrollTop,\n behavior: 'smooth'\n });\n\n // Mark scrolling as complete after animation\n setTimeout(() => {\n isScrollingRef.current = false;\n log('✅ Scroll to current page completed');\n }, 300);\n \n }, [getScrollContainer, findCurrentNavItem, location.pathname, log, debug]);\n\n // Handle navigation - scroll to current page\n useEffect(() => {\n log('🧭 Navigation detected:', location.pathname);\n \n // Scroll to current page after a short delay to allow DOM to update\n const scrollTimer = setTimeout(() => {\n scrollToCurrentPage();\n }, 100);\n \n return () => clearTimeout(scrollTimer);\n }, [location.pathname, scrollToCurrentPage, log]);\n\n // Initialize and scroll to current page when component mounts\n useEffect(() => {\n const initTimer = setTimeout(() => {\n const container = getScrollContainer();\n if (container) {\n setIsReady(true);\n \n // Scroll to current page\n scrollToCurrentPage();\n \n log('✅ Initialization completed');\n } else {\n debug('Scroll container not found after delay');\n }\n }, 150); // Slightly longer delay to ensure nav items are rendered\n\n return () => {\n clearTimeout(initTimer);\n };\n }, [getScrollContainer, scrollToCurrentPage, log, debug]);\n\n return {\n scrollToCurrentPage,\n scrollPosition: scrollContainerRef.current?.scrollTop || 0,\n isReady,\n debug\n };\n};\n","import { \n Box, \n Flex, \n IconButton, \n Text, \n Menu, \n MenuButton, \n MenuList, \n MenuItem, \n Avatar, \n useColorModeValue,\n HStack,\n BoxProps,\n Tooltip,\n Link as ChakraLink\n} from '@chakra-ui/react';\nimport { FaBars, FaSignOutAlt, FaUserCog, FaBook } from 'react-icons/fa';\nimport { useAuth } from '../../contexts/AuthContext';\nimport { User } from '../../types';\nimport { ReactNode } from 'react';\nimport { Link as RouterLink } from 'react-router-dom';\nimport { ThemeToggle } from '@/components/ui/theme-toggle';\n\ninterface AdminHeaderProps extends BoxProps {\n onMenuToggle: () => void;\n rightContent?: ReactNode;\n}\n\nconst AdminHeader = ({ onMenuToggle, rightContent, ...rest }: AdminHeaderProps) => {\n const { user, logout } = useAuth();\n const bg = useColorModeValue('white', '#1a1d29');\n const borderColor = useColorModeValue('gray.200', 'rgba(255, 255, 255, 0.12)');\n const textColor = useColorModeValue('gray.800', '#e2e8f0');\n const userData = user as User | null;\n const headerShadow = useColorModeValue('sm', 'none');\n\n return (\n <Box\n as=\"header\"\n position=\"sticky\"\n top={0}\n left={0}\n right={0}\n bg={bg}\n borderBottomWidth=\"1px\"\n borderColor={borderColor}\n zIndex={20}\n height=\"60px\"\n px={{ base: 3, md: 6 }}\n boxShadow={headerShadow}\n transition=\"all 0.2s\"\n {...rest}\n >\n <Flex h=\"100%\" alignItems=\"center\" justifyContent=\"space-between\">\n <Flex alignItems=\"center\">\n <IconButton\n display={{ base: 'flex', md: 'none' }}\n aria-label=\"Otevřít menu\"\n icon={<FaBars />}\n variant=\"ghost\"\n onClick={onMenuToggle}\n mr={2}\n />\n <Text fontSize=\"xl\" fontWeight=\"bold\" display={{ base: 'none', md: 'block' }}>\n Fotbal Admin\n </Text>\n </Flex>\n\n <HStack spacing={4}>\n {rightContent || (\n <>\n <Tooltip label=\"Dokumentace\" hasArrow>\n <ChakraLink as={RouterLink} to=\"/admin/docs\">\n <IconButton\n aria-label=\"Dokumentace\"\n icon={<FaBook />}\n variant=\"ghost\"\n size=\"sm\"\n mr={1}\n />\n </ChakraLink>\n </Tooltip>\n <ThemeToggle />\n \n <Menu>\n <MenuButton>\n <Avatar \n size=\"sm\" \n name={userData?.name || 'Uživatel'} \n src={userData?.avatar}\n cursor=\"pointer\"\n border=\"2px solid\"\n borderColor={useColorModeValue('gray.200', 'gray.600')}\n _hover={{\n transform: 'scale(1.05)',\n transition: 'transform 0.2s'\n }}\n />\n </MenuButton>\n <MenuList zIndex={30}>\n {userData?.name && (\n <Box px={3} py={2} borderBottomWidth=\"1px\" borderColor={borderColor}>\n <Text fontWeight=\"medium\">{userData.name}</Text>\n <Text fontSize=\"sm\" color=\"gray.500\">{userData.email}</Text>\n </Box>\n )}\n <MenuItem \n icon={<FaUserCog />}\n _hover={{\n bg: useColorModeValue('gray.100', 'gray.700')\n }}\n >\n Můj účet\n </MenuItem>\n <MenuItem \n icon={<FaSignOutAlt />}\n color=\"red.500\"\n _hover={{\n bg: useColorModeValue('red.50', 'red.900')\n }}\n onClick={logout}\n >\n Odhlásit se\n </MenuItem>\n </MenuList>\n </Menu>\n </>\n )}\n </HStack>\n </Flex>\n </Box>\n );\n};\n\nexport default AdminHeader;\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalCloseButton,\n ModalBody,\n InputGroup,\n InputLeftElement,\n Input,\n List,\n ListItem,\n HStack,\n Text,\n Badge,\n Icon,\n Box,\n Kbd,\n} from '@chakra-ui/react';\nimport { FaSearch, FaCog, FaNewspaper, FaUsers, FaImage, FaHandshake, FaEnvelope, FaAward, FaSyncAlt, FaVideo, FaCalendarAlt, FaPalette, FaCommentAlt, FaKey, FaChartLine, FaBook, FaTools, FaBell, FaBars, FaFolderOpen, FaFutbol, FaTachometerAlt, FaLightbulb, FaBug, FaAddressBook, FaChalkboard, FaMobileAlt, FaInfoCircle, FaListOl, FaBolt, FaEdit, FaPaintBrush, FaLifeRing, FaQrcode, FaPoll, FaHashtag, FaTicketAlt, FaTrash, FaExclamationTriangle, FaFlag, FaGavel, FaClipboardList, FaStar, FaTrophy, FaGift, FaShoppingCart, FaLink, FaArrowUp, FaPhotoVideo, FaTshirt, FaGlobe } from 'react-icons/fa';\n\nexport type AdminSearchItem = {\n label: string;\n path: string;\n section: string;\n keywords?: string[];\n icon?: any;\n};\n\nconst adminIndex: AdminSearchItem[] = [\n // Core Admin Pages\n { label: 'Dashboard', path: '/admin', section: 'Základní', keywords: ['overview', 'stat', 'dashboard', 'přehled'], icon: FaTachometerAlt },\n { label: 'Články', path: '/admin/clanky', section: 'Obsah', keywords: ['articles', 'posts', 'blog', 'články'], icon: FaNewspaper },\n { label: 'Kategorie článků', path: '/admin/kategorie', section: 'Obsah', keywords: ['categories', 'kategorie'], icon: FaHashtag },\n { label: 'Aktivity', path: '/admin/aktivity', section: 'Obsah', keywords: ['activities', 'events', 'akce', 'události'], icon: FaCalendarAlt },\n { label: 'Komentáře', path: '/admin/komentare', section: 'Obsah', keywords: ['comments', 'diskuse'], icon: FaCommentAlt },\n { label: 'Hráči', path: '/admin/hraci', section: 'Sport', keywords: ['players', 'hráči'], icon: FaUsers },\n { label: 'Týmy', path: '/admin/tymy', section: 'Sport', keywords: ['teams', 'týmy'], icon: FaUsers },\n { label: 'Zápasy', path: '/admin/zapasy', section: 'Sport', keywords: ['matches', 'facr', 'zápasy'], icon: FaCalendarAlt },\n { label: 'Alias soutěží', path: '/admin/aliasy', section: 'Sport', keywords: ['aliases', 'competition', 'soutěže'], icon: FaAward },\n { label: 'Tabulky', path: '/admin/tabulky', section: 'Sport', keywords: ['standings', 'table', 'tabulka'], icon: FaChartLine },\n { label: 'Tabule (Scoreboard)', path: '/admin/scoreboard', section: 'Sport', keywords: ['scoreboard', 'tabule', 'výsledky'], icon: FaChalkboard },\n { label: 'Galerie', path: '/admin/galerie', section: 'Média', keywords: ['gallery', 'zonerama', 'fotky'], icon: FaImage },\n { label: 'Videa', path: '/admin/videa', section: 'Média', keywords: ['youtube', 'videos', 'videa'], icon: FaVideo },\n { label: 'Soubory', path: '/admin/soubory', section: 'Média', keywords: ['files', 'uploads', 'soubory'], icon: FaFolderOpen },\n { label: 'Sponzoři', path: '/admin/sponzori', section: 'Marketing', keywords: ['sponsors', 'partners', 'sponzoři'], icon: FaHandshake },\n { label: 'Bannery', path: '/admin/bannery', section: 'Marketing', keywords: ['banners', 'reklama'], icon: FaImage },\n { label: 'Oblečení', path: '/admin/obleceni', section: 'Marketing', keywords: ['clothing', 'merch', 'eshop', 'obleceni'], icon: FaTshirt },\n { label: 'Ankety', path: '/admin/ankety', section: 'Marketing', keywords: ['polls', 'ankety', 'hlasování'], icon: FaPoll },\n { label: 'Soutěže', path: '/admin/souteze', section: 'Marketing', keywords: ['sweepstakes', 'souteže', 'akce'], icon: FaTrophy },\n { label: 'Odměny & Úspěchy', path: '/admin/odmeny', section: 'Marketing', keywords: ['engagement', 'rewards', 'odmeny', 'úspěchy'], icon: FaTrophy },\n { label: 'Zkrácené odkazy', path: '/admin/shortlinks', section: 'Marketing', keywords: ['shortlinks', 'zkrácené', 'odkazy'], icon: FaLink },\n { label: 'QR kódy', path: '/admin/qr', section: 'Marketing', keywords: ['qr', 'kódy', 'qrcode'], icon: FaQrcode },\n { label: 'Vstupenky', path: '/admin/vstupenky', section: 'Marketing', keywords: ['tickets', 'vstupenky', 'prodej'], icon: FaTicketAlt },\n { label: 'Newsletter', path: '/admin/newsletter', section: 'Komunikace', keywords: ['email', 'campaign', 'newsletter'], icon: FaEnvelope },\n { label: 'Zprávy', path: '/admin/zpravy', section: 'Komunikace', keywords: ['messages', 'zprávy'], icon: FaCommentAlt },\n { label: 'Kontakty', path: '/admin/kontakty', section: 'Komunikace', keywords: ['contacts', 'kontakty', 'formulář'], icon: FaAddressBook },\n { label: 'Notifikace', path: '/admin/notifications', section: 'Komunikace', keywords: ['notifications', 'notifikace'], icon: FaBell },\n { label: 'Analytika', path: '/admin/analytika', section: 'SEO', keywords: ['analytics', 'umami'], icon: FaChartLine },\n { label: 'O klubu', path: '/admin/o-klubu', section: 'Obsah', keywords: ['about', 'klub'], icon: FaPalette },\n { label: 'Nastavení', path: '/admin/nastaveni', section: 'Nastavení', keywords: ['settings', 'config', 'nastavení'], icon: FaCog },\n { label: 'Uživatelé', path: '/admin/uzivatele', section: 'Nastavení', keywords: ['users', 'accounts', 'uživatelé'], icon: FaKey },\n { label: 'Navigace', path: '/admin/navigace', section: 'Nastavení', keywords: ['navigation', 'menu', 'sidebar'], icon: FaBars },\n { label: 'Prefetch & Cache', path: '/admin/prefetch', section: 'Nástroje', keywords: ['cache', 'fetch', 'prefetch'], icon: FaSyncAlt },\n { label: 'Chybová hlášení', path: '/admin/chyby', section: 'Nástroje', keywords: ['errors', 'chyby', 'hlášení', 'log'], icon: FaBug },\n { label: 'Překlady (I18n)', path: '/admin/i18n', section: 'Nástroje', keywords: ['i18n', 'překlady', 'jazyky', 'translations'], icon: FaGlobe },\n { label: 'FACR manuál', path: '/admin/facr-manual', section: 'Nástroje', keywords: ['facr', 'manuál', 'import'], icon: FaFutbol },\n\n // Settings Sections (deep links)\n { label: 'Nastavení - Sociální sítě', path: '/admin/nastaveni#socialni-site', section: 'Nastavení', keywords: ['socialni', 'sítě', 'facebook', 'instagram', 'twitter'], icon: FaAddressBook },\n { label: 'Nastavení - Videa', path: '/admin/nastaveni#videa', section: 'Nastavení', keywords: ['videa', 'youtube', 'kanál'], icon: FaVideo },\n { label: 'Nastavení - SMTP', path: '/admin/nastaveni#smtp', section: 'Nastavení', keywords: ['smtp', 'email', 'odesílání'], icon: FaEnvelope },\n { label: 'Nastavení - Analytika', path: '/admin/nastaveni#analytika', section: 'Nastavení', keywords: ['umami', 'analytics', 'statistiky'], icon: FaChartLine },\n { label: 'Nastavení - SEO', path: '/admin/nastaveni#seo', section: 'Nastavení', keywords: ['seo', 'metadata', 'vyhledávače'], icon: FaSearch },\n { label: 'Nastavení - Obecné', path: '/admin/nastaveni#obecne', section: 'Nastavení', keywords: ['obecné', 'základní', 'klub'], icon: FaCog },\n\n // Documentation Sections\n { label: 'Dokumentace - Úvod', path: '/admin/docs#uvod', section: 'Dokumentace', keywords: ['docs', 'documentation', 'úvod'], icon: FaBook },\n { label: 'Dokumentace - Nastavení klubu', path: '/admin/docs#nastaveni', section: 'Dokumentace', keywords: ['docs', 'nastavení', 'konfigurace'], icon: FaBook },\n { label: 'Dokumentace - Dashboard', path: '/admin/docs#dashboard', section: 'Dokumentace', keywords: ['docs', 'dashboard', 'přehledy'], icon: FaBook },\n { label: 'Dokumentace - Články', path: '/admin/docs#clanky', section: 'Dokumentace', keywords: ['docs', 'články', 'blog'], icon: FaBook },\n { label: 'Dokumentace - Zápasy', path: '/admin/docs#zapasy', section: 'Dokumentace', keywords: ['docs', 'zápasy', 'facr'], icon: FaBook },\n { label: 'Dokumentace - Hráči a týmy', path: '/admin/docs#hraci-tymy', section: 'Dokumentace', keywords: ['docs', 'hráči', 'týmy'], icon: FaBook },\n { label: 'Dokumentace - Média', path: '/admin/docs#media', section: 'Dokumentace', keywords: ['docs', 'média', 'soubory'], icon: FaBook },\n { label: 'Dokumentace - Galerie', path: '/admin/docs#gallery', section: 'Dokumentace', keywords: ['docs', 'galerie', 'fotky'], icon: FaBook },\n { label: 'Dokumentace - Soubory', path: '/admin/docs#files', section: 'Dokumentace', keywords: ['docs', 'soubory', 'upload'], icon: FaBook },\n { label: 'Dokumentace - Sponzoři a bannery', path: '/admin/docs#sponzori-bannery', section: 'Dokumentace', keywords: ['docs', 'sponzoři', 'bannery'], icon: FaBook },\n { label: 'Dokumentace - Newsletter', path: '/admin/docs#newsletter', section: 'Dokumentace', keywords: ['docs', 'newsletter', 'email'], icon: FaBook },\n { label: 'Dokumentace - Alias soutěží', path: '/admin/docs#aliasy', section: 'Dokumentace', keywords: ['docs', 'alias', 'soutěže'], icon: FaBook },\n { label: 'Dokumentace - Prefetch', path: '/admin/docs#prefetch', section: 'Dokumentace', keywords: ['docs', 'prefetch', 'cache'], icon: FaBook },\n { label: 'Dokumentace - Videa', path: '/admin/docs#videa', section: 'Dokumentace', keywords: ['docs', 'videa', 'youtube'], icon: FaBook },\n { label: 'Dokumentace - Aktivity', path: '/admin/docs#aktivity', section: 'Dokumentace', keywords: ['docs', 'aktivity', 'události'], icon: FaBook },\n { label: 'Dokumentace - Oblečení', path: '/admin/docs#merch', section: 'Dokumentace', keywords: ['docs', 'obleceni', 'merch'], icon: FaBook },\n { label: 'Dokumentace - Zprávy', path: '/admin/docs#zpravy', section: 'Dokumentace', keywords: ['docs', 'zprávy', 'komunikace'], icon: FaBook },\n { label: 'Dokumentace - Kontakty', path: '/admin/docs#contacts', section: 'Dokumentace', keywords: ['docs', 'kontakty', 'formuláře'], icon: FaBook },\n { label: 'Dokumentace - Analytics', path: '/admin/docs#analytics', section: 'Dokumentace', keywords: ['docs', 'analytics', 'statistiky'], icon: FaBook },\n { label: 'Dokumentace - Scoreboard', path: '/admin/docs#scoreboard', section: 'Dokumentace', keywords: ['docs', 'scoreboard', 'tabule'], icon: FaBook },\n { label: 'Dokumentace - Mobilní scoreboard', path: '/admin/docs#mobile-scoreboard', section: 'Dokumentace', keywords: ['docs', 'mobilní', 'scoreboard'], icon: FaBook },\n { label: 'Dokumentace - Uživatelé', path: '/admin/docs#uzivatele', section: 'Dokumentace', keywords: ['docs', 'uživatelé', 'přístupy'], icon: FaBook },\n { label: 'Dokumentace - Interní dokumentace', path: '/admin/docs#docs', section: 'Dokumentace', keywords: ['docs', 'interní', 'vývoj'], icon: FaBook },\n { label: 'Dokumentace - Checklisty', path: '/admin/docs#checklist', section: 'Dokumentace', keywords: ['docs', 'checklist', 'postupy'], icon: FaBook },\n { label: 'Dokumentace - SEO', path: '/admin/docs#seo', section: 'Dokumentace', keywords: ['docs', 'seo', 'metadata'], icon: FaBook },\n { label: 'Dokumentace - Řešení problémů', path: '/admin/docs#troubleshooting', section: 'Dokumentace', keywords: ['docs', 'troubleshooting', 'problémy'], icon: FaBook },\n];\n\nfunction highlight(text: string, q: string) {\n if (!q) return text;\n try {\n const esc = q.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const re = new RegExp(esc, 'gi');\n const parts = text.split(re);\n const matches = text.match(re) || [];\n const out: any[] = [];\n parts.forEach((p, idx) => {\n out.push(p);\n if (idx < matches.length) out.push(<mark key={idx} style={{ backgroundColor: '#fde68a' }}>{matches[idx]}</mark>);\n });\n return <>{out}</>;\n } catch {\n return text;\n }\n}\n\nfunction score(item: AdminSearchItem, q: string) {\n const t = (item.label || '').toLowerCase();\n const b = q.toLowerCase();\n const kws = (item.keywords || []).join(' ').toLowerCase();\n let s = 0;\n if (!b) return s;\n if (t === b) s += 200;\n if (t.startsWith(b)) s += 120;\n if (t.includes(b)) s += 80 - t.indexOf(b);\n if (kws.includes(b)) s += 40;\n // Boost score for settings sections when searching for settings-related terms\n if (item.section === 'Nastavení' && (b.includes('nastavení') || b.includes('settings') || b.includes('config'))) s += 30;\n // Boost score for documentation when searching for help/docs\n if (item.section === 'Dokumentace' && (b.includes('docs') || b.includes('dokumentace') || b.includes('help') || b.includes('návod'))) s += 30;\n // Small preference for Docs when # present\n if (item.section === 'Dokumentace' && item.path.includes('#')) s += 5;\n return s;\n}\n\nexport default function AdminSearchModal({ isOpen, onClose, onSelectPath }: { isOpen: boolean; onClose: () => void; onSelectPath: (path: string) => void }) {\n const [q, setQ] = useState('');\n const [debounced, setDebounced] = useState('');\n const [idx, setIdx] = useState(-1);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n useEffect(() => {\n const id = setTimeout(() => setDebounced(q.trim()), 250);\n return () => clearTimeout(id);\n }, [q]);\n\n useEffect(() => {\n if (isOpen) {\n setQ('');\n setDebounced('');\n setIdx(-1);\n setTimeout(() => inputRef.current?.focus(), 50);\n }\n }, [isOpen]);\n\n const results = useMemo(() => {\n const arr = adminIndex.map((it) => ({ it, s: score(it, debounced) }))\n .filter((r) => r.s > 0 || !debounced)\n .sort((a, b) => b.s - a.s || a.it.label.localeCompare(b.it.label))\n .slice(0, 12)\n .map((r) => r.it);\n return arr;\n }, [debounced]);\n\n const onSelect = useCallback((path: string) => {\n onClose();\n onSelectPath(path);\n }, [onClose, onSelectPath]);\n\n const onKeyDown: React.KeyboardEventHandler<HTMLInputElement> = (e) => {\n const n = results.length;\n if (e.key === 'ArrowDown') { e.preventDefault(); setIdx((i) => Math.min(n - 1, i + 1)); }\n else if (e.key === 'ArrowUp') { e.preventDefault(); setIdx((i) => Math.max(-1, i - 1)); }\n else if (e.key === 'Enter') {\n const chosen = idx >= 0 ? results[idx] : results[0];\n if (chosen) onSelect(chosen.path);\n } else if ((e.ctrlKey || e.metaKey) && String(e.key || '').toLowerCase() === 'k') {\n e.preventDefault(); onClose();\n } else if (e.key === 'Escape') {\n onClose();\n }\n };\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} size=\"lg\" motionPreset=\"scale\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>\n Admin vyhledávání\n <Box as=\"span\" ml={3} color=\"gray.500\" fontSize=\"sm\">\n <Kbd>Ctrl</Kbd>+<Kbd>K</Kbd>\n </Box>\n </ModalHeader>\n <ModalCloseButton />\n <ModalBody pb={4}>\n <InputGroup size=\"lg\">\n <InputLeftElement pointerEvents=\"none\">\n <Icon as={FaSearch} />\n </InputLeftElement>\n <Input\n placeholder=\"Hledat stránky, nastavení, dokumentaci... (např. 'sociální sítě', 'články', 'scoreboard')\"\n value={q}\n onChange={(e) => { setQ(e.target.value); setIdx(-1); }}\n onKeyDown={onKeyDown}\n ref={inputRef}\n autoFocus\n />\n </InputGroup>\n\n <List mt={4} spacing={1}>\n {results.map((r, i) => (\n <ListItem\n key={r.path}\n px={3}\n py={2}\n borderRadius=\"md\"\n cursor=\"pointer\"\n bg={i === idx ? 'blackAlpha.50' : 'transparent'}\n _hover={{ bg: 'blackAlpha.50' }}\n onClick={() => onSelect(r.path)}\n >\n <HStack>\n {r.icon ? <Icon as={r.icon} color=\"blue.500\" /> : null}\n <Text fontWeight=\"semibold\">{highlight(r.label, debounced)}</Text>\n <Badge ml=\"auto\" colorScheme=\"gray\">{r.section}</Badge>\n </HStack>\n </ListItem>\n ))}\n {results.length === 0 && (\n <Box color=\"gray.500\" fontSize=\"sm\" px={1} py={2}>Žádné výsledky</Box>\n )}\n </List>\n </ModalBody>\n </ModalContent>\n </Modal>\n );\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport {\n IconButton,\n Tooltip,\n useDisclosure,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalCloseButton,\n ModalBody,\n ModalFooter,\n Button,\n Textarea,\n Text,\n Box,\n VStack,\n HStack,\n Badge,\n useColorModeValue,\n useToast,\n} from '@chakra-ui/react';\nimport { FaLifeRing } from 'react-icons/fa';\nimport { useLocation } from 'react-router-dom';\nimport { getRecentActions } from '../../services/actionLog';\nimport { reportError } from '../../services/errorReporter';\nimport { useAuth } from '../../contexts/AuthContext';\nimport { getAdminSettings } from '../../services/settings';\n\nexport default function AdminSupportButton() {\n const { isOpen, onOpen, onClose } = useDisclosure();\n const [message, setMessage] = useState('');\n const [submitting, setSubmitting] = useState(false);\n const location = useLocation();\n const toast = useToast();\n const { user } = useAuth();\n const [extUI, setExtUI] = useState<string>('');\n const [extToken, setExtToken] = useState<string>('');\n\n const actions = useMemo(() => getRecentActions(12), [isOpen]);\n const path = location.pathname + location.search;\n const bg = useColorModeValue('gray.50', 'gray.800');\n const border = useColorModeValue('gray.200', 'gray.600');\n\n const timeline = useMemo(() => {\n const now = Date.now();\n return actions.map((a) => {\n const ago = Math.max(0, Math.round((now - a.at) / 1000));\n if (a.type === 'nav') return `-${ago}s NAV ${a.path}`;\n return `-${ago}s ${a.method.toUpperCase()} ${a.url} ${a.status ?? ''} ${a.ms ? a.ms + 'ms' : ''}`.trim();\n });\n }, [actions]);\n\n // Load external error-review UI/token when modal opens\n useEffect(() => {\n if (!isOpen) return;\n (async () => {\n try {\n const s = await getAdminSettings();\n setExtUI(String((s as any).error_review_ui_url || ''));\n setExtToken(String((s as any).error_review_admin_token || ''));\n } catch {}\n })();\n }, [isOpen]);\n\n const submit = async () => {\n if (submitting) return;\n setSubmitting(true);\n try {\n await reportError({\n severity: 'warn',\n message: message?.trim() ? `Support: ${message.trim()}` : 'Support: bez popisu',\n tags: { type: 'support', source: 'admin' },\n context: { path, recentActions: actions },\n user_id: (user as any)?.id,\n url: path,\n });\n toast({ title: 'Odesláno', description: 'Děkujeme, ozveme se co nejdříve.', status: 'success', duration: 3000 });\n setMessage('');\n onClose();\n } catch {\n toast({ title: 'Chyba', description: 'Nepodařilo se odeslat.', status: 'error' });\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <>\n <Box position=\"fixed\" right={4} bottom={4} zIndex={40}>\n <Tooltip label=\"Zákaznická podpora\" hasArrow>\n <IconButton\n aria-label=\"Zákaznická podpora\"\n icon={<FaLifeRing />}\n onClick={onOpen}\n colorScheme=\"blue\"\n borderRadius=\"full\"\n boxShadow=\"lg\"\n />\n </Tooltip>\n </Box>\n <Modal isOpen={isOpen} onClose={onClose} size=\"lg\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Nahlásit problém</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack align=\"stretch\" spacing={4}>\n <HStack spacing={3}>\n <Badge colorScheme=\"blue\">Admin</Badge>\n <Text fontSize=\"sm\" color=\"gray.500\">{path}</Text>\n </HStack>\n <Box bg={bg} borderWidth=\"1px\" borderColor={border} borderRadius=\"md\" p={3} maxH=\"160px\" overflowY=\"auto\">\n <Text fontSize=\"xs\" color=\"gray.500\" mb={2}>Poslední akce</Text>\n <VStack align=\"stretch\" spacing={1}>\n {timeline.map((t, i) => (\n <Text key={i} fontFamily=\"mono\" fontSize=\"xs\">{t}</Text>\n ))}\n </VStack>\n </Box>\n <Textarea\n value={message}\n onChange={(e) => setMessage(e.target.value)}\n placeholder=\"Popište, co se stalo…\"\n rows={5}\n />\n </VStack>\n </ModalBody>\n <ModalFooter>\n <VStack align=\"stretch\" spacing={2} flex={1} mr={3}>\n <HStack>\n <Button size=\"sm\" variant=\"outline\" onClick={() => window.open('/admin/docs', '_blank')}>Nápověda</Button>\n </HStack>\n </VStack>\n <Button colorScheme=\"blue\" onClick={submit} isLoading={submitting}>Odeslat</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </>\n );\n}\n","import { Box, Tooltip } from '@chakra-ui/react';\nimport { useEffect, useState } from 'react';\nimport api from '../../services/api';\n\ninterface HealthCheckResult {\n status: string;\n message?: string;\n}\n\ninterface HealthResponse {\n status: string;\n checks?: Record<string, HealthCheckResult>;\n}\n\ntype HealthStatus = 'loading' | 'healthy' | 'degraded' | 'unhealthy' | 'error';\n\nconst POLL_INTERVAL_MS = 60000; // 60 seconds\n\nconst AdminHealthIndicator = () => {\n const [status, setStatus] = useState<HealthStatus>('loading');\n const [lastError, setLastError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n let timer: number | undefined;\n\n const fetchStatus = async () => {\n try {\n const res = await api.get<HealthResponse>('/health/ready');\n if (cancelled) return;\n\n const raw = (res.data?.status || '').toLowerCase();\n let mapped: HealthStatus;\n if (raw === 'healthy') mapped = 'healthy';\n else if (raw === 'degraded') mapped = 'degraded';\n else mapped = 'unhealthy';\n\n setStatus(mapped);\n setLastError(null);\n } catch (err) {\n if (cancelled) return;\n // On error keep previous status if we already had one, otherwise mark as error\n setStatus((prev) => (prev === 'loading' ? 'error' : prev));\n setLastError('Nepodařilo se ověřit stav serveru');\n } finally {\n if (!cancelled) {\n timer = window.setTimeout(fetchStatus, POLL_INTERVAL_MS);\n }\n }\n };\n\n fetchStatus();\n\n return () => {\n cancelled = true;\n if (timer) {\n window.clearTimeout(timer);\n }\n };\n }, []);\n\n let color: string;\n switch (status) {\n case 'healthy':\n color = 'green.400';\n break;\n case 'degraded':\n color = 'orange.400';\n break;\n case 'unhealthy':\n color = 'red.400';\n break;\n case 'loading':\n color = 'yellow.300';\n break;\n case 'error':\n default:\n color = 'gray.400';\n break;\n }\n\n const label: string = (() => {\n if (status === 'loading') return 'Ověřuji stav serveru…';\n if (status === 'healthy') return 'Server v pořádku';\n if (status === 'degraded') return 'Server běží, ale v omezeném režimu';\n if (status === 'unhealthy') return 'Server není připraven (zdravotní kontrola selhala)';\n if (status === 'error') return lastError || 'Nepodařilo se ověřit stav serveru';\n return 'Stav serveru není známý';\n })();\n\n return (\n <Tooltip label={label} hasArrow>\n <Box\n as=\"span\"\n w=\"10px\"\n h=\"10px\"\n borderRadius=\"full\"\n bg={color}\n boxShadow=\"0 0 0 2px rgba(255, 255, 255, 0.6)\"\n />\n </Tooltip>\n );\n};\n\nexport default AdminHealthIndicator;\n","import { \n Box, \n Flex, \n useDisclosure, \n useColorModeValue, \n useColorMode,\n IconButton,\n Container,\n Skeleton,\n Text,\n HStack,\n \n} from '@chakra-ui/react';\nimport { ReactNode, useEffect, useState, useRef } from 'react';\nimport { useNavigate, useLocation } from 'react-router-dom';\nimport { useAuth } from '../contexts/AuthContext';\nimport AdminSidebar from '../components/admin/AdminSidebar';\nimport AdminHeader from '../components/admin/AdminHeader';\nimport { FiMenu } from 'react-icons/fi';\nimport { FaSearch } from 'react-icons/fa';\nimport AdminSearchModal from '../components/admin/AdminSearchModal';\nimport AdminSupportButton from '../components/admin/AdminSupportButton';\nimport AdminHealthIndicator from '../components/admin/AdminHealthIndicator';\nimport { logAction } from '../services/actionLog';\nimport '../styles/admin-scroll-fix.css';\nimport { useFastAdminScroll } from '../hooks/useFastAdminScroll';\nimport { usePublicSettings } from '../hooks/usePublicSettings';\nimport { assetUrl } from '../utils/url';\nimport { ThemeToggle } from '@/components/ui/theme-toggle';\n\ninterface AdminLayoutProps {\n children: ReactNode;\n requireAdmin?: boolean; // when false, allow any authenticated role\n}\n\nconst AdminLayout = ({ children, requireAdmin = true }: AdminLayoutProps) => {\n const { isOpen, onOpen, onClose } = useDisclosure({ defaultIsOpen: false });\n const { isOpen: isSearchOpen, onOpen: onSearchOpen, onClose: onSearchClose } = useDisclosure();\n \n // Track if sidebar was manually opened (to prevent auto-close)\n const manuallyOpenedRef = useRef(false);\n \n // Wrap onOpen and onClose with manual open tracking\n const handleOpen = () => {\n manuallyOpenedRef.current = true;\n onOpen();\n };\n \n const handleClose = () => {\n manuallyOpenedRef.current = false;\n onClose();\n };\n const navigate = useNavigate();\n const location = useLocation();\n const { isAuthenticated, isLoading, user } = useAuth();\n const { colorMode } = useColorMode();\n const bg = useColorModeValue('gray.50', 'gray.900');\n const contentBg = useColorModeValue('white', '#1a1d29');\n const sidebarBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const { data: publicSettings } = usePublicSettings();\n \n // Track mobile state\n const [isMobile, setIsMobile] = useState(false);\n \n // Update mobile state on resize\n useEffect(() => {\n const checkMobile = () => {\n const mobile = window.innerWidth < 768;\n setIsMobile(mobile);\n };\n checkMobile();\n const handleResize = () => checkMobile();\n window.addEventListener('resize', handleResize);\n \n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, [isMobile]);\n \n // Fast native-speed scroll retention (disabled on mobile)\n useFastAdminScroll(!isMobile);\n\n // Redirect to login if not authenticated\n useEffect(() => {\n if (!isLoading && !isAuthenticated) {\n navigate('/login', { state: { from: location.pathname } });\n }\n }, [isAuthenticated, isLoading, navigate, location]);\n\n // Keyboard shortcut: Ctrl/Cmd+K opens admin search\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n const key = (e.key || '').toLowerCase();\n if ((e.ctrlKey || e.metaKey) && key === 'k') {\n e.preventDefault();\n onSearchOpen();\n }\n // Close sidebar on Escape key (mobile only)\n if (key === 'escape' && isOpen) {\n handleClose();\n }\n };\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, [onSearchOpen, isOpen, handleClose]);\n\n // Note: Removed auto-close on route change for mobile to prevent immediate closing after opening\n // Users can close the sidebar by clicking the overlay or pressing Escape\n\n // Redirect non-admin users only when page requires admin\n useEffect(() => {\n if (!isLoading && isAuthenticated && requireAdmin) {\n const role = (user as any)?.role;\n if (role && role !== 'admin') {\n navigate('/403', { replace: true, state: { from: location.pathname } });\n }\n }\n }, [isLoading, isAuthenticated, user, navigate, requireAdmin]);\n\n useEffect(() => {\n logAction({ type: 'nav', at: Date.now(), path: location.pathname + location.search });\n }, [location.pathname, location.search]);\n\n useEffect(() => {\n try {\n const raw = publicSettings?.club_logo_url || '/dist/img/logo-club-empty.svg';\n if (!raw) return;\n const url = assetUrl(raw) || raw;\n const setIcon = (rel: string) => {\n let link = document.querySelector<HTMLLinkElement>(`link[rel=\"${rel}\"]`);\n if (!link) {\n link = document.createElement('link');\n link.rel = rel as any;\n document.head.appendChild(link);\n }\n link.href = url;\n if (url.endsWith('.svg')) link.type = 'image/svg+xml';\n };\n setIcon('icon');\n setIcon('shortcut icon');\n } catch {}\n }, [publicSettings?.club_logo_url]);\n\n if (isLoading) {\n return (\n <Flex minH=\"100vh\" bg={bg}>\n <Skeleton width=\"250px\" height=\"100vh\" position=\"fixed\" />\n <Box ml={{ base: 0, md: '250px' }} flex={1} p={6}>\n <Skeleton height=\"60px\" mb={6} />\n <Skeleton height=\"400px\" />\n </Box>\n </Flex>\n );\n }\n\n if (!isAuthenticated) {\n return null; // Will redirect in useEffect\n }\n\n return (\n <Box minH=\"100vh\" bg={bg} className=\"admin-layout\">\n {/* Mobile overlay */}\n <Box\n display={{ base: isOpen ? 'block' : 'none', md: 'none' }}\n position=\"fixed\"\n top={0}\n left={0}\n right={0}\n bottom={0}\n bg=\"blackAlpha.600\"\n zIndex={9}\n onClick={handleClose}\n />\n <AdminSidebar \n isOpen={isOpen} \n onClose={handleClose} \n bg={sidebarBg}\n borderRight=\"1px\"\n borderColor={borderColor}\n />\n <Box \n ml={{ base: 0, md: '260px' }} \n transition=\"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)\"\n minH=\"100vh\"\n >\n <AdminHeader \n onMenuToggle={handleOpen} \n rightContent={\n <HStack spacing={3}>\n <AdminHealthIndicator />\n <IconButton\n aria-label=\"Vyhledávání v administraci\"\n icon={<FaSearch />}\n onClick={onSearchOpen}\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"full\"\n _hover={{ bg: useColorModeValue('gray.100', 'gray.700'), transform: 'scale(1.05)' }}\n transition=\"all 0.2s\"\n />\n <AdminSupportButton />\n <ThemeToggle />\n </HStack>\n }\n />\n <Box as=\"main\" className=\"admin-main\" p={{ base: 4, md: 8 }} pb={{ base: 8, md: 12 }}>\n {children}\n </Box>\n {/* Admin Search Modal */}\n <AdminSearchModal\n isOpen={isSearchOpen}\n onClose={onSearchClose}\n onSelectPath={(path: string) => navigate(path)}\n />\n </Box>\n </Box>\n );\n};\n\nexport default AdminLayout;\n","// Fast, native-speed admin scroll retention - optimized for performance\nimport { useEffect, useRef } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nexport const useFastAdminScroll = (enabled: boolean = true) => {\n const location = useLocation();\n const scrollPositions = useRef<Map<string, number>>(new Map());\n const lastPath = useRef<string>('');\n const isRestoring = useRef<boolean>(false);\n\n useEffect(() => {\n if (!enabled) return;\n \n const sidebar = document.querySelector('[data-sidebar=\"true\"]') as HTMLElement;\n if (!sidebar) return;\n\n // Save current scroll position instantly before navigation\n if (lastPath.current && !isRestoring.current) {\n const currentScroll = sidebar.scrollTop;\n if (currentScroll > 0) {\n scrollPositions.current.set(lastPath.current, currentScroll);\n }\n }\n\n // Restore scroll position for new path\n const savedPosition = scrollPositions.current.get(location.pathname) || 0;\n if (savedPosition > 0 && location.pathname !== lastPath.current) {\n isRestoring.current = true;\n \n // Use direct assignment for instant scroll - no animation, no delays\n sidebar.scrollTop = savedPosition;\n \n // Clear restoration flag immediately after next frame\n requestAnimationFrame(() => {\n isRestoring.current = false;\n });\n }\n\n lastPath.current = location.pathname;\n }, [location.pathname, enabled]);\n};\n","import { batchFetchLogosFromSportLogosAPI, getLogoAPIRequestStats } from '../../utils/sportLogosAPI';\nimport { fetchLogoFromLogoAPI } from '../../utils/sportLogosAPI';\nimport { \n Heading, \n Text, \n Box, \n Spinner, \n Alert, \n AlertIcon, \n Table, \n Thead, \n Tbody, \n Tr, \n Th, \n Td, \n VStack, \n Button, \n HStack, \n Drawer, \n DrawerOverlay, \n DrawerContent, \n DrawerHeader, \n DrawerBody, \n DrawerFooter, \n FormControl, \n FormLabel, \n Input, \n InputGroup, \n InputRightElement, \n List, \n ListItem, \n Badge, \n useToast,\n SimpleGrid,\n useColorModeValue,\n ButtonGroup,\n Tag,\n TagLabel,\n Tooltip,\n Image,\n Tabs,\n TabList,\n Tab,\n TabPanels,\n TabPanel,\n Flex,\n Wrap\n} from '@chakra-ui/react';\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport { searchClubs, uploadImage, putTeamLogoOverride, fetchTeamLogoOverrides, fetchLogoAsBlob, uploadToLogaSportcreative } from '../../services/adminMatches';\nimport { getFacrTablesCache } from '../../services/facr/cache';\nimport { assetUrl } from '../../utils/url';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { API_URL } from '../../services/api';\n \nfunction normalize(s: string): string {\n let out = String(s || '');\n // Normalize diacritics and case\n out = out\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase();\n // Unify various dash characters to a simple hyphen\n out = out.replace(/[\\u2012\\u2013\\u2014\\u2015\\u2212]/g, '-');\n out = out.replace(/\\bn\\.?\\b/g, ' nad ');\n out = out.replace(/\\bp\\.?\\b/g, ' pod ');\n // Remove legal suffixes like \", z.s.\" / \", z. s.\" / \" z.s.\" / \"o.s.\" at end\n out = out.replace(/[,,\\s]*(z\\.?\\s*s\\.?|o\\.?\\s*s\\.?)\\s*$/g, '');\n // Remove organization phrases/prefixes anywhere (keep core locality/name)\n const orgPhrases = [\n 'fotbalovy klub',\n 'sportovni klub',\n 'telovychovna jednota',\n 'skolni sportovni klub',\n 'spolek',\n 'fotbal',\n 'futsal',\n ];\n for (const phrase of orgPhrases) {\n const re = new RegExp('(^|\\\\b)'+ phrase + '(\\\\b|$)', 'g');\n out = out.replace(re, ' ');\n }\n // Remove common short prefixes (tokens) like FC, FK, MFK, TJ, SK, SFC, AFK at word boundaries\n out = out.replace(/\\b(1\\.)?\\s*(sfc|afc|fc|fk|mfk|tj|sk|afk)\\b\\.?/g, ' ');\n // Remove punctuation except hyphen\n out = out.replace(/[\\.,!;:()\\[\\]{}]/g, ' ');\n // Collapse multiple spaces and trim\n out = out.replace(/\\s+/g, ' ').trim();\n return out;\n}\n\n// Derive FACR team UUID from the logo URL if team_id is missing in the row\n// Example: https://is1.fotbal.cz/media/kluby/<UUID>/<UUID>_crop.jpg\nfunction deriveTeamIdFromLogoUrl(url?: string): string | undefined {\n try {\n const u = String(url || '');\n if (!u) return undefined;\n const m = u.match(/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}/);\n return m ? m[0].toLowerCase() : undefined;\n } catch {\n return undefined;\n }\n}\n\n \ntype TableRow = {\n rank?: string;\n team?: string;\n team_id?: string;\n team_logo_url?: string;\n played?: string;\n wins?: string;\n draws?: string;\n losses?: string;\n score?: string;\n points?: string;\n};\n\nconst TeamsAdminPage = () => {\n const toast = useToast();\n const queryClient = useQueryClient();\n const { data, isLoading, error } = useQuery<any>({\n queryKey: ['facr-tables-cache'],\n queryFn: () => getFacrTablesCache(),\n staleTime: 5 * 60 * 1000,\n });\n\n const competitions: any[] = Array.isArray(data?.competitions) ? data!.competitions : [];\n const mainClubId: string | undefined = (data?.club_id ? String(data.club_id).toLowerCase() : undefined);\n const mainClubBase: string = useMemo(() => normalize(String(data?.name || '')), [data?.name]);\n // Backend origin (used to resolve relative URLs like /uploads/...)\n const backendOrigin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n const theadBg = useColorModeValue('gray.50', 'gray.700');\n const rowHoverBg = useColorModeValue('gray.50', 'gray.700');\n const searchBg = useColorModeValue('white', 'gray.800');\n\n // Load public/admin overrides map to apply on cache-fed view\n const { data: overrides = {} } = useQuery({\n queryKey: ['teamLogoOverrides'],\n queryFn: fetchTeamLogoOverrides,\n staleTime: 5 * 60 * 1000,\n });\n const overridesById: Record<string, { name?: string; logo_url?: string }> = (overrides as any)?.by_id || {};\n // Lowercase-key index for robust UUID lookups irrespective of source casing\n const overridesByIdLC = useMemo(() => {\n const m: Record<string, { name?: string; logo_url?: string }> = {};\n try {\n for (const [k, v] of Object.entries(overridesById)) {\n m[String(k).toLowerCase()] = v as any;\n }\n } catch {}\n return m;\n }, [overridesById]);\n // Build an index by normalized team name for overrides that carry an ID\n const overridesNameIndex = useMemo(() => {\n const idx: Record<string, { id: string; name: string; logo_url: string }> = {};\n try {\n for (const [id, v] of Object.entries(overridesById)) {\n const name = String((v as any)?.name || '').trim();\n const logo = String((v as any)?.logo_url || '').trim();\n if (!name) continue;\n const norm = normalize(name);\n if (!norm) continue;\n idx[norm] = { id, name, logo_url: logo };\n }\n } catch {}\n return idx;\n }, [overridesById]);\n \n // Fetch logos from logoapi.sportcreative.eu for all teams\n const [sportLogosMap, setSportLogosMap] = useState<Record<string, string>>({});\n const [sportLogosLoading, setSportLogosLoading] = useState(false);\n \n useEffect(() => {\n if (!competitions || competitions.length === 0) return;\n \n // Extract all unique team IDs from all competitions\n const teamIds = new Set<string>();\n for (const comp of competitions) {\n const rows: TableRow[] = comp?.table?.overall || [];\n for (const r of rows) {\n if (r.team_id) teamIds.add(String(r.team_id).toLowerCase());\n else {\n const derived = deriveTeamIdFromLogoUrl(r.team_logo_url);\n if (derived) teamIds.add(derived);\n }\n }\n }\n \n if (teamIds.size === 0) return;\n \n // Safety check: prevent excessive requests\n const MAX_TEAM_IDS = 500; // Reasonable limit to prevent request storms\n if (teamIds.size > MAX_TEAM_IDS) {\n console.warn(`Too many team IDs (${teamIds.size}) for logo fetching. Limiting to first ${MAX_TEAM_IDS}.`);\n // Keep only the first MAX_TEAM_IDS IDs\n const idsArray = Array.from(teamIds);\n idsArray.length = MAX_TEAM_IDS;\n teamIds.clear();\n idsArray.forEach(id => teamIds.add(id));\n }\n \n // Fetch logos from logoapi.sportcreative.eu with rate limiting\n setSportLogosLoading(true);\n batchFetchLogosFromSportLogosAPI(Array.from(teamIds))\n .then((map) => setSportLogosMap(map))\n .catch((err) => console.error('Failed to fetch sport logos:', err))\n .finally(() => setSportLogosLoading(false));\n }, [competitions]);\n const byName: Record<string, string> = (overrides as any)?.by_name || {};\n const byNameNormalized = useMemo(() => {\n const idx: Record<string, string> = {};\n for (const k of Object.keys(byName)) {\n idx[normalize(k)] = byName[k];\n }\n return idx;\n }, [byName]);\n const byNamePairs = useMemo(() => {\n return Object.keys(byName || {}).map((k) => ({ keyNorm: normalize(k), url: byName[k] }));\n }, [byName]);\n\n const getLogo = (teamName?: string, teamId?: string, original?: string) => {\n if (!teamName) return assetUrl('/dist/img/logo-club-empty.svg') as string;\n // Priority 0: Admin override by team ID\n const tid = teamId ? String(teamId).toLowerCase() : '';\n if (tid && overridesByIdLC[tid] && overridesByIdLC[tid]?.logo_url) {\n const u = String(overridesByIdLC[tid].logo_url);\n if (u.startsWith('/')) return assetUrl(u) as string;\n return u;\n }\n // Priority 0.5: Try match by override name when team_id is missing\n try {\n const norm = normalize(teamName);\n let hit = overridesNameIndex[norm];\n if (!hit) {\n // Suffix/containment match: allow sponsor words before/after core name\n for (const [keyNorm, val] of Object.entries(overridesNameIndex)) {\n if (!keyNorm) continue;\n if (norm.endsWith(keyNorm) || keyNorm.endsWith(norm)) { hit = val as any; break; }\n }\n }\n if (!hit) {\n const norm2 = normalize(teamName);\n const t1 = norm2.split(' ')[0];\n if (t1 && t1.length >= 5) {\n for (const [keyNorm, val] of Object.entries(overridesNameIndex)) {\n const k1 = String(keyNorm).split(' ')[0];\n if (k1 === t1) { hit = val as any; break; }\n }\n }\n }\n if (hit && (hit as any).logo_url) {\n const u = String((hit as any).logo_url);\n if (u.startsWith('/')) return assetUrl(u) as string;\n return u;\n }\n } catch {}\n // Priority 1: Local admin override (exact + normalized)\n let overrideUrl = byName[teamName];\n if (!overrideUrl) {\n const norm = normalize(teamName);\n overrideUrl = byNameNormalized[norm];\n }\n if (!overrideUrl) {\n // Suffix/containment against normalized keys\n const norm = normalize(teamName);\n for (const { keyNorm, url } of byNamePairs) {\n if (!keyNorm) continue;\n if (norm.endsWith(keyNorm) || keyNorm.endsWith(norm)) { overrideUrl = url; break; }\n }\n }\n if (overrideUrl) {\n if (typeof overrideUrl === 'string' && overrideUrl.startsWith('/')) {\n return assetUrl(overrideUrl) as string;\n }\n return overrideUrl;\n }\n\n // Priority 2: logoapi.sportcreative.eu if we have a team ID\n if (tid && sportLogosMap[tid]) {\n return sportLogosMap[tid];\n }\n\n // Priority 3: FACR original\n if (original) {\n return original;\n }\n\n // Final fallback: empty logo\n return '/dist/img/logo-club-empty.svg';\n };\n\n const getName = (teamName?: string, teamId?: string) => {\n const tid = teamId ? String(teamId).toLowerCase() : '';\n if (tid && overridesByIdLC[tid] && overridesByIdLC[tid]?.name) {\n return String(overridesByIdLC[tid].name || '').trim() || String(teamName || '');\n }\n // If no ID, but override exists for the normalized name, use canonical override name\n try {\n if (teamName) {\n const norm = normalize(teamName);\n let hit = overridesNameIndex[norm];\n if (!hit) {\n for (const [keyNorm, val] of Object.entries(overridesNameIndex)) {\n if (!keyNorm) continue;\n if (norm.endsWith(keyNorm) || keyNorm.endsWith(norm)) { hit = val as any; break; }\n }\n }\n if (!hit) {\n const t1 = norm.split(' ')[0];\n if (t1 && t1.length >= 5) {\n for (const [keyNorm, val] of Object.entries(overridesNameIndex)) {\n const k1 = String(keyNorm).split(' ')[0];\n if (k1 === t1) { hit = val as any; break; }\n }\n }\n }\n if (hit && (hit as any).name) {\n return (hit as any).name as string;\n }\n }\n } catch {}\n return String(teamName || '');\n };\n\n // View mode: 'table' per competition, or 'grid' of unique teams across competitions\n const [viewMode, setViewMode] = useState<'table' | 'grid'>('table');\n // Selected competition for quick switching (only applies in table mode)\n const [selectedCompIndex, setSelectedCompIndex] = useState<number>(0);\n // Text filter for club/team name\n const [filter, setFilter] = useState('');\n const [filterDebounced, setFilterDebounced] = useState('');\n useEffect(() => {\n const t = setTimeout(() => setFilterDebounced(filter), 250);\n return () => clearTimeout(t);\n }, [filter]);\n\n // Build a deduplicated list of teams across all competitions\n type TeamAggregate = {\n key: string; // normalized key\n name: string; // representative name\n logo: string;\n variants: string[]; // all raw names found\n teamId?: string;\n };\n const allTeamsUnique: TeamAggregate[] = useMemo(() => {\n const map: Record<string, TeamAggregate> = {};\n for (const comp of competitions) {\n const rows: TableRow[] = comp?.table?.overall || [];\n for (const r of rows) {\n const rawName = (r.team || '').trim();\n let teamId = ((r as any).team_id as string | undefined) || deriveTeamIdFromLogoUrl(r.team_logo_url);\n if (teamId) teamId = String(teamId).toLowerCase();\n if (!teamId && mainClubId) {\n const rn = normalize(rawName);\n if (\n rn === mainClubBase ||\n rn.endsWith(' ' + mainClubBase) ||\n rn.startsWith(mainClubBase + ' ') ||\n rn.includes(' ' + mainClubBase + ' ')\n ) {\n teamId = mainClubId;\n }\n }\n const canonicalName = getName(rawName, teamId);\n if (!canonicalName) continue;\n const key = teamId ? `id:${teamId}` : normalize(canonicalName);\n const logo = getLogo(canonicalName, teamId, r.team_logo_url);\n if (!map[key]) {\n map[key] = { key, name: canonicalName, logo, variants: [rawName, canonicalName], teamId };\n } else {\n map[key].variants.push(rawName);\n map[key].variants.push(canonicalName);\n // Update logo - prefer non-empty logos\n const currentIsEmpty = !map[key].logo || /logo-club-empty\\.svg$/.test(String(map[key].logo));\n const newIsNotEmpty = logo && !/logo-club-empty\\.svg$/.test(String(logo));\n if (currentIsEmpty && newIsNotEmpty) {\n map[key].logo = logo as string;\n }\n if (!map[key].teamId && teamId) {\n map[key].teamId = teamId;\n }\n }\n }\n }\n // Sort by representative name\n return Object.values(map).sort((a, b) => a.name.localeCompare(b.name, 'cs', { sensitivity: 'base' }));\n }, [competitions, getLogo, mainClubBase, mainClubId]);\n\n // Fast lookup from normalized name to variant list\n const variantsByKey = useMemo(() => {\n const m: Record<string, string[]> = {};\n for (const t of allTeamsUnique) {\n m[t.key] = Array.from(new Set(t.variants));\n }\n return m;\n }, [allTeamsUnique]);\n\n // Drawer state for editing a team's logo/name\n const [isOpen, setIsOpen] = useState(false);\n const [selected, setSelected] = useState<{ compId?: string; teamName: string; teamLogoUrl?: string; variantNames?: string[] } | null>(null);\n const [form, setForm] = useState({\n external_team_id: '',\n team_name: '',\n logo_url: '',\n });\n const fileRef = useRef<HTMLInputElement | null>(null);\n const [uploadedFile, setUploadedFile] = useState<File | null>(null);\n const [externalUploadStatus, setExternalUploadStatus] = useState<'idle' | 'uploading' | 'success' | 'error'>('idle');\n const [externalUploadError, setExternalUploadError] = useState<string | null>(null);\n\n const showExternalUploadInfo = useMemo(() => {\n try {\n if (uploadedFile) return true;\n const raw = (form.logo_url || '').trim();\n if (!raw) return false;\n const abs = raw.startsWith('/') ? new URL(raw, backendOrigin).toString() : raw;\n const u = new URL(abs);\n const host = u.hostname.toLowerCase();\n const path = u.pathname;\n const backendHost = new URL(backendOrigin).hostname.toLowerCase();\n const isFacr = host.endsWith('fotbal.cz') || host === 'is1.fotbal.cz';\n const isLogoAPI = host === 'logoapi.sportcreative.eu';\n const isLocalUpload = (host === backendHost && path.startsWith('/uploads/'));\n return !isFacr && !isLogoAPI && isLocalUpload;\n } catch {\n return false;\n }\n }, [uploadedFile, form.logo_url, backendOrigin]);\n\n // Club search\n const [query, setQuery] = useState('');\n const [debounced, setDebounced] = useState('');\n useEffect(() => {\n const t = setTimeout(() => setDebounced(query), 300);\n return () => clearTimeout(t);\n }, [query]);\n const { data: searchResults = [] } = useQuery({\n queryKey: ['club-search', debounced],\n queryFn: () => searchClubs(debounced),\n enabled: debounced.trim().length >= 2,\n });\n\n const onOpenEdit = (teamName: string, teamLogoUrl?: string, variantNames?: string[], teamId?: string) => {\n // If variants not explicitly provided (e.g., from table view), compute from normalized key\n let v = variantNames;\n if (!v || v.length === 0) {\n const key = normalize(teamName || '');\n v = variantsByKey[key] || [];\n }\n setSelected({ teamName, teamLogoUrl, variantNames: v });\n setForm({ external_team_id: teamId || '', team_name: teamName || '', logo_url: teamLogoUrl || '' });\n setQuery(teamName || '');\n setIsOpen(true);\n };\n\n const onSave = useMutation({\n mutationFn: async () => {\n let extTeamId = (form.external_team_id || '').trim();\n if (!extTeamId) {\n let derived: string | undefined = undefined;\n try { derived = deriveTeamIdFromLogoUrl(form.logo_url); } catch {}\n if (!derived && selected?.teamLogoUrl) {\n try { derived = deriveTeamIdFromLogoUrl(selected.teamLogoUrl); } catch {}\n }\n if (!derived) {\n const primaryNameTry = (form.team_name || selected?.teamName || '').trim();\n if (primaryNameTry) {\n try {\n const results = await searchClubs(primaryNameTry);\n const norm = (s: string) => normalize(s);\n const exact = results.find(r => norm(r.name) === norm(primaryNameTry));\n const pick = exact || results[0];\n if (pick?.id) derived = String(pick.id);\n } catch {}\n }\n }\n if (derived) {\n extTeamId = derived;\n }\n }\n if (!extTeamId) {\n throw new Error('Vyberte tým ze seznamu vyhledávání (chybí ID).');\n }\n let logoUrl = (form.logo_url || '').trim();\n // Prefer the edited input over the pre-selected name\n const primaryName = (form.team_name || selected?.teamName || '').trim();\n // All variants to update (deduped), always include the primary name\n const names = Array.from(new Set([primaryName, ...((selected?.variantNames || []) as string[])]))\n .map((s) => s.trim())\n .filter(Boolean);\n // Prefer highest-quality logo from logoapi if available (unless uploading a new file)\n try {\n if (!uploadedFile && extTeamId) {\n const apiLogo = await fetchLogoFromLogoAPI(extTeamId, primaryName);\n if (apiLogo) {\n logoUrl = apiLogo;\n }\n }\n } catch {}\n \n if (logoUrl) {\n let uploadAttempted = false;\n let shouldUpload = Boolean(uploadedFile);\n try {\n const abs = logoUrl.startsWith('/') ? new URL(logoUrl, backendOrigin).toString() : logoUrl;\n const u = new URL(abs);\n const host = u.hostname.toLowerCase();\n const path = u.pathname;\n const backendHost = new URL(backendOrigin).hostname.toLowerCase();\n const isFacr = host.endsWith('fotbal.cz') || host === 'is1.fotbal.cz';\n const isLogoAPI = host === 'logoapi.sportcreative.eu';\n const isLocalUpload = (host === backendHost && path.startsWith('/uploads/'));\n if (!shouldUpload) {\n shouldUpload = isLocalUpload;\n }\n if (isFacr || isLogoAPI) {\n shouldUpload = false;\n }\n } catch {}\n\n if (shouldUpload) {\n uploadAttempted = true;\n setExternalUploadStatus('uploading');\n setExternalUploadError(null);\n try {\n let logoFileToUpload: File | Blob | null = uploadedFile;\n if (!logoFileToUpload && logoUrl) {\n logoFileToUpload = await fetchLogoAsBlob(logoUrl);\n }\n if (logoFileToUpload) {\n const logaResult = await uploadToLogaSportcreative(\n extTeamId,\n logoFileToUpload,\n {\n filename: `${extTeamId}.${logoFileToUpload instanceof File ? logoFileToUpload.name.split('.').pop() : 'png'}`,\n clubName: form.team_name || selected?.teamName || 'Neznámý klub'\n }\n );\n if (logaResult.success) {\n setExternalUploadStatus('success');\n if (logaResult.url) {\n logoUrl = logaResult.url;\n }\n try {\n let confirmedUrl: string | null = null;\n for (let i = 0; i < 10; i++) {\n confirmedUrl = await fetchLogoFromLogoAPI(extTeamId, primaryName);\n if (confirmedUrl) break;\n await new Promise((r) => setTimeout(r, 700));\n }\n if (confirmedUrl) {\n logoUrl = confirmedUrl;\n }\n } catch {}\n } else {\n setExternalUploadStatus('error');\n setExternalUploadError(logaResult.error || 'Nepodařilo se nahrát logo');\n }\n } else {\n setExternalUploadStatus('error');\n setExternalUploadError('Could not fetch logo file');\n }\n } catch (error: any) {\n setExternalUploadStatus('error');\n setExternalUploadError(error?.message || 'Upload failed');\n }\n }\n\n if (uploadAttempted) {\n try {\n const abs = logoUrl.startsWith('/') ? new URL(logoUrl, backendOrigin).toString() : logoUrl;\n const host = new URL(abs).hostname.toLowerCase();\n if (host !== 'logoapi.sportcreative.eu') {\n throw new Error('Externí upload loga ještě není dostupný. Zkuste uložit znovu za chvíli.');\n }\n } catch (e: any) {\n throw new Error(e?.message || 'Externí upload loga selhal');\n }\n }\n }\n\n await putTeamLogoOverride(extTeamId, primaryName, logoUrl);\n\n return true;\n },\n onSuccess: () => {\n let description = 'Změna byla aplikována na všechny duplicitní varianty.';\n if (externalUploadStatus === 'success') {\n description += ' Logo bylo úspěšně nahráno.';\n } else if (externalUploadStatus === 'error') {\n description += ` ⚠️ ${externalUploadError || 'Nepodařilo se nahrát logo'}`;\n }\n \n toast({ \n title: 'Uloženo', \n description, \n status: externalUploadStatus === 'error' ? 'warning' : 'success',\n duration: 6000,\n isClosable: true,\n });\n \n setIsOpen(false);\n setSelected(null);\n setUploadedFile(null);\n setExternalUploadStatus('idle');\n setExternalUploadError(null);\n queryClient.invalidateQueries({ queryKey: ['facr-tables-cache'] });\n queryClient.invalidateQueries({ queryKey: ['teamLogoOverrides'] });\n },\n onError: (e: any) => {\n toast({ title: 'Uložení selhalo', description: e?.message || 'Zkuste to znovu', status: 'error' });\n },\n });\n\n return (\n <AdminLayout requireAdmin={false}>\n <Box>\n <HStack justify=\"space-between\" mb={4}>\n <Heading size=\"lg\">Správa týmů</Heading>\n </HStack>\n <Text color=\"gray.500\" mb={4} fontSize=\"sm\">\n Přehled tabulek z FAČR. Kompaktní zobrazení s rychlým přepínáním soutěží.\n </Text>\n <Flex mb={4} gap={3} align=\"center\" wrap=\"wrap\">\n <ButtonGroup isAttached size=\"sm\" variant=\"outline\">\n <Button \n colorScheme={viewMode === 'table' ? 'blue' : 'gray'}\n variant={viewMode === 'table' ? 'solid' : 'outline'}\n onClick={() => setViewMode('table')}\n size=\"sm\"\n >\n Tabulky\n </Button>\n <Button \n colorScheme={viewMode === 'grid' ? 'blue' : 'gray'}\n variant={viewMode === 'grid' ? 'solid' : 'outline'}\n onClick={() => setViewMode('grid')}\n size=\"sm\"\n >\n Mřížka\n </Button>\n </ButtonGroup>\n <InputGroup maxW={{ base: '100%', md: '300px' }} size=\"sm\">\n <Input placeholder=\"Filtrovat podle názvu týmu…\" value={filter} onChange={(e) => setFilter(e.target.value)} />\n {filter && (\n <InputRightElement width=\"3rem\">\n <Button size=\"xs\" variant=\"ghost\" onClick={() => setFilter('')}>Vymazat</Button>\n </InputRightElement>\n )}\n </InputGroup>\n {sportLogosLoading && (\n <Badge colorScheme=\"blue\" fontSize=\"xs\">\n <HStack spacing={1}>\n <Spinner size=\"xs\" />\n <Text>Načítám loga z logoapi.sportcreative.eu...</Text>\n </HStack>\n </Badge>\n )}\n {!sportLogosLoading && Object.keys(sportLogosMap).length > 0 && (\n <Badge colorScheme=\"green\" fontSize=\"xs\">\n ✓ {Object.keys(sportLogosMap).length} log z logoapi.sportcreative.eu\n </Badge>\n )}\n {Object.keys(sportLogosMap).length > 0 && (\n <Badge colorScheme=\"blue\" fontSize=\"xs\">\n 📊 {getLogoAPIRequestStats().totalRequests}/min požadavků\n </Badge>\n )}\n </Flex>\n\n {isLoading && (\n <VStack align=\"start\" spacing={3} mb={6}>\n <Spinner />\n <Text>Načítám tabulky…</Text>\n </VStack>\n )}\n\n {Boolean(error) && (\n <Alert status=\"error\" variant=\"left-accent\" mb={4}>\n <AlertIcon />\n Nepodařilo se načíst data z cache.\n </Alert>\n )}\n\n {!isLoading && !error && viewMode === 'table' && (\n <Box>\n <Tabs \n index={selectedCompIndex} \n onChange={setSelectedCompIndex}\n variant=\"soft-rounded\"\n colorScheme=\"blue\"\n size=\"sm\"\n >\n <TabList mb={4} overflowX=\"auto\" overflowY=\"hidden\" flexWrap=\"nowrap\" pb={2}>\n {competitions.map((comp, idx) => (\n <Tab \n key={comp.id} \n fontSize=\"xs\"\n px={3}\n py={1.5}\n minW=\"fit-content\"\n whiteSpace=\"nowrap\"\n >\n {comp.name}\n </Tab>\n ))}\n </TabList>\n <TabPanels>\n {competitions.map((comp) => {\n const rows: TableRow[] = comp?.table?.overall || [];\n const f = normalize(filterDebounced);\n const rowsFiltered = f ? rows.filter((r) => normalize(r.team || '').includes(f)) : rows;\n return (\n <TabPanel key={comp.id} p={0}>\n <Box\n overflowX=\"auto\"\n borderWidth=\"1px\"\n borderRadius=\"md\"\n w=\"full\"\n sx={{\n WebkitOverflowScrolling: 'touch',\n }}\n >\n <Table size=\"sm\" variant=\"simple\">\n <Thead bg={theadBg}>\n <Tr>\n <Th w=\"40px\" fontSize=\"xs\" py={2}>#</Th>\n <Th fontSize=\"xs\" py={2}>Tým</Th>\n <Th isNumeric w=\"45px\" fontSize=\"xs\" py={2}>Z</Th>\n <Th isNumeric w=\"45px\" fontSize=\"xs\" py={2}>V</Th>\n <Th isNumeric w=\"45px\" fontSize=\"xs\" py={2}>R</Th>\n <Th isNumeric w=\"45px\" fontSize=\"xs\" py={2}>P</Th>\n <Th isNumeric w=\"70px\" fontSize=\"xs\" py={2}>Skóre</Th>\n <Th isNumeric w=\"50px\" fontSize=\"xs\" py={2}>Body</Th>\n <Th w=\"90px\" fontSize=\"xs\" py={2}>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {rowsFiltered.map((r, idx) => (\n <Tr key={`${comp.id}-${idx}`} _hover={{ bg: rowHoverBg }}>\n <Td py={1.5} fontSize=\"xs\">{r.rank}</Td>\n <Td py={1.5}>\n <HStack spacing={2} align=\"center\">\n <Image\n src={getLogo(r.team, ((r as any).team_id as any) || deriveTeamIdFromLogoUrl(r.team_logo_url), r.team_logo_url)}\n alt={getName(r.team, ((r as any).team_id as any) || deriveTeamIdFromLogoUrl(r.team_logo_url))}\n boxSize=\"24px\"\n objectFit=\"contain\"\n />\n <Text fontSize=\"xs\" noOfLines={1}>{getName(r.team, ((r as any).team_id as any) || deriveTeamIdFromLogoUrl(r.team_logo_url))}</Text>\n </HStack>\n </Td>\n <Td isNumeric py={1.5} fontSize=\"xs\">{r.played}</Td>\n <Td isNumeric py={1.5} fontSize=\"xs\">{r.wins}</Td>\n <Td isNumeric py={1.5} fontSize=\"xs\">{r.draws}</Td>\n <Td isNumeric py={1.5} fontSize=\"xs\">{r.losses}</Td>\n <Td isNumeric py={1.5} fontSize=\"xs\">{r.score}</Td>\n <Td isNumeric py={1.5} fontSize=\"xs\" fontWeight=\"bold\">{r.points}</Td>\n <Td py={1.5}>\n <Button size=\"xs\" fontSize=\"xs\" onClick={() => {\n const tidRaw = ((r as any).team_id as any) || deriveTeamIdFromLogoUrl(r.team_logo_url);\n const tid = tidRaw ? String(tidRaw).toLowerCase() : undefined;\n const displayName = getName(r.team, tid);\n const key = tid ? `id:${tid}` : normalize(displayName);\n onOpenEdit(displayName || '', getLogo(r.team, tid, r.team_logo_url), variantsByKey[key], tid);\n }}>Upravit</Button>\n </Td>\n </Tr>\n ))}\n {rowsFiltered.length === 0 && (\n <Tr>\n <Td colSpan={9} py={4}>\n <Text color=\"gray.500\" fontSize=\"sm\" textAlign=\"center\">Žádný tým neodpovídá filtru.</Text>\n </Td>\n </Tr>\n )}\n </Tbody>\n </Table>\n </Box>\n </TabPanel>\n );\n })}\n </TabPanels>\n </Tabs>\n </Box>\n )}\n\n {!isLoading && !error && viewMode === 'grid' && (\n <Box>\n {(() => {\n const f = normalize(filterDebounced);\n const source = f\n ? allTeamsUnique.filter((t) => normalize(t.name).includes(f) || (t.variants || []).some(v => normalize(v).includes(f)))\n : allTeamsUnique;\n return (\n <SimpleGrid columns={{ base: 2, sm: 3, md: 4, lg: 6 }} spacing={3}>\n {source.map((t) => (\n <Box \n key={t.key} \n borderWidth=\"1px\" \n borderRadius=\"md\" \n p={2.5} \n _hover={{ boxShadow: 'md', borderColor: 'blue.300' }}\n transition=\"all 0.2s\"\n >\n <VStack align=\"stretch\" spacing={2}>\n <HStack justify=\"space-between\" align=\"start\">\n <HStack spacing={2} flex={1} minW={0}>\n <Image src={t.logo} alt={t.name} boxSize=\"24px\" objectFit=\"contain\" flexShrink={0} />\n <Text fontSize=\"xs\" noOfLines={2} fontWeight=\"medium\">{t.name}</Text>\n </HStack>\n {t.variants.length > 1 && (\n <Tooltip label={`Varianty: ${Array.from(new Set(t.variants)).join(', ')}`} hasArrow>\n <Tag size=\"sm\" colorScheme=\"purple\" variant=\"subtle\" fontSize=\"xs\">\n <TagLabel>{t.variants.length}</TagLabel>\n </Tag>\n </Tooltip>\n )}\n </HStack>\n <Button size=\"xs\" fontSize=\"xs\" onClick={() => onOpenEdit(t.name, t.logo, t.variants, t.teamId)} w=\"full\">Upravit</Button>\n </VStack>\n </Box>\n ))}\n {source.length === 0 && (\n <Box gridColumn={{ base: 'span 2', sm: 'span 3', md: 'span 4', lg: 'span 6' }}>\n <Text color=\"gray.500\" fontSize=\"sm\" textAlign=\"center\" py={8}>Žádný tým neodpovídá filtru.</Text>\n </Box>\n )}\n </SimpleGrid>\n );\n })()}\n </Box>\n )}\n\n <Drawer isOpen={isOpen} placement=\"right\" onClose={() => { setIsOpen(false); setSelected(null); }} size=\"md\">\n <DrawerOverlay />\n <DrawerContent>\n <DrawerHeader>Upravit logo týmu</DrawerHeader>\n <DrawerBody>\n <VStack align=\"stretch\" spacing={4}>\n <FormControl>\n <FormLabel>Hledat tým (FAČR)</FormLabel>\n <InputGroup>\n <Input value={query} onChange={(e) => { setQuery(e.target.value); }} placeholder=\"Zadejte název týmu\" />\n <InputRightElement width=\"8rem\">\n <Button size=\"xs\" onClick={() => fileRef.current?.click()}>Nahrát logo</Button>\n </InputRightElement>\n </InputGroup>\n {searchResults.length > 0 && (\n <Box \n mt={4} \n bg={searchBg}\n borderWidth=\"1px\" \n borderRadius=\"lg\" \n overflowX=\"auto\"\n boxShadow=\"sm\"\n mb={6}\n >\n <List spacing={0}>\n {searchResults.map((r: any) => (\n <ListItem\n key={r.id}\n px={3}\n py={2}\n _hover={{ bg: 'gray.50', cursor: 'pointer' }}\n onClick={async () => {\n setForm((f) => ({ ...f, external_team_id: r.id, team_name: r.name, logo_url: r.logo_url || f.logo_url }));\n setQuery(r.name);\n try {\n const apiUrl = await fetchLogoFromLogoAPI(r.id, r.name);\n if (apiUrl) {\n setForm((f) => ({ ...f, logo_url: apiUrl }));\n }\n } catch {}\n }}\n >\n <HStack justify=\"space-between\" spacing={3}>\n <HStack spacing={3} maxW=\"80%\">\n {r.logo_url ? (\n <Image src={r.logo_url} alt={r.name} boxSize=\"20px\" objectFit=\"contain\" />\n ) : (\n <Badge colorScheme=\"gray\">bez loga</Badge>\n )}\n <Text noOfLines={1}>{r.name}</Text>\n </HStack>\n {r.logo_url && <Badge colorScheme=\"green\">logo</Badge>}\n </HStack>\n </ListItem>\n ))}\n </List>\n </Box>\n )}\n <input ref={fileRef} type=\"file\" accept=\"image/png,image/svg+xml,image/jpeg,application/pdf\" style={{ display: 'none' }} onChange={async (e) => {\n const file = e.target.files?.[0];\n if (!file) return;\n try {\n const { url } = await uploadImage(file);\n setForm((f) => ({ ...f, logo_url: url }));\n setUploadedFile(file); // Store for later upload to external API\n toast({ title: 'Logo nahráno', status: 'success' });\n } catch (err: any) {\n toast({ title: 'Nahrávání selhalo', description: err?.message || 'Zkuste to znovu', status: 'error' });\n } finally {\n if (fileRef.current) fileRef.current.value = '' as any;\n }\n }} />\n </FormControl>\n\n <FormControl>\n <FormLabel>Název týmu</FormLabel>\n <Input value={form.team_name} onChange={(e) => setForm({ ...form, team_name: e.target.value })} />\n </FormControl>\n\n <FormControl>\n <FormLabel>Logo URL</FormLabel>\n <Input value={form.logo_url} onChange={(e) => setForm({ ...form, logo_url: e.target.value })} />\n </FormControl>\n {selected?.variantNames && selected.variantNames.length > 1 && (\n <Alert status=\"info\">\n <AlertIcon />\n Upravíte také duplicitní názvy: {Array.from(new Set(selected.variantNames)).join(', ')}\n </Alert>\n )}\n {showExternalUploadInfo && (\n <Alert status=\"info\" variant=\"left-accent\">\n <AlertIcon />\n <VStack align=\"start\" spacing={1}>\n <Text fontSize=\"sm\" fontWeight=\"medium\">Logo bude automaticky nahráno na logoapi.sportcreative.eu</Text>\n <Text fontSize=\"xs\" color=\"gray.600\">Toto poskytuje zálohu a sdílení log mezi aplikacemi.</Text>\n </VStack>\n </Alert>\n )}\n </VStack>\n </DrawerBody>\n <DrawerFooter>\n <HStack>\n <Button variant=\"outline\" onClick={() => { setIsOpen(false); setSelected(null); }}>Zrušit</Button>\n <Button colorScheme=\"blue\" isLoading={onSave.isPending} onClick={() => onSave.mutate()}>Uložit</Button>\n </HStack>\n </DrawerFooter>\n </DrawerContent>\n </Drawer>\n </Box>\n </AdminLayout>\n );\n};\n\nexport default TeamsAdminPage;\n","import React, { useEffect, useState } from 'react';\nimport {\n Box,\n Button,\n Flex,\n FormControl,\n FormLabel,\n FormHelperText,\n Heading,\n IconButton,\n Table,\n Tbody,\n Td,\n Text,\n Th,\n Thead,\n Tr,\n useDisclosure,\n useToast,\n Badge,\n Input,\n InputGroup,\n InputLeftElement,\n HStack,\n VStack,\n Textarea,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalFooter,\n ModalBody,\n ModalCloseButton,\n useBreakpointValue,\n Switch,\n Tooltip,\n Spinner,\n InputRightElement,\n Checkbox,\n Select,\n Tabs,\n TabList,\n Tab,\n TabPanels,\n TabPanel,\n useColorModeValue,\n} from '@chakra-ui/react';\nimport { AddIcon, DeleteIcon, EmailIcon, SearchIcon } from '@chakra-ui/icons';\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { format } from 'date-fns';\nimport { cs } from 'date-fns/locale';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport { usePublicSettings } from '../../hooks/usePublicSettings';\nimport { facrApi } from '../../services/facr/facrApi';\nimport {\n getNewsletterSubscribers,\n sendNewsletter,\n sendNewsletterTest,\n deleteSubscriber,\n toggleSubscriberStatus,\n NewsletterSubscriber,\n NewsletterSendData,\n getNewsletterStatus,\n sendNewsletterTestAdvanced,\n NewsletterTestType,\n sendNewsletterDigest,\n setNewsletterAutomation,\n previewNewsletter,\n DigestType,\n createNewsletterSubscriber,\n searchByICO,\n AresCustomerInfo,\n} from '../../services/admin/newsletter';\nimport { getAdminSettings, updateAdminSettings, AdminSettings } from '../../services/settings';\nimport { adminSendSmtpTest, AdminSmtpTestPayload } from '../../services/admin/newsletter';\nimport { getRecentEmailStats, EmailStatRow, getEmailEventsForLog, EmailEventRow } from '../../services/admin/newsletter';\nimport { HelpTooltipCard } from '../../components/common/HelpTooltipCard';\nimport DateRangePicker from '../../components/common/DateRangePicker';\nimport { useConfirmDialog } from '../../contexts/ConfirmDialogContext';\n\nexport default function NewsletterAdminPage() {\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const inputBg = useColorModeValue('white', 'gray.700');\n const textSecondary = useColorModeValue('gray.600', 'gray.400');\n const hoverBg = useColorModeValue('gray.50', 'gray.700');\n const [searchTerm, setSearchTerm] = useState('');\n const [selectedSubscribers, setSelectedSubscribers] = useState<number[]>([]);\n const [newsletterData, setNewsletterData] = useState<NewsletterSendData>({\n subject: '',\n content: '',\n });\n\n // SMTP test (admin)\n const [smtpHost, setSmtpHost] = useState('');\n const [smtpPort, setSmtpPort] = useState<number | ''>('');\n const [smtpUser, setSmtpUser] = useState('');\n const [smtpPass, setSmtpPass] = useState('');\n const [smtpFrom, setSmtpFrom] = useState('');\n const [smtpTo, setSmtpTo] = useState('');\n const [smtpTLS, setSmtpTLS] = useState(true);\n const [smtpSubject, setSmtpSubject] = useState('SMTP Test');\n const [smtpBody, setSmtpBody] = useState('<p>Toto je testovací email (admin SMTP debug).</p>');\n const [showSmtpPass, setShowSmtpPass] = useState(false);\n\n const adminSmtpTestMutation = useMutation({\n mutationFn: async () => {\n const payload: AdminSmtpTestPayload = {\n host: smtpHost.trim(),\n port: typeof smtpPort === 'number' ? smtpPort : 0,\n username: smtpUser || undefined,\n password: smtpPass || undefined,\n from: smtpFrom.trim(),\n to: smtpTo.trim(),\n subject: smtpSubject || undefined,\n body: smtpBody || undefined,\n use_tls: smtpTLS,\n };\n return adminSendSmtpTest(payload);\n },\n onSuccess: (res: any) => {\n if (res?.ok) {\n toast({ title: 'SMTP test úspěšný', description: res?.message || 'Test email sent', status: 'success' });\n } else {\n toast({ title: 'SMTP test selhal', description: res?.error || 'Chyba při odeslání testu', status: 'error' });\n }\n },\n onError: (err: any) => {\n toast({ title: 'Chyba požadavku', description: err?.response?.data?.error || err?.message, status: 'error' });\n }\n });\n const [testEmail, setTestEmail] = useState<string>('');\n const [testEmails, setTestEmails] = useState<string>('');\n const [testType, setTestType] = useState<NewsletterTestType>('newsletter');\n const [prefsModalOpen, setPrefsModalOpen] = useState(false);\n const [editingSubscriber, setEditingSubscriber] = useState<NewsletterSubscriber | null>(null);\n const [editingPrefs, setEditingPrefs] = useState<Record<string, boolean>>({});\n // Send mode: custom body or digest template\n const [sendMode, setSendMode] = useState<'custom' | DigestType>('custom');\n const [competitions, setCompetitions] = useState<string>('');\n const [previewSubject, setPreviewSubject] = useState<string>('');\n const [previewHtml, setPreviewHtml] = useState<string>('');\n const [previewLoading, setPreviewLoading] = useState<boolean>(false);\n type MailType = 'weekly' | 'matches' | 'scores' | 'blogs' | 'events';\n const mailTypeLabel: Record<MailType, string> = { weekly: 'Týdenní přehled', matches: 'Zápasy', scores: 'Výsledky', blogs: 'Novinky', events: 'Akce' };\n const [detailsOpen, setDetailsOpen] = useState(false);\n const [activeType, setActiveType] = useState<MailType | null>(null);\n const [typePreview, setTypePreview] = useState<Record<string, { subject: string; html: string } | undefined>>({});\n const [detailsCompetitions, setDetailsCompetitions] = useState<string>('');\n const [detailsLoading, setDetailsLoading] = useState<boolean>(false);\n const [sendNowLoading, setSendNowLoading] = useState<boolean>(false);\n \n // Add subscriber state\n const [newSubscriberEmail, setNewSubscriberEmail] = useState('');\n const [newSubscriberICO, setNewSubscriberICO] = useState('');\n const [newSubscriberPrefs, setNewSubscriberPrefs] = useState<Record<string, boolean>>({\n weekly: true,\n matches: true,\n scores: true,\n blogs: true,\n events: true,\n });\n const [icoSearchResult, setIcoSearchResult] = useState<AresCustomerInfo | null>(null);\n const [icoSearching, setIcoSearching] = useState(false);\n \n const openDetails = (t: MailType) => { setActiveType(t); setDetailsOpen(true); };\n const closeDetails = () => { setDetailsOpen(false); setActiveType(null); setDetailsCompetitions(''); };\n\n // Helpers for competitions multi-select handling\n const selectedCompCodes = React.useMemo(() => {\n return new Set((competitions || '').split(',').map((s) => s.trim()).filter(Boolean));\n }, [competitions]);\n const toggleComp = (code: string, on: boolean) => {\n const next = new Set(selectedCompCodes);\n if (on) next.add(code); else next.delete(code);\n setCompetitions(Array.from(next).join(', '));\n };\n const clearComps = () => setCompetitions('');\n const selectAllComps = () => setCompetitions(compOptions.map(o => o.code).join(', '));\n\n const detailsSelectedCompCodes = React.useMemo(() => {\n return new Set((detailsCompetitions || '').split(',').map((s) => s.trim()).filter(Boolean));\n }, [detailsCompetitions]);\n const toggleDetailsComp = (code: string, on: boolean) => {\n const next = new Set(detailsSelectedCompCodes);\n if (on) next.add(code); else next.delete(code);\n setDetailsCompetitions(Array.from(next).join(', '));\n };\n const detailsClearComps = () => setDetailsCompetitions('');\n const detailsSelectAllComps = () => setDetailsCompetitions(compOptions.map(o => o.code).join(', '));\n\n // Fetch subscribers\n const { data: subscribers = [], isLoading } = useQuery({\n queryKey: ['admin', 'newsletter-subscribers'],\n queryFn: getNewsletterSubscribers,\n });\n\n const recipientsForType = (t: MailType): string[] => {\n const key = t === 'weekly' ? 'weekly' : t;\n return subscribers\n .filter((s: any) => s.is_active && s?.preferences && s.preferences[key] === true)\n .map((s: any) => s.email);\n };\n const getRecipientsFor = (t: MailType, comps?: string): string[] => {\n const key = t === 'weekly' ? 'weekly' : t;\n const base = (subscribers as any[]).filter((s: any) => s?.is_active && s?.preferences && s.preferences[key] === true);\n if (!comps || !comps.trim() || (t !== 'matches' && t !== 'scores')) {\n return base.map((s: any) => s.email);\n }\n const list = comps.split(',').map((v) => v.trim().toLowerCase()).filter(Boolean);\n const filtered = base.filter((s: any) => {\n const prefs: any = s?.preferences || {};\n const raw: string = typeof prefs.competitions === 'string' && prefs.competitions ? prefs.competitions : (typeof prefs.categories === 'string' ? prefs.categories : '');\n const arr = raw.split(',').map((x: string) => x.trim().toLowerCase()).filter(Boolean);\n if (arr.length === 0) return true;\n return arr.some((v: string) => list.includes(v));\n });\n return filtered.map((s: any) => s.email);\n };\n const exportRecipientsCSV = (t: MailType, comps?: string) => {\n const list = getRecipientsFor(t, comps);\n const safeCSV = (value: any) => {\n const s = String(value ?? '');\n return /^[=+\\-@]/.test(s) ? `'${s}` : s;\n };\n const header = ['email','type','competitions'];\n const lines = [\n header.join(','),\n ...list.map(e => [safeCSV(e), t, (comps || '').trim()].join(','))\n ];\n const blob = new Blob([\"\\ufeff\" + lines.join('\\n')], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `newsletter_recipients_${t}.csv`;\n a.click();\n URL.revokeObjectURL(url);\n };\n const loadPreviewForType = async (t: MailType, comps?: string) => {\n const prefs: any = {};\n if (t === 'weekly') { prefs.blogs = true; prefs.events = true; prefs.matches = true; prefs.scores = true; }\n else { (prefs as any)[t] = true; }\n if (comps && comps.trim()) { prefs.competitions = comps.trim(); }\n const res = await previewNewsletter({ preferences: prefs });\n setTypePreview(prev => ({ ...prev, [t]: { subject: res.subject, html: res.html } }));\n };\n useEffect(() => {\n if (detailsOpen && activeType && !typePreview[activeType]) {\n (async () => {\n try {\n setDetailsLoading(true);\n await loadPreviewForType(activeType!, detailsCompetitions);\n } finally {\n setDetailsLoading(false);\n }\n })();\n }\n }, [detailsOpen, activeType]);\n\n // Prefetch preview subjects for status list when there are recipients\n useEffect(() => {\n const types: MailType[] = ['weekly','matches','scores','blogs','events'];\n (async () => {\n for (const t of types) {\n try {\n const count = recipientsForType(t).length;\n if (count > 0 && !typePreview[t]) {\n await loadPreviewForType(t);\n }\n } catch {}\n }\n })();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [subscribers]);\n \n const { isOpen, onOpen, onClose } = useDisclosure();\n const testModal = useDisclosure();\n const smtpModal = useDisclosure();\n const addSubscriberModal = useDisclosure();\n const toast = useToast();\n const queryClient = useQueryClient();\n const isMobile = useBreakpointValue({ base: true, md: false });\n\n // Load club competitions for nicer dropdowns (FACR)\n const { data: publicSettings } = usePublicSettings();\n const clubId = publicSettings?.club_id;\n const clubType = (publicSettings?.club_type as 'football' | 'futsal') || 'football';\n const { data: clubCompetitions = [] } = useQuery({\n queryKey: ['facr', 'competitions', clubId, clubType],\n queryFn: async () => {\n if (!clubId) return [] as Array<{ code?: string; id?: string; name?: string }>;\n const comps = await facrApi.getClubCompetitions(clubId, clubType);\n return comps || [];\n },\n enabled: !!clubId,\n });\n const compOptions = (clubCompetitions as any[]).map((c) => ({\n code: String(c?.code || c?.id || ''),\n name: String(c?.name || c?.code || c?.id || ''),\n })).filter((o) => o.code);\n\n // Admin settings (for scheduling)\n const settingsQuery = useQuery({\n queryKey: ['admin', 'settings'],\n queryFn: getAdminSettings,\n });\n const settings = settingsQuery.data as AdminSettings | undefined;\n const [enableWeekly, setEnableWeekly] = useState<boolean>(!!settings?.enable_weekly);\n const [enableMatchReminders, setEnableMatchReminders] = useState<boolean>(!!settings?.enable_match_reminders);\n const [enableResults, setEnableResults] = useState<boolean>(!!settings?.enable_results);\n const [weeklyDay, setWeeklyDay] = useState<AdminSettings['newsletter_weekly_day']>(settings?.newsletter_weekly_day || 'sun');\n const toTimeString = (h?: number) => (String(typeof h === 'number' ? Math.max(0, Math.min(23, h)) : 18).padStart(2, '0')) + ':00';\n const [weeklyTime, setWeeklyTime] = useState<string>(toTimeString(settings?.newsletter_weekly_hour as number | undefined));\n const [reminderLead, setReminderLead] = useState<number>(typeof settings?.newsletter_reminder_lead_hours === 'number' ? (settings!.newsletter_reminder_lead_hours as number) : 48);\n const [quietStartTime, setQuietStartTime] = useState<string>(toTimeString(settings?.newsletter_quiet_start as number | undefined));\n const [quietEndTime, setQuietEndTime] = useState<string>(toTimeString(settings?.newsletter_quiet_end as number | undefined));\n\n // Sync local state when settings load\n useEffect(() => {\n if (!settings) return;\n setEnableWeekly(!!settings.enable_weekly);\n setEnableMatchReminders(!!settings.enable_match_reminders);\n setEnableResults(!!settings.enable_results);\n setWeeklyDay(settings.newsletter_weekly_day || 'sun');\n setWeeklyTime(toTimeString(typeof settings.newsletter_weekly_hour === 'number' ? settings.newsletter_weekly_hour! : 18));\n setReminderLead(typeof settings.newsletter_reminder_lead_hours === 'number' ? settings.newsletter_reminder_lead_hours! : 48);\n setQuietStartTime(toTimeString(typeof settings.newsletter_quiet_start === 'number' ? settings.newsletter_quiet_start! : 22));\n setQuietEndTime(toTimeString(typeof settings.newsletter_quiet_end === 'number' ? settings.newsletter_quiet_end! : 7));\n }, [settings]);\n\n const parseHour = (t: string) => {\n const m = /^\\s*(\\d{1,2})(?::(\\d{1,2}))?/.exec(t || '');\n const h = m ? parseInt(m[1], 10) : 18;\n return Math.max(0, Math.min(23, isNaN(h) ? 18 : h));\n };\n const saveScheduleMutation = useMutation({\n mutationFn: () => updateAdminSettings({\n enable_weekly: enableWeekly,\n enable_match_reminders: enableMatchReminders,\n enable_results: enableResults,\n newsletter_weekly_day: weeklyDay,\n newsletter_weekly_hour: parseHour(weeklyTime),\n newsletter_reminder_lead_hours: reminderLead,\n newsletter_quiet_start: parseHour(quietStartTime),\n newsletter_quiet_end: parseHour(quietEndTime),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['admin', 'settings'] });\n toast({ title: 'Nastavení rozesílek uloženo', status: 'success' });\n },\n onError: (err: any) => {\n toast({ title: 'Chyba při ukládání', description: err?.response?.data?.error || err?.message, status: 'error' });\n }\n });\n\n // Basic client-side sanitizer for preview (defense-in-depth; backend should still sanitize)\n const sanitizeHtml = (html: string): string => {\n try {\n // Remove script/style/iframe tags entirely\n const withoutDangerousTags = html.replace(/<\\s*(script|style|iframe)[^>]*>[\\s\\S]*?<\\s*\\/\\s*\\1\\s*>/gi, '');\n // Remove event handlers like onClick, onError, etc.\n const withoutEvents = withoutDangerousTags.replace(/ on[a-zA-Z]+\\s*=\\s*\"[^\"]*\"/g, '').replace(/ on[a-zA-Z]+\\s*=\\s*'[^']*'/g, '').replace(/ on[a-zA-Z]+\\s*=\\s*[^\\s>]+/g, '');\n // Neutralize javascript:, data: URLs in href/src\n const neutralizedUrls = withoutEvents.replace(/(href|src)\\s*=\\s*([\"'])\\s*(javascript:|data:)/gi, '$1=$2#');\n return neutralizedUrls;\n } catch {\n return '';\n }\n };\n\n // Filter subscribers based on search term\n const filteredSubscribers = subscribers.filter((subscriber) =>\n subscriber.email.toLowerCase().includes(searchTerm.toLowerCase())\n );\n\n // Toggle subscriber status\n const toggleStatusMutation = useMutation({\n mutationFn: ({ id, isActive }: { id: number; isActive: boolean }) =>\n toggleSubscriberStatus(id, isActive),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['admin', 'newsletter-subscribers'] });\n toast({\n title: 'Stav odběratele byl aktualizován',\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n },\n });\n\n // Delete subscriber\n const deleteMutation = useMutation({\n mutationFn: deleteSubscriber,\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['admin', 'newsletter-subscribers'] });\n setSelectedSubscribers([]);\n toast({\n title: 'Odběratel byl smazán',\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n },\n });\n\n const updatePrefsMutation = useMutation({\n mutationFn: ({ id, prefs }: { id: number; prefs: Record<string, boolean> }) =>\n // lazy import to avoid cyclic imports\n import('../../services/admin/newsletter').then((m) => m.updateSubscriberPreferences(id, prefs)),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['admin', 'newsletter-subscribers'] });\n setPrefsModalOpen(false);\n toast({ title: 'Preference uloženy', status: 'success' });\n },\n onError: (err: any) => {\n toast({ title: 'Chyba při ukládání preferencí', description: err?.response?.data?.error || err?.message, status: 'error' });\n },\n });\n\n // Send newsletter\n const sendNewsletterMutation = useMutation({\n mutationFn: sendNewsletter,\n onSuccess: () => {\n onClose();\n setNewsletterData({ subject: '', content: '' });\n toast({\n title: 'Newsletter byl odeslán',\n status: 'success',\n duration: 5000,\n isClosable: true,\n });\n },\n onError: (error: any) => {\n toast({\n title: 'Chyba při odesílání newsletteru',\n description: error?.response?.data?.error || error?.response?.data?.message || error?.message || 'Došlo k chybě',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n },\n });\n\n // Send test newsletter\n const sendTestMutation = useMutation({\n mutationFn: () => {\n const emails = testEmails\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n if (emails.length > 0) {\n return sendNewsletterTestAdvanced({ emails, type: testType });\n }\n if (testEmail) {\n return sendNewsletterTestAdvanced({ email: testEmail, type: testType });\n }\n return sendNewsletterTestAdvanced({ type: testType });\n },\n onSuccess: (data: { message: string; recipient?: string; recipients?: string[]; type: string }) => {\n toast({\n title: 'Test odeslán',\n description:\n data?.recipients && data.recipients.length > 0\n ? `E-mail byl odeslán na ${data.recipients.join(', ')}`\n : data?.recipient\n ? `E-mail byl odeslán na ${data.recipient}`\n : 'Testovací e-mail byl odeslán',\n status: 'success',\n duration: 4000,\n isClosable: true,\n });\n setTestEmail('');\n setTestEmails('');\n testModal.onClose();\n },\n onError: (error: any) => {\n toast({\n title: 'Chyba při odesílání testu',\n description: error?.response?.data?.error || error?.response?.data?.message || error?.message || 'Došlo k chybě',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n },\n });\n\n // Create subscriber mutation\n const createSubscriberMutation = useMutation({\n mutationFn: ({ email, preferences }: { email: string; preferences?: Record<string, boolean> }) =>\n createNewsletterSubscriber(email, preferences),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['admin', 'newsletter-subscribers'] });\n toast({\n title: 'Odběratel byl přidán',\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n // Reset form\n setNewSubscriberEmail('');\n setNewSubscriberICO('');\n setIcoSearchResult(null);\n setNewSubscriberPrefs({\n weekly: true,\n matches: true,\n scores: true,\n blogs: true,\n events: true,\n });\n addSubscriberModal.onClose();\n },\n onError: (error: any) => {\n toast({\n title: 'Chyba při přidávání odběratele',\n description: error?.response?.data?.error || error?.message || 'Došlo k chybě',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n },\n });\n\n // ICO search mutation\n const icoSearchMutation = useMutation({\n mutationFn: searchByICO,\n onSuccess: (data) => {\n setIcoSearchResult(data);\n if (data.found && data.name) {\n // Auto-fill email if not already set\n if (!newSubscriberEmail.trim()) {\n setNewSubscriberEmail(data.name);\n }\n }\n },\n onError: (error: any) => {\n setIcoSearchResult(null);\n toast({\n title: 'ICO nebylo nalezeno',\n description: error?.response?.data?.error || error?.message || 'Došlo k chybě při vyhledávání',\n status: 'warning',\n duration: 3000,\n isClosable: true,\n });\n },\n onSettled: () => {\n setIcoSearching(false);\n },\n });\n\n const handleSelectAll = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n setSelectedSubscribers(filteredSubscribers.map((s) => s.id));\n } else {\n setSelectedSubscribers([]);\n }\n };\n\n const handleSelectSubscriber = (id: number, isSelected: boolean) => {\n if (isSelected) {\n setSelectedSubscribers((prev) => [...prev, id]);\n } else {\n setSelectedSubscribers((prev) => prev.filter((subId) => subId !== id));\n }\n };\n\n const handleDeleteSelected = async () => {\n if (selectedSubscribers.length === 0) return;\n const ok = await confirm({\n title: 'Smazat vybrané odběratele',\n message: 'Opravdu chcete smazat vybrané odběratele?',\n confirmText: 'Smazat',\n cancelText: 'Zrušit',\n isDanger: true,\n });\n if (!ok) return;\n await Promise.all(selectedSubscribers.map((id) => deleteMutation.mutateAsync(id)));\n };\n\n const handleSendNewsletter = () => {\n sendNewsletterMutation.mutate(newsletterData);\n };\n\n // Handle ICO search with auto-trigger\n const handleICOChange = (value: string) => {\n setNewSubscriberICO(value);\n setIcoSearchResult(null);\n \n // Auto-search when ICO is 8 digits\n if (value.length === 8 && /^\\d+$/.test(value)) {\n setIcoSearching(true);\n icoSearchMutation.mutate(value);\n }\n };\n\n // Handle creating subscriber\n const handleCreateSubscriber = () => {\n if (!newSubscriberEmail.trim()) {\n toast({\n title: 'Chybí e-mail',\n description: 'Zadejte e-mailovou adresu odběratele',\n status: 'error',\n duration: 3000,\n });\n return;\n }\n\n createSubscriberMutation.mutate({\n email: newSubscriberEmail.trim(),\n preferences: newSubscriberPrefs,\n });\n };\n\n const formatDate = (dateString: string) => {\n return format(new Date(dateString), 'd. M. yyyy HH:mm', { locale: cs });\n };\n\n // Newsletter status\n const { data: statusData } = useQuery({\n queryKey: ['admin', 'newsletter-status'],\n queryFn: getNewsletterStatus,\n });\n const automationToggle = useMutation({\n mutationFn: (enabled: boolean) => setNewsletterAutomation(enabled),\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['admin', 'newsletter-status'] }),\n });\n\n // Recent delivery stats\n const { data: recentStats = [], isLoading: statsLoading } = useQuery<EmailStatRow[]>({\n queryKey: ['admin', 'newsletter-stats-recent'],\n queryFn: getRecentEmailStats,\n });\n const [statsFrom, setStatsFrom] = useState<string>('');\n const [statsTo, setStatsTo] = useState<string>('');\n const filteredStats = React.useMemo(() => {\n if (!recentStats || recentStats.length === 0) return recentStats;\n return recentStats.filter((row) => {\n const ts = new Date(row.created_at).getTime();\n if (isNaN(ts)) return true;\n if (statsFrom) {\n const fromTs = new Date(statsFrom + 'T00:00:00').getTime();\n if (!isNaN(fromTs) && ts < fromTs) return false;\n }\n if (statsTo) {\n const toTs = new Date(statsTo + 'T23:59:59').getTime();\n if (!isNaN(toTs) && ts > toTs) return false;\n }\n return true;\n });\n }, [recentStats, statsFrom, statsTo]);\n\n // Events modal state\n const [eventsModalOpen, setEventsModalOpen] = useState(false);\n const [activeLog, setActiveLog] = useState<EmailStatRow | null>(null);\n const eventsQuery = useQuery<EmailEventRow[]>({\n queryKey: ['admin', 'email-events', activeLog?.id],\n queryFn: () => getEmailEventsForLog(activeLog?.id || 0),\n enabled: !!activeLog?.id && eventsModalOpen,\n });\n const [eventFilter, setEventFilter] = useState<{ open: boolean; click: boolean; spam: boolean; unsubscribe: boolean }>({ open: true, click: true, spam: true, unsubscribe: true });\n const filteredEvents = (eventsQuery.data || []).filter((ev) => eventFilter[(ev.event_type as 'open'|'click'|'spam'|'unsubscribe')] ?? true);\n const { confirm } = useConfirmDialog();\n\n const exportCSV = () => {\n // Prevent CSV injection by prefixing dangerous leading characters\n const safeCSV = (value: any) => {\n const s = String(value ?? '');\n return /^[=+\\-@]/.test(s) ? `'${s}` : s;\n };\n const rows = (eventsQuery.data || []).map((ev) => ({\n id: ev.id,\n created_at: ev.created_at,\n event_type: ev.event_type,\n url: ev.meta?.url ?? '',\n ua: ev.meta?.ua ?? '',\n ip: ev.meta?.ip ?? '',\n }));\n const header = ['id','created_at','event_type','url','ua','ip'];\n const lines = [\n header.join(','),\n ...rows.map(r => [\n safeCSV(r.id),\n safeCSV(r.created_at),\n safeCSV(r.event_type),\n safeCSV(JSON.stringify(r.url)),\n safeCSV(JSON.stringify(r.ua)),\n safeCSV(JSON.stringify(r.ip))\n ].join(','))\n ];\n const blob = new Blob([\"\\ufeff\" + lines.join('\\n')], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `email_events_${activeLog?.id}.csv`;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n return (\n <AdminLayout>\n <Box p={6}>\n <Flex justify=\"space-between\" align=\"center\" mb={6} flexWrap=\"wrap\" gap={4}>\n <Box>\n <Heading size=\"lg\" mb={2}>\n Správa newsletteru\n </Heading>\n <Text color=\"gray.600\">\n Spravujte odběratele newsletteru a rozesílejte hromadné zprávy\n </Text>\n </Box>\n <HStack spacing={3}>\n <Button\n colorScheme=\"green\"\n leftIcon={<AddIcon />}\n onClick={addSubscriberModal.onOpen}\n >\n Přidat odběratele\n </Button>\n {selectedSubscribers.length > 0 && (\n <Button\n colorScheme=\"red\"\n variant=\"outline\"\n leftIcon={<DeleteIcon />}\n onClick={handleDeleteSelected}\n isLoading={deleteMutation.isLoading}\n >\n Smazat vybrané ({selectedSubscribers.length})\n </Button>\n )}\n <Button\n variant=\"outline\"\n onClick={testModal.onOpen}\n >\n Odeslat testovací e-mail\n </Button>\n <Button variant=\"outline\" onClick={smtpModal.onOpen}>Otestovat SMTP</Button>\n <Button\n colorScheme=\"blue\"\n leftIcon={<EmailIcon />}\n onClick={onOpen}\n isDisabled={subscribers.length === 0}\n >\n Odeslat newsletter\n </Button>\n </HStack>\n </Flex>\n\n {/* Tabs layout */}\n <Tabs colorScheme=\"blue\" isFitted>\n <TabList>\n <Tab>Stav</Tab>\n <Tab>Plánování</Tab>\n <Tab>Statistika</Tab>\n </TabList>\n <TabPanels>\n <TabPanel p={0}>\n {/* Status panel */}\n <Box bg={cardBg} borderRadius=\"lg\" boxShadow=\"sm\" p={4} mb={6}>\n <HStack justify=\"space-between\" align=\"center\" mb={3}>\n <Heading size=\"md\">Stav rozesílek</Heading>\n <HelpTooltipCard\n label=\"Jak funguje automatika\"\n title=\"Stav rozesílek a automatické odesílání\"\n items={[\n 'Zobrazuje, kolik odběratelů má newsletter aktivní a jak často běží automatická úloha.',\n 'Přepínač „Automatické rozesílky“ zapíná/vypíná celou automatiku harmonogram v záložce Plánování musí být také nastaven.',\n 'Další běh a příklady příjemců vám pomohou ověřit, že se emaily budou posílat správné skupině lidí.',\n ]}\n />\n </HStack>\n <HStack spacing={6} wrap=\"wrap\">\n <Text><b>Odběratelů:</b> {statusData?.total_subscribers ?? '—'}</Text>\n <Text><b>Aktivních:</b> {statusData?.active_subscribers ?? '—'}</Text>\n <Text><b>Další běh:</b> {statusData?.next_approximate ? format(new Date(statusData.next_approximate), 'd. M. yyyy HH:mm', { locale: cs }) : '—'}</Text>\n <Text><b>Interval:</b> {statusData?.interval_minutes ? `${statusData.interval_minutes} min` : '—'}</Text>\n <HStack>\n <Switch size=\"sm\" isChecked={!!statusData?.newsletter_enabled} onChange={(e)=> automationToggle.mutate(e.target.checked)} />\n <Text>Automatické rozesílky</Text>\n </HStack>\n </HStack>\n {/* Weekly schedule detail */}\n <Box mt={3} color={textSecondary} fontSize=\"sm\">\n {statusData?.weekly_day ? (\n <>\n <Text>\n <b>Týdenní přehled:</b> {statusData?.weekly_enabled ? 'Zapnuto' : 'Vypnuto'}\n {statusData?.weekly_enabled ? (\n <> — {({sun:'Neděle', mon:'Pondělí', tue:'Úterý', wed:'Středa', thu:'Čtvrtek', fri:'Pátek', sat:'Sobota'} as any)[statusData.weekly_day as any]}\n {' '}{String(statusData?.weekly_hour ?? 9).padStart(2,'0')}:00</>\n ) : null}\n </Text>\n {statusData?.weekly_next_scheduled ? (\n <Text>\n <b>Příští týdenní odeslání:</b> {format(new Date(statusData.weekly_next_scheduled), 'd. M. yyyy HH:mm', { locale: cs })}\n </Text>\n ) : null}\n </>\n ) : null}\n </Box>\n {statusData?.next_approximate ? (\n <Text color=\"gray.600\" fontSize=\"sm\" mt={2}>\n Další automatický newsletter za {(() => {\n const diff = new Date(statusData.next_approximate).getTime() - Date.now();\n if (diff <= 0) return 'méně než minutu';\n const mins = Math.floor(diff / 60000);\n const hrs = Math.floor(mins / 60);\n const rem = mins % 60;\n return hrs > 0 ? `${hrs} h ${rem} min` : `${mins} min`;\n })()}\n </Text>\n ) : null}\n {statusData?.sample_recipients?.length ? (\n <Box mt={3}>\n <Text color=\"gray.600\" fontSize=\"sm\">Ukázka příjemců ({statusData.sample_recipients.length}): {statusData.sample_recipients.join(', ')}</Text>\n </Box>\n ) : null}\n </Box>\n <Box bg={cardBg} borderRadius=\"lg\" boxShadow=\"sm\" p={4} mb={6}>\n <HStack justify=\"space-between\" align=\"center\" mb={3}>\n <Heading size=\"md\">Typy emailů</Heading>\n <HelpTooltipCard\n label=\"Jaké typy se posílají\"\n title=\"Typy newsletterů a komu chodí\"\n items={[\n 'Každý odběratel si v preferencích volí, jaké typy emailů chce dostávat (týdenní přehled, zápasy, výsledky, novinky, akce).',\n 'Počet příjemců u každého typu vychází z aktivních odběratelů, kteří mají daný typ povolený.',\n 'Přes tlačítko „Detail“ uvidíte náhled konkrétního emailu a můžete zkontrolovat předmět i obsah před hromadným odesláním.',\n ]}\n />\n </HStack>\n <VStack align=\"stretch\" spacing={3}>\n {(['weekly','matches','scores','blogs','events'] as MailType[]).map((t)=>{\n const count = recipientsForType(t).length;\n const enabled = t === 'weekly' ? !!settings?.enable_weekly : t === 'matches' ? !!settings?.enable_match_reminders : t === 'scores' ? !!settings?.enable_results : undefined;\n return (\n <Flex key={t} align=\"center\" justify=\"space-between\" p={3} borderWidth=\"1px\" borderRadius=\"md\" _hover={{ bg: hoverBg }}>\n <HStack spacing={3}>\n <Text fontWeight=\"600\">{mailTypeLabel[t]}</Text>\n {enabled !== undefined && (\n <Badge colorScheme={enabled ? 'green' : 'gray'}>{enabled ? 'Zapnuto' : 'Vypnuto'}</Badge>\n )}\n </HStack>\n <HStack spacing={4}>\n <Text color={textSecondary}>Příjemci: <b>{count}</b></Text>\n {typePreview[t]?.subject ? (\n <Badge colorScheme=\"blue\" title=\"Předmět připraveného emailu\">\n {typePreview[t]!.subject}\n </Badge>\n ) : null}\n <Button size=\"sm\" onClick={()=> openDetails(t)}>Detail</Button>\n </HStack>\n </Flex>\n );\n })}\n </VStack>\n </Box>\n </TabPanel>\n <TabPanel p={0}>\n {/* Scheduling controls */}\n <Box bg={cardBg} borderRadius=\"lg\" boxShadow=\"sm\" p={4} mb={6}>\n <HStack justify=\"space-between\" align=\"center\" mb={1}>\n <Heading size=\"md\">Plánování rozesílek</Heading>\n <HelpTooltipCard\n label=\"Jak funguje plánování\"\n title=\"Kdy se newslettery automaticky posílají\"\n items={[\n 'Nastavte den a čas pro týdenní přehled a předstih pro připomínky zápasů systém pak běží automaticky na pozadí.',\n 'Tiché hodiny brání odesílání výsledkových emailů v nevhodnou dobu (např. v noci).',\n 'Aby se emaily odesílaly, musí být zároveň zapnuté typy rozesílek v Nastavení a povolené „Automatické rozesílky“ na kartě Stav.',\n ]}\n />\n </HStack>\n <Text color=\"gray.600\" mb={4}>Nastavte, kdy se automaticky posílají jednotlivé typy newsletterů.</Text>\n {settingsQuery.isLoading ? (\n <HStack color=\"gray.600\"><Spinner size=\"sm\" /> <Text>Načítám nastavení…</Text></HStack>\n ) : (\n <VStack align=\"stretch\" spacing={4}>\n <HStack justify=\"space-between\">\n <Text fontWeight=\"600\">Týdenní přehled</Text>\n <Switch isChecked={enableWeekly} onChange={(e)=> setEnableWeekly(e.target.checked)} />\n </HStack>\n <HStack spacing={3}>\n <FormControl maxW=\"220px\">\n <FormLabel>Den v týdnu</FormLabel>\n <Select value={weeklyDay} onChange={(e)=> setWeeklyDay(e.target.value as any)}>\n <option value=\"mon\">Pondělí</option>\n <option value=\"tue\">Úterý</option>\n <option value=\"wed\">Středa</option>\n <option value=\"thu\">Čtvrtek</option>\n <option value=\"fri\">Pátek</option>\n <option value=\"sat\">Sobota</option>\n <option value=\"sun\">Neděle</option>\n </Select>\n </FormControl>\n <FormControl maxW=\"200px\">\n <FormLabel>Čas odeslání</FormLabel>\n <Input type=\"time\" step={900} value={weeklyTime} onChange={(e)=> setWeeklyTime(e.target.value)} />\n </FormControl>\n </HStack>\n\n <Box h=\"1px\" bg={useColorModeValue('gray.200', 'gray.700')} my={2} />\n\n <HStack justify=\"space-between\">\n <Text fontWeight=\"600\">Připomínky zápasů</Text>\n <Switch isChecked={enableMatchReminders} onChange={(e)=> setEnableMatchReminders(e.target.checked)} />\n </HStack>\n <HStack spacing={3}>\n <FormControl maxW=\"220px\">\n <FormLabel>Odeslat před (hodin)</FormLabel>\n <Input type=\"number\" min={1} max={168} value={reminderLead} onChange={(e)=> setReminderLead(Math.max(1, Math.min(168, Number(e.target.value)||0)))} />\n <FormHelperText>Výchozí 48 h před výkopem. Systém posílá i upozornění v den zápasu.</FormHelperText>\n </FormControl>\n </HStack>\n\n <Box h=\"1px\" bg={useColorModeValue('gray.200', 'gray.700')} my={2} />\n\n <HStack justify=\"space-between\">\n <Text fontWeight=\"600\">Výsledky po zápase</Text>\n <Switch isChecked={enableResults} onChange={(e)=> setEnableResults(e.target.checked)} />\n </HStack>\n <HStack spacing={3}>\n <FormControl maxW=\"200px\">\n <FormLabel>Tiché hodiny od</FormLabel>\n <Input type=\"time\" step={900} value={quietStartTime} onChange={(e)=> setQuietStartTime(e.target.value)} />\n </FormControl>\n <FormControl maxW=\"200px\">\n <FormLabel>Tiché hodiny do</FormLabel>\n <Input type=\"time\" step={900} value={quietEndTime} onChange={(e)=> setQuietEndTime(e.target.value)} />\n <FormHelperText>E-maily s výsledky se neposílají v tomto intervalu.</FormHelperText>\n </FormControl>\n </HStack>\n\n <HStack pt={2}>\n <Button colorScheme=\"blue\" onClick={()=> saveScheduleMutation.mutate()} isLoading={saveScheduleMutation.isLoading}>Uložit plánování</Button>\n </HStack>\n </VStack>\n )}\n </Box>\n </TabPanel>\n\n {/* Analytics tab */}\n <TabPanel p={0}>\n <Box bg={cardBg} borderRadius=\"lg\" boxShadow=\"sm\" p={4} mb={6}>\n <Heading size=\"md\" mb={3}>Dodání a interakce</Heading>\n {statsLoading ? (\n <HStack color=\"gray.600\"><Spinner size=\"sm\" /> <Text>Načítám statistiky…</Text></HStack>\n ) : recentStats.length === 0 ? (\n <Text color=\"gray.600\">Zatím nejsou k dispozici žádné záznamy.</Text>\n ) : (\n <>\n <HStack mb={3} spacing={3} align=\"center\">\n <DateRangePicker\n from={statsFrom || undefined}\n to={statsTo || undefined}\n onChange={(fromValue, toValue) => {\n setStatsFrom((fromValue || '').trim());\n setStatsTo((toValue || '').trim());\n }}\n size=\"sm\"\n />\n {(statsFrom || statsTo) && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n colorScheme=\"red\"\n onClick={() => { setStatsFrom(''); setStatsTo(''); }}\n borderRadius=\"md\"\n >\n Vymazat filtr\n </Button>\n )}\n </HStack>\n <Box overflowX=\"auto\">\n <Table size=\"sm\" variant=\"simple\">\n <Thead>\n <Tr>\n <Th>Čas</Th>\n <Th>Předmět</Th>\n <Th>Příjemce</Th>\n <Th isNumeric>Otevření</Th>\n <Th isNumeric>Kliknutí</Th>\n <Th isNumeric>Spam</Th>\n <Th isNumeric>Odhlášení</Th>\n <Th>Stav</Th>\n <Th>Detail</Th>\n </Tr>\n </Thead>\n <Tbody>\n {filteredStats.slice(0, 50).map((row) => (\n <Tr key={row.id}>\n <Td>{format(new Date(row.created_at), 'd. M. yyyy HH:mm', { locale: cs })}</Td>\n <Td>{row.subject}</Td>\n <Td>{row.recipient}</Td>\n <Td isNumeric>{row.opens}</Td>\n <Td isNumeric>{row.clicks}</Td>\n <Td isNumeric>{row.spam}</Td>\n <Td isNumeric>{row.unsubs}</Td>\n <Td>\n <Badge colorScheme={row.status === 'failed' ? 'red' : 'green'}>{row.status}</Badge>\n </Td>\n <Td>\n <Button size=\"xs\" variant=\"outline\" onClick={() => { setActiveLog(row); setEventsModalOpen(true); }}>Detail</Button>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n </>\n )}\n </Box>\n </TabPanel>\n </TabPanels>\n </Tabs>\n\n {/* Subscribers table */}\n <Box bg={cardBg} borderRadius=\"lg\" boxShadow=\"sm\" p={4} mb={6}>\n <InputGroup maxW=\"md\" mb={4}>\n <InputLeftElement pointerEvents=\"none\">\n <SearchIcon color=\"gray.400\" />\n </InputLeftElement>\n <Input\n placeholder=\"Hledat podle e-mailu...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n />\n </InputGroup>\n\n <Box overflowX=\"auto\">\n <Table variant=\"simple\">\n <Thead>\n <Tr>\n <Th w=\"40px\">\n <input\n type=\"checkbox\"\n onChange={handleSelectAll}\n checked={\n filteredSubscribers.length > 0 &&\n selectedSubscribers.length === filteredSubscribers.length\n }\n />\n </Th>\n <Th>E-mail</Th>\n <Th>Stav</Th>\n <Th>Datum registrace</Th>\n <Th>Poslední změna</Th>\n <Th w=\"120px\">Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {isLoading ? (\n <Tr>\n <Td colSpan={6} textAlign=\"center\" py={8}>\n Načítání...\n </Td>\n </Tr>\n ) : filteredSubscribers.length === 0 ? (\n <Tr>\n <Td colSpan={6} textAlign=\"center\" py={8} color=\"gray.500\">\n {searchTerm ? 'Žádní odběratelé nebyli nalezeni' : 'Žádní odběratelé'}\n </Td>\n </Tr>\n ) : (\n filteredSubscribers.map((subscriber) => (\n <Tr key={subscriber.id}>\n <Td>\n <input\n type=\"checkbox\"\n checked={selectedSubscribers.includes(subscriber.id)}\n onChange={(e) =>\n handleSelectSubscriber(subscriber.id, e.target.checked)\n }\n />\n </Td>\n <Td>{subscriber.email}</Td>\n <Td>\n <Badge\n colorScheme={subscriber.is_active ? 'green' : 'gray'}\n >\n {subscriber.is_active ? 'Aktivní' : 'Neaktivní'}\n </Badge>\n </Td>\n <Td>\n {(() => {\n const prefs = (subscriber as any).preferences;\n if (prefs && Object.keys(prefs).length > 0) {\n return Object.keys(prefs).map((k) =>\n prefs[k] ? <Badge key={k} mr={1} colorScheme=\"blue\">{k}</Badge> : null\n );\n }\n return <Text color=\"gray.500\">Žádné</Text>;\n })()}\n </Td>\n <Td>{formatDate(subscriber.created_at)}</Td>\n <Td>{formatDate(subscriber.updated_at)}</Td>\n <Td>\n <HStack spacing={2}>\n <Tooltip label={subscriber.is_active ? 'Deaktivovat' : 'Aktivovat'}>\n <span>\n <Switch\n colorScheme=\"green\"\n isChecked={subscriber.is_active}\n onChange={(e) =>\n toggleStatusMutation.mutate({\n id: subscriber.id,\n isActive: e.target.checked,\n })\n }\n isDisabled={toggleStatusMutation.isLoading}\n />\n </span>\n </Tooltip>\n <Tooltip label=\"Smazat\">\n <span>\n <IconButton\n aria-label=\"Smazat odběratele\"\n icon={<DeleteIcon />}\n size=\"sm\"\n colorScheme=\"red\"\n variant=\"ghost\"\n onClick={async () => {\n const ok = await confirm({\n title: 'Smazat odběratele',\n message: 'Opravdu chcete smazat tohoto odběratele?',\n confirmText: 'Smazat',\n cancelText: 'Zrušit',\n isDanger: true,\n });\n if (!ok) return;\n deleteMutation.mutate(subscriber.id);\n }}\n />\n </span>\n </Tooltip>\n <Tooltip label=\"Upravit preference\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditingSubscriber(subscriber);\n setEditingPrefs((subscriber as any).preferences || {});\n setPrefsModalOpen(true);\n }}\n >\n Upravit\n </Button>\n </Tooltip>\n </HStack>\n </Td>\n </Tr>\n ))\n )}\n </Tbody>\n </Table>\n </Box>\n </Box>\n </Box>\n\n {/* Send Newsletter Modal */}\n <Modal isOpen={isOpen} onClose={onClose} size=\"xl\">\n <ModalOverlay />\n <ModalContent maxW=\"90vw\" maxH=\"90vh\" overflowY=\"auto\">\n <ModalHeader>Odeslat newsletter</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack spacing={4} align=\"stretch\">\n <Text>\n Newsletter bude odeslán všem aktivním odběratelům ({subscribers.filter(s => s.is_active).length}).\n </Text>\n\n <FormControl>\n <FormLabel>Typ</FormLabel>\n <Select value={sendMode} onChange={(e)=> setSendMode(e.target.value as any)}>\n <option value=\"custom\">Vlastní obsah</option>\n <option value=\"matches\">Šablona: Zápasy</option>\n <option value=\"scores\">Šablona: Výsledky</option>\n <option value=\"events\">Šablona: Akce</option>\n <option value=\"blogs\">Šablona: Novinky</option>\n <option value=\"weekly\">Šablona: Týdenní přehled</option>\n </Select>\n <FormHelperText>Zvolte mezi vlastním obsahem nebo automatickou šablonou.</FormHelperText>\n </FormControl>\n \n {sendMode === 'custom' && (\n <>\n <FormControl isRequired>\n <FormLabel>Předmět</FormLabel>\n <Input\n placeholder=\"Předmět zprávy\"\n value={newsletterData.subject}\n onChange={(e) =>\n setNewsletterData({ ...newsletterData, subject: e.target.value })\n }\n />\n </FormControl>\n \n <FormControl isRequired>\n <FormLabel>Obsah zprávy</FormLabel>\n <Textarea\n placeholder=\"Zde napište obsah newsletteru...\"\n value={newsletterData.content}\n onChange={(e) =>\n setNewsletterData({ ...newsletterData, content: e.target.value })\n }\n rows={10}\n />\n <FormHelperText>\n Pro formátování textu můžete použít HTML značky.\n </FormHelperText>\n </FormControl>\n </>\n )}\n\n {sendMode !== 'custom' && (\n <>\n <FormControl>\n <FormLabel>Filtr soutěží (volitelné)</FormLabel>\n {compOptions.length > 0 ? (\n <VStack align=\"stretch\" spacing={2} maxH=\"220px\" overflowY=\"auto\" borderWidth=\"1px\" borderRadius=\"md\" p={3}>\n <HStack>\n <Button size=\"xs\" variant=\"outline\" onClick={selectAllComps}>Vybrat vše</Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={clearComps}>Zrušit vše</Button>\n </HStack>\n {compOptions.map((o) => {\n const checked = selectedCompCodes.has(o.code.toLowerCase()) || selectedCompCodes.has(o.code);\n return (\n <HStack key={o.code} justify=\"space-between\">\n <Text>{o.name}</Text>\n <Switch isChecked={checked} onChange={(e)=> toggleComp(o.code, e.target.checked)} />\n </HStack>\n );\n })}\n </VStack>\n ) : (\n <>\n <Input placeholder=\"NAPŘ. KP, I.A, I.B\" value={competitions} onChange={(e)=> setCompetitions(e.target.value)} />\n <FormHelperText>Čárkou oddělený seznam kódů soutěží.</FormHelperText>\n </>\n )}\n </FormControl>\n <HStack>\n <Button variant=\"outline\" onClick={async ()=>{\n setPreviewLoading(true);\n try {\n const prefs: any = {};\n if (sendMode === 'weekly') { prefs.blogs = true; prefs.events = true; prefs.matches = true; prefs.scores = true; } else { (prefs as any)[sendMode] = true; }\n if (competitions.trim()) { prefs.competitions = competitions.trim(); }\n const res = await previewNewsletter({ preferences: prefs });\n setPreviewSubject(res.subject);\n setPreviewHtml(res.html);\n } finally {\n setPreviewLoading(false);\n }\n }}>Náhled šablony</Button>\n {previewLoading && <Spinner size=\"sm\" />}\n {previewSubject && <Badge colorScheme=\"blue\">{previewSubject}</Badge>}\n </HStack>\n <Box mt={2} p={3} bg={useColorModeValue('gray.50', 'gray.900')} borderRadius=\"md\" borderWidth=\"1px\">\n <Box\n className=\"ql-editor\"\n p={3}\n borderRadius=\"md\"\n borderWidth=\"1px\"\n dangerouslySetInnerHTML={{ __html: sanitizeHtml(previewHtml || '<em>Náhled se zobrazí zde</em>') }}\n />\n </Box>\n <Box mt={4} p={4} bg={useColorModeValue('gray.50', 'gray.900')} borderRadius=\"md\">\n <Text fontWeight=\"bold\" mb={2}>Náhled:</Text>\n <Box\n border=\"1px\"\n borderColor=\"gray.200\"\n p={4}\n borderRadius=\"md\"\n bg={cardBg}\n className=\"ql-editor\"\n dangerouslySetInnerHTML={{ __html: sanitizeHtml(previewHtml || '<em>Náhled se zobrazí zde</em>') }}\n />\n </Box>\n </>\n )}\n \n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" mr={3} onClick={onClose}>\n Zrušit\n </Button>\n {sendMode === 'custom' ? (\n <Button\n colorScheme=\"blue\"\n onClick={handleSendNewsletter}\n isLoading={sendNewsletterMutation.isLoading}\n isDisabled={!newsletterData.subject || !newsletterData.content}\n leftIcon={<EmailIcon />}\n >\n Odeslat newsletter\n </Button>\n ) : (\n <Button\n colorScheme=\"blue\"\n onClick={async ()=>{\n try {\n await sendNewsletterDigest(sendMode as DigestType, competitions.trim() || undefined);\n toast({ title: 'Digest odeslán', status: 'success' });\n onClose();\n setPreviewHtml(''); setPreviewSubject(''); setCompetitions(''); setSendMode('custom');\n } catch (e: any) {\n toast({ title: 'Chyba při odeslání', description: e?.response?.data?.error || e?.message, status: 'error' });\n }\n }}\n leftIcon={<EmailIcon />}\n >\n Odeslat digest\n </Button>\n )}\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n <Modal isOpen={detailsOpen} onClose={closeDetails} size=\"5xl\">\n <ModalOverlay />\n <ModalContent maxW=\"95vw\" maxH=\"90vh\" overflowY=\"auto\">\n <ModalHeader>\n {activeType ? `Detail: ${mailTypeLabel[activeType]}` : 'Detail'}\n </ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack align=\"stretch\" spacing={4}>\n <HStack spacing={4} align=\"flex-end\">\n <FormControl maxW=\"420px\">\n <FormLabel>Filtr soutěží (volitelné)</FormLabel>\n {compOptions.length > 0 ? (\n <VStack align=\"stretch\" spacing={2} maxH=\"220px\" overflowY=\"auto\" borderWidth=\"1px\" borderRadius=\"md\" p={3}>\n <HStack>\n <Button size=\"xs\" variant=\"outline\" onClick={detailsSelectAllComps}>Vybrat vše</Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={detailsClearComps}>Zrušit vše</Button>\n </HStack>\n {compOptions.map((o) => {\n const checked = detailsSelectedCompCodes.has(o.code.toLowerCase()) || detailsSelectedCompCodes.has(o.code);\n return (\n <HStack key={o.code} justify=\"space-between\">\n <Text>{o.name}</Text>\n <Switch isChecked={checked} onChange={(e)=> toggleDetailsComp(o.code, e.target.checked)} />\n </HStack>\n );\n })}\n </VStack>\n ) : (\n <Input placeholder=\"NAPŘ. KP, I.A, I.B\" value={detailsCompetitions} onChange={(e)=> setDetailsCompetitions(e.target.value)} />\n )}\n </FormControl>\n <Button onClick={async()=>{ if(!activeType) return; setDetailsLoading(true); try { await loadPreviewForType(activeType, detailsCompetitions); } finally { setDetailsLoading(false); } }} isLoading={detailsLoading}>Aktualizovat náhled</Button>\n {activeType && typePreview[activeType]?.subject && (\n <Badge colorScheme=\"blue\">{typePreview[activeType]!.subject}</Badge>\n )}\n <Button colorScheme=\"blue\" variant=\"solid\" isLoading={sendNowLoading} onClick={async()=>{\n if(!activeType) return;\n const ok = await confirm({\n title: 'Odeslat nyní',\n message: `Odeslat \"${mailTypeLabel[activeType]}\" nyní? Email bude odeslán všem aktivním odběratelům.`,\n confirmText: 'Odeslat',\n cancelText: 'Zrušit',\n isDanger: true,\n });\n if(!ok) return;\n try {\n setSendNowLoading(true);\n await sendNewsletterDigest(activeType as DigestType, (detailsCompetitions || '').trim() || undefined);\n toast({ title: 'Digest odeslán', status: 'success' });\n } catch (e: any) {\n toast({ title: 'Chyba při odeslání', description: e?.response?.data?.error || e?.message, status: 'error' });\n } finally {\n setSendNowLoading(false);\n }\n }}>Odeslat nyní</Button>\n <Button variant=\"outline\" onClick={()=>{ if(!activeType) return; exportRecipientsCSV(activeType, detailsCompetitions); }}>Export CSV</Button>\n </HStack>\n <Box p={3} bg={useColorModeValue('gray.50', 'gray.900')} borderRadius=\"md\" borderWidth=\"1px\">\n <Box className=\"ql-editor\" bg={cardBg} p={3} borderRadius=\"md\" borderWidth=\"1px\" dangerouslySetInnerHTML={{ __html: sanitizeHtml(activeType ? (typePreview[activeType]?.html || '<em>Náhled se zobrazí zde</em>') : '<em>Náhled se zobrazí zde</em>') }} />\n </Box>\n <Box>\n <Heading size=\"sm\" mb={2}>Příjemci</Heading>\n {(() => {\n let list: string[] = [];\n if (activeType) {\n const typeKey = activeType === 'weekly' ? 'weekly' : activeType;\n const base = (subscribers as any[]).filter((s: any) => s?.is_active && s?.preferences && s.preferences[typeKey] === true);\n let filtered = base;\n const compsInput = (detailsCompetitions || '').trim();\n if (compsInput && (activeType === 'matches' || activeType === 'scores')) {\n const comps = compsInput.split(',').map((v) => v.trim().toLowerCase()).filter(Boolean);\n if (comps.length > 0) {\n filtered = base.filter((s: any) => {\n const prefs: any = s?.preferences || {};\n const raw: string = typeof prefs.competitions === 'string' && prefs.competitions\n ? prefs.competitions\n : (typeof prefs.categories === 'string' ? prefs.categories : '');\n const arr = raw.split(',').map((x: string) => x.trim().toLowerCase()).filter(Boolean);\n if (arr.length === 0) return true;\n return arr.some((v: string) => comps.includes(v));\n });\n }\n }\n list = filtered.map((s: any) => s.email);\n }\n const shown = list.slice(0, 50);\n return (\n <>\n {shown.length === 0 ? (\n <Text color=\"gray.600\">Žádní příjemci pro tento typ.</Text>\n ) : (\n <VStack align=\"stretch\" spacing={1} maxH=\"240px\" overflowY=\"auto\" borderWidth=\"1px\" borderRadius=\"md\" p={3}>\n {shown.map((e)=> (<Text key={e} fontFamily=\"mono\">{e}</Text>))}\n {list.length > shown.length && (\n <Text color=\"gray.600\">… a dalších {list.length - shown.length}</Text>\n )}\n </VStack>\n )}\n </>\n );\n })()}\n </Box>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button onClick={closeDetails}>Zavřít</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n {/* SMTP Test Modal */}\n <Modal isOpen={smtpModal.isOpen} onClose={smtpModal.onClose} size=\"lg\">\n <ModalOverlay />\n <ModalContent maxW=\"90vw\" maxH=\"90vh\" overflowY=\"auto\">\n <ModalHeader>Otestovat SMTP</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack spacing={4} align=\"stretch\">\n <HStack spacing={3} align=\"flex-end\">\n <FormControl>\n <FormLabel>Host</FormLabel>\n <Input placeholder=\"smtp.example.com\" value={smtpHost} onChange={(e)=> setSmtpHost(e.target.value)} />\n </FormControl>\n <FormControl maxW=\"140px\">\n <FormLabel>Port</FormLabel>\n <Input type=\"number\" placeholder=\"465\" value={smtpPort} onChange={(e)=> setSmtpPort(Number(e.target.value)||0)} />\n </FormControl>\n <FormControl maxW=\"140px\">\n <FormLabel>&nbsp;</FormLabel>\n <Checkbox isChecked={smtpTLS} onChange={(e)=> setSmtpTLS(e.target.checked)}>TLS/SSL</Checkbox>\n </FormControl>\n </HStack>\n <HStack spacing={3}>\n <FormControl>\n <FormLabel>Uživatel</FormLabel>\n <Input value={smtpUser} onChange={(e)=> setSmtpUser(e.target.value)} />\n </FormControl>\n <FormControl>\n <FormLabel>Heslo</FormLabel>\n <InputGroup>\n <Input type={showSmtpPass ? 'text' : 'password'} value={smtpPass} onChange={(e)=> setSmtpPass(e.target.value)} />\n <InputRightElement width=\"4.5rem\">\n <Button h=\"1.75rem\" size=\"sm\" onClick={()=> setShowSmtpPass(v=> !v)}>\n {showSmtpPass ? 'Skrýt' : 'Zobrazit'}\n </Button>\n </InputRightElement>\n </InputGroup>\n </FormControl>\n </HStack>\n <HStack spacing={3}>\n <FormControl>\n <FormLabel>From</FormLabel>\n <Input placeholder=\"club@example.com\" value={smtpFrom} onChange={(e)=> setSmtpFrom(e.target.value)} />\n </FormControl>\n <FormControl>\n <FormLabel>To (kam poslat test)</FormLabel>\n <Input placeholder=\"you@example.com\" value={smtpTo} onChange={(e)=> setSmtpTo(e.target.value)} />\n </FormControl>\n </HStack>\n <FormControl>\n <FormLabel>Předmět</FormLabel>\n <Input value={smtpSubject} onChange={(e)=> setSmtpSubject(e.target.value)} />\n </FormControl>\n <FormControl>\n <FormLabel>Tělo zprávy (HTML)</FormLabel>\n <Textarea rows={6} value={smtpBody} onChange={(e)=> setSmtpBody(e.target.value)} />\n </FormControl>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" mr={3} onClick={smtpModal.onClose}>Zavřít</Button>\n <Button colorScheme=\"blue\" onClick={()=> adminSmtpTestMutation.mutate()} isLoading={adminSmtpTestMutation.isLoading}>Odeslat test</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n {/* Test Email Modal */}\n <Modal isOpen={testModal.isOpen} onClose={testModal.onClose} size=\"md\">\n <ModalOverlay />\n <ModalContent maxW=\"90vw\" maxH=\"90vh\" overflowY=\"auto\">\n <ModalHeader>Odeslat testovací e-mail</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack spacing={4} align=\"stretch\">\n <Text color=\"gray.600\">\n Testovací e-mail bude odeslán na zadanou adresu. Pokud pole necháte prázdné, odešleme na výchozí administrátorský e-mail.\n </Text>\n <FormControl>\n <FormLabel>E-mail příjemce (volitelně)</FormLabel>\n <Input\n type=\"email\"\n placeholder=\"např. admin@priklad.cz\"\n value={testEmail}\n onChange={(e) => setTestEmail(e.target.value)}\n />\n </FormControl>\n <FormControl>\n <FormLabel>Více e-mailů (oddělené čárkou)</FormLabel>\n <Input\n placeholder=\"user1@priklad.cz, user2@priklad.cz\"\n value={testEmails}\n onChange={(e) => setTestEmails(e.target.value)}\n />\n <FormHelperText>Pokud vyplníte, použije se toto pole přednostně.</FormHelperText>\n </FormControl>\n <FormControl>\n <FormLabel>Typ testu</FormLabel>\n <select value={testType} onChange={(e) => setTestType(e.target.value as NewsletterTestType)}>\n <option value=\"newsletter\">Newsletter</option>\n <option value=\"welcome\">Uvítací</option>\n <option value=\"welcome_back\">Uvítací (návrat)</option>\n <option value=\"blogs\">Blogy (digest)</option>\n <option value=\"events\">Události (digest)</option>\n <option value=\"matches\">Zápasy (digest)</option>\n <option value=\"scores\">Výsledky (digest)</option>\n <option value=\"weekly\">Týdenní přehled</option>\n </select>\n </FormControl>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" mr={3} onClick={testModal.onClose}>\n Zavřít\n </Button>\n <Button colorScheme=\"blue\" onClick={() => sendTestMutation.mutate()} isLoading={sendTestMutation.isLoading}>\n Odeslat test\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n {/* Preferences Modal */}\n <Modal isOpen={prefsModalOpen} onClose={() => setPrefsModalOpen(false)} size=\"md\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Upravit preference</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack spacing={4} align=\"stretch\">\n <FormControl>\n <FormLabel>Týdenní přehled</FormLabel>\n <Switch isChecked={!!editingPrefs['weekly']} onChange={(e) => setEditingPrefs({ ...editingPrefs, weekly: e.target.checked })} />\n </FormControl>\n <FormControl>\n <FormLabel>Nadcházející zápasy</FormLabel>\n <Switch isChecked={!!editingPrefs['matches']} onChange={(e) => setEditingPrefs({ ...editingPrefs, matches: e.target.checked })} />\n </FormControl>\n <FormControl>\n <FormLabel>Blog</FormLabel>\n <Switch isChecked={!!editingPrefs['blogs']} onChange={(e) => setEditingPrefs({ ...editingPrefs, blogs: e.target.checked })} />\n </FormControl>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" mr={3} onClick={() => setPrefsModalOpen(false)}>Zrušit</Button>\n <Button\n colorScheme=\"blue\"\n onClick={() =>\n editingSubscriber\n ? updatePrefsMutation.mutate({ id: editingSubscriber.id, prefs: editingPrefs })\n : undefined\n }\n isLoading={updatePrefsMutation.isLoading}\n isDisabled={!editingSubscriber}\n >\n Uložit\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n {/* Add Subscriber Modal */}\n <Modal isOpen={addSubscriberModal.isOpen} onClose={addSubscriberModal.onClose} size=\"lg\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Přidat odběratele</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack spacing={4} align=\"stretch\">\n <FormControl>\n <FormLabel>E-mail odběratele</FormLabel>\n <Input\n value={newSubscriberEmail}\n onChange={(e) => setNewSubscriberEmail(e.target.value)}\n placeholder=\"email@example.com\"\n />\n </FormControl>\n\n <FormControl>\n <FormLabel>IČO (volitelné)</FormLabel>\n <InputGroup>\n <Input\n value={newSubscriberICO}\n onChange={(e) => handleICOChange(e.target.value)}\n placeholder=\"12345678\"\n maxLength={8}\n />\n <InputRightElement width=\"4.5rem\">\n {icoSearching ? (\n <Spinner size=\"sm\" />\n ) : (\n <Button\n size=\"sm\"\n onClick={() => {\n if (newSubscriberICO.length === 8 && /^\\d+$/.test(newSubscriberICO)) {\n setIcoSearching(true);\n icoSearchMutation.mutate(newSubscriberICO);\n }\n }}\n isDisabled={newSubscriberICO.length !== 8 || !/^\\d+$/.test(newSubscriberICO)}\n >\n Hledat\n </Button>\n )}\n </InputRightElement>\n </InputGroup>\n {icoSearchResult && (\n <Box mt={2} p={3} borderWidth=\"1px\" borderRadius=\"md\" bg={icoSearchResult.found ? \"green.50\" : \"red.50\"}>\n {icoSearchResult.found ? (\n <VStack align=\"start\" spacing={1}>\n <Text fontWeight=\"600\">Nalezeno:</Text>\n <Text><strong>Název:</strong> {icoSearchResult.name}</Text>\n <Text><strong>IČO:</strong> {icoSearchResult.ico}</Text>\n {icoSearchResult.dic && <Text><strong>DIČ:</strong> {icoSearchResult.dic}</Text>}\n <Text><strong>Adresa:</strong> {icoSearchResult.address}, {icoSearchResult.city}</Text>\n </VStack>\n ) : (\n <Text color=\"red.600\">Subjekt s IČO {newSubscriberICO} nebyl nalezen</Text>\n )}\n </Box>\n )}\n </FormControl>\n\n <FormControl>\n <FormLabel>Preference odběru</FormLabel>\n <VStack align=\"start\" spacing={2}>\n <Checkbox\n isChecked={!!newSubscriberPrefs.weekly}\n onChange={(e) => setNewSubscriberPrefs({ ...newSubscriberPrefs, weekly: e.target.checked })}\n >\n Týdenní přehled\n </Checkbox>\n <Checkbox\n isChecked={!!newSubscriberPrefs.matches}\n onChange={(e) => setNewSubscriberPrefs({ ...newSubscriberPrefs, matches: e.target.checked })}\n >\n Nadcházející zápasy\n </Checkbox>\n <Checkbox\n isChecked={!!newSubscriberPrefs.scores}\n onChange={(e) => setNewSubscriberPrefs({ ...newSubscriberPrefs, scores: e.target.checked })}\n >\n Výsledky zápasů\n </Checkbox>\n <Checkbox\n isChecked={!!newSubscriberPrefs.blogs}\n onChange={(e) => setNewSubscriberPrefs({ ...newSubscriberPrefs, blogs: e.target.checked })}\n >\n Novinky a články\n </Checkbox>\n <Checkbox\n isChecked={!!newSubscriberPrefs.events}\n onChange={(e) => setNewSubscriberPrefs({ ...newSubscriberPrefs, events: e.target.checked })}\n >\n Akce a události\n </Checkbox>\n </VStack>\n </FormControl>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" mr={3} onClick={addSubscriberModal.onClose}>\n Zrušit\n </Button>\n <Button\n colorScheme=\"blue\"\n onClick={handleCreateSubscriber}\n isLoading={createSubscriberMutation.isLoading}\n isDisabled={!newSubscriberEmail.trim()}\n >\n Přidat odběratele\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </AdminLayout>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport {\n Box,\n Container,\n Heading,\n VStack,\n HStack,\n Button,\n Table,\n Thead,\n Tbody,\n Tr,\n Th,\n Td,\n IconButton,\n useDisclosure,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalFooter,\n ModalBody,\n ModalCloseButton,\n FormControl,\n FormLabel,\n Input,\n Select,\n Switch,\n useToast,\n Badge,\n Tabs,\n TabList,\n TabPanels,\n Tab,\n TabPanel,\n Spinner,\n Alert,\n AlertIcon,\n Tooltip,\n Text,\n Divider,\n Card,\n CardBody,\n useColorModeValue,\n Flex,\n Textarea,\n Collapse,\n Icon,\n} from '@chakra-ui/react';\nimport { DragDropContext, Droppable, Draggable, DropResult } from 'react-beautiful-dnd';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport {\n AddIcon,\n EditIcon,\n DeleteIcon,\n DragHandleIcon,\n ChevronUpIcon,\n ChevronDownIcon,\n ExternalLinkIcon,\n ChevronRightIcon,\n ViewIcon,\n ViewOffIcon,\n} from '@chakra-ui/icons';\nimport {\n FaFacebook,\n FaInstagram,\n FaYoutube,\n FaTwitter,\n FaTiktok,\n FaLinkedin,\n FaDiscord,\n FaTwitch,\n FaHome,\n FaInfoCircle,\n FaCalendarAlt,\n FaFutbol,\n FaUsers,\n FaTable,\n FaNewspaper,\n FaVideo,\n FaCamera,\n FaSearch,\n FaBars,\n FaCog,\n FaHandshake,\n FaEnvelope,\n FaUserShield,\n FaFolder,\n FaBook,\n FaTshirt,\n FaLink,\n FaPoll,\n} from 'react-icons/fa';\n// Using simple up/down buttons instead of drag-drop for better compatibility\nimport {\n NavigationItem,\n SocialLink,\n getAllNavigationItems,\n createNavigationItem,\n updateNavigationItem,\n deleteNavigationItem,\n reorderNavigationItems,\n getAllSocialLinks,\n createSocialLink,\n updateSocialLink,\n deleteSocialLink,\n reorderSocialLinks,\n seedDefaultNavigation,\n} from '../../services/navigation';\nimport { HelpTooltipCard } from '../../components/common/HelpTooltipCard';\nimport { useConfirmDialog } from '../../contexts/ConfirmDialogContext';\nimport { useTranslation } from 'react-i18next';\n\nconst ADMIN_PAGE_PRESETS = [\n { value: 'dashboard', label: 'Nástěnka', url: '/admin' },\n { value: 'analytics', label: 'Analytika', url: '/admin/analytika' },\n { value: 'teams', label: 'Týmy', url: '/admin/tymy' },\n { value: 'matches', label: 'Zápasy', url: '/admin/zapasy' },\n { value: 'activities', label: 'Aktivity', url: '/admin/aktivity' },\n { value: 'players', label: 'Hráči', url: '/admin/hraci' },\n { value: 'articles', label: 'Články', url: '/admin/clanky' },\n { value: 'comments', label: 'Komentáře', url: '/admin/komentare' },\n { value: 'about', label: 'O klubu', url: '/admin/o-klubu' },\n { value: 'videos', label: 'Videa', url: '/admin/videa' },\n { value: 'gallery', label: 'Galerie', url: '/admin/galerie' },\n { value: 'banners', label: 'Bannery', url: '/admin/bannery' },\n { value: 'clothing', label: 'Oblečení', url: '/admin/obleceni' },\n { value: 'sponsors', label: 'Sponzoři', url: '/admin/sponzori' },\n { value: 'messages', label: 'Zprávy', url: '/admin/zpravy' },\n { value: 'contacts', label: 'Kontakty', url: '/admin/kontakty' },\n { value: 'newsletter', label: 'Zpravodaj', url: '/admin/newsletter' },\n { value: 'polls', label: 'Ankety', url: '/admin/ankety' },\n { value: 'sweepstakes', label: 'Soutěže', url: '/admin/sweepstakes' },\n { value: 'engagement', label: 'Odměny & Úspěchy', url: '/admin/engagement' },\n { value: 'navigation', label: 'Navigace', url: '/admin/navigace' },\n { value: 'competition_aliases', label: 'Alias soutěží', url: '/admin/aliasy-soutezi' },\n { value: 'users', label: 'Uživatelé', url: '/admin/uzivatele' },\n { value: 'settings', label: 'Nastavení', url: '/admin/nastaveni' },\n { value: 'files', label: 'Soubory', url: '/admin/soubory' },\n { value: 'scoreboard', label: 'Tabule (Scoreboard)', url: '/admin/scoreboard' },\n { value: 'scoreboard_remote', label: 'Scoreboard Remote', url: '/admin/scoreboard/remote' },\n { value: 'prefetch', label: 'Prefetch', url: '/admin/prefetch' },\n { value: 'docs', label: 'Dokumentace', url: '/admin/docs' },\n { value: 'webmail', label: 'Webmail', url: 'https://webmail.example.com' },\n];\n\nconst SOCIAL_PLATFORMS = [\n { value: 'facebook', label: 'Facebook', icon: FaFacebook },\n { value: 'instagram', label: 'Instagram', icon: FaInstagram },\n { value: 'youtube', label: 'YouTube', icon: FaYoutube },\n { value: 'twitter', label: 'Twitter', icon: FaTwitter },\n { value: 'tiktok', label: 'TikTok', icon: FaTiktok },\n { value: 'linkedin', label: 'LinkedIn', icon: FaLinkedin },\n { value: 'discord', label: 'Discord', icon: FaDiscord },\n { value: 'twitch', label: 'Twitch', icon: FaTwitch },\n];\n\nconst NAV_ICON_OPTIONS = [\n { value: 'FaHome', label: 'Domů', icon: FaHome },\n { value: 'FaInfoCircle', label: 'O klubu', icon: FaInfoCircle },\n { value: 'FaCalendarAlt', label: 'Kalendář', icon: FaCalendarAlt },\n { value: 'FaFutbol', label: 'Hráči', icon: FaFutbol },\n { value: 'FaUsers', label: 'Týmy', icon: FaUsers },\n { value: 'FaTable', label: 'Tabulky', icon: FaTable },\n { value: 'FaNewspaper', label: 'Články', icon: FaNewspaper },\n { value: 'FaVideo', label: 'Videa', icon: FaVideo },\n { value: 'FaCamera', label: 'Galerie', icon: FaCamera },\n { value: 'FaHandshake', label: 'Sponzoři', icon: FaHandshake },\n { value: 'FaEnvelope', label: 'Kontakt', icon: FaEnvelope },\n { value: 'FaSearch', label: 'Hledat', icon: FaSearch },\n { value: 'FaBars', label: 'Menu', icon: FaBars },\n { value: 'FaLink', label: 'Odkaz', icon: FaLink },\n { value: 'FaCog', label: 'Nastavení', icon: FaCog },\n { value: 'FaPoll', label: 'Ankety', icon: FaPoll },\n { value: 'FaUserShield', label: 'Uživatelé', icon: FaUserShield },\n { value: 'FaFolder', label: 'Soubory', icon: FaFolder },\n { value: 'FaBook', label: 'Stránka', icon: FaBook },\n { value: 'FaTshirt', label: 'Oblečení', icon: FaTshirt },\n];\n\nconst ICON_COMPONENTS: Record<string, any> = Object.fromEntries(NAV_ICON_OPTIONS.map(opt => [opt.value, opt.icon]));\n\n// NavItemCard component for hierarchical display\ninterface NavItemCardProps {\n item: NavigationItem;\n index: number;\n total: number;\n onMoveUp: () => void;\n onMoveDown: () => void;\n onEdit?: () => void;\n onDelete?: () => void;\n onAddChild: () => void;\n isExpanded: boolean;\n onToggleExpand: () => void;\n cardBg: string;\n borderColor: string;\n hoverBg: string;\n level?: number;\n onChildMoveUp?: (parentId: number, index: number) => void;\n onChildMoveDown?: (parentId: number, index: number) => void;\n onToggleVisible: (item: NavigationItem) => void;\n childrenDroppableId?: string;\n draggableChildPrefix?: string;\n onEditTarget?: (item: NavigationItem) => void;\n onDeleteTarget?: (item: NavigationItem) => void;\n}\n\nconst NavItemCard: React.FC<NavItemCardProps> = ({\n item,\n index,\n total,\n onMoveUp,\n onMoveDown,\n onEdit,\n onDelete,\n onAddChild,\n isExpanded,\n onToggleExpand,\n cardBg,\n borderColor,\n hoverBg,\n level = 0,\n onChildMoveUp,\n onChildMoveDown,\n onToggleVisible,\n childrenDroppableId,\n draggableChildPrefix,\n onEditTarget,\n onDeleteTarget,\n}) => {\n const hasChildren = item.children && item.children.length > 0;\n const indentPx = level * 32;\n const isCategory = item.type === 'dropdown';\n\n return (\n <Box ml={`${indentPx}px`}>\n <Card\n bg={item.visible ? cardBg : useColorModeValue('gray.100', 'gray.700')}\n borderWidth=\"1px\"\n borderColor={borderColor}\n _hover={{ bg: hoverBg }}\n transition=\"all 0.2s\"\n >\n <CardBody py={3}>\n <Flex align=\"center\" gap={3}>\n {/* Expand/Collapse button for items with children */}\n {hasChildren ? (\n <IconButton\n aria-label=\"Toggle children\"\n icon={isExpanded ? <ChevronDownIcon /> : <ChevronRightIcon />}\n size=\"sm\"\n variant=\"ghost\"\n onClick={onToggleExpand}\n />\n ) : (\n <Box w=\"32px\" /> \n )}\n\n {/* Reorder buttons */}\n <VStack spacing={0}>\n <IconButton\n aria-label=\"Nahoru\"\n icon={<ChevronUpIcon />}\n size=\"xs\"\n isDisabled={index === 0}\n onClick={onMoveUp}\n variant=\"ghost\"\n />\n <IconButton\n aria-label=\"Dolů\"\n icon={<ChevronDownIcon />}\n size=\"xs\"\n isDisabled={index === total - 1}\n onClick={onMoveDown}\n variant=\"ghost\"\n />\n </VStack>\n\n {/* Item info */}\n <VStack align=\"start\" flex={1} spacing={1}>\n <HStack>\n <Text fontWeight=\"bold\" fontSize=\"md\">\n {item.label}\n </Text>\n <Badge colorScheme={\n item.type === 'external' ? 'orange' :\n item.type === 'dropdown' ? 'purple' :\n item.type === 'page' ? 'blue' : 'green'\n }>\n {item.type}\n </Badge>\n {!item.visible && (\n <Badge colorScheme=\"red\">\n <HStack spacing={1}>\n <ViewOffIcon />\n <Text>Skryto</Text>\n </HStack>\n </Badge>\n )}\n </HStack>\n <HStack spacing={2} fontSize=\"sm\" color=\"gray.500\">\n {item.url && (\n <HStack>\n <Text isTruncated maxW=\"300px\">{item.url}</Text>\n {item.type === 'external' && <ExternalLinkIcon />}\n </HStack>\n )}\n {item.page_type && !item.url && (\n <Text>Page: {item.page_type}</Text>\n )}\n {hasChildren && (\n <Badge colorScheme=\"cyan\">\n {item.children!.length} {item.children!.length === 1 ? 'podpoložka' : 'podpoložek'}\n </Badge>\n )}\n </HStack>\n </VStack>\n\n {/* Action buttons */}\n <HStack spacing={1}>\n <Tooltip label={item.visible ? 'Skrýt' : 'Zobrazit'}>\n <IconButton\n aria-label={item.visible ? 'Skrýt' : 'Zobrazit'}\n icon={item.visible ? <ViewOffIcon /> : <ViewIcon />}\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => onToggleVisible(item)}\n />\n </Tooltip>\n {item.type === 'dropdown' && (\n <Tooltip label=\"Přidat podpoložku\">\n <IconButton\n aria-label=\"Přidat podpoložku\"\n icon={<AddIcon />}\n size=\"sm\"\n colorScheme=\"green\"\n variant=\"ghost\"\n onClick={onAddChild}\n />\n </Tooltip>\n )}\n <Tooltip label=\"Upravit\">\n <IconButton\n aria-label=\"Upravit\"\n icon={<EditIcon />}\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => (typeof onEditTarget === 'function' ? onEditTarget(item) : onEdit && onEdit())}\n />\n </Tooltip>\n <Tooltip label=\"Smazat\">\n <IconButton\n aria-label=\"Smazat\"\n icon={<DeleteIcon />}\n size=\"sm\"\n colorScheme=\"red\"\n variant=\"ghost\"\n onClick={() => (typeof onDeleteTarget === 'function' ? onDeleteTarget(item) : onDelete && onDelete())}\n />\n </Tooltip>\n </HStack>\n </Flex>\n </CardBody>\n </Card>\n\n {/* Always render a children Droppable for categories (dropdown type).\n This allows dropping into collapsed or empty categories. */}\n {isCategory && (\n <Droppable droppableId={childrenDroppableId || `children-${item.id}`}> \n {(provided) => (\n <VStack\n spacing={2}\n align=\"stretch\"\n mt={2}\n ref={provided.innerRef}\n {...provided.droppableProps}\n >\n {hasChildren && isExpanded && item.children!.map((child, childIndex) => (\n <Draggable key={String(child.id)} draggableId={`${(draggableChildPrefix || 'child')}-${child.id}`} index={childIndex}>\n {(dragProvided) => (\n <Box ref={dragProvided.innerRef} {...dragProvided.draggableProps} {...dragProvided.dragHandleProps}>\n <NavItemCard\n key={child.id}\n item={child}\n index={childIndex}\n total={item.children!.length}\n onMoveUp={() => onChildMoveUp && onChildMoveUp(item.id!, childIndex)}\n onMoveDown={() => onChildMoveDown && onChildMoveDown(item.id!, childIndex)}\n onEdit={() => (typeof onEditTarget === 'function' ? onEditTarget(child) : onEdit && onEdit())}\n onDelete={() => (typeof onDeleteTarget === 'function' ? onDeleteTarget(child) : onDelete && onDelete())}\n onAddChild={() => {}}\n isExpanded={false}\n onToggleExpand={() => {}}\n cardBg={cardBg}\n borderColor={borderColor}\n hoverBg={hoverBg}\n level={level + 1}\n onChildMoveUp={onChildMoveUp}\n onChildMoveDown={onChildMoveDown}\n onToggleVisible={onToggleVisible}\n onEditTarget={onEditTarget}\n onDeleteTarget={onDeleteTarget}\n />\n </Box>\n )}\n </Draggable>\n ))}\n {/* Provide a minimal drop zone even when collapsed or empty */}\n {!hasChildren && (\n <Box minH=\"8px\" />\n )}\n {provided.placeholder}\n </VStack>\n )}\n </Droppable>\n )}\n </Box>\n );\n};\n\nconst NavigationAdminPage = () => {\n const { t } = useTranslation();\n \n const PAGE_TYPE_OPTIONS = [\n { value: 'home', label: 'Domů', url: '/' },\n { value: 'about', label: 'O klubu', url: '/o-klubu' },\n { value: 'calendar', label: 'Kalendář', url: '/kalendar' },\n { value: 'matches', label: 'Zápasy', url: '/zapasy' },\n { value: 'activities', label: 'Aktivity', url: '/aktivity' },\n { value: 'players', label: 'Hráči', url: '/hraci' },\n { value: 'tables', label: 'Tabulky', url: '/tabulky' },\n { value: 'blog', label: 'Články', url: '/blog' },\n { value: 'videos', label: 'Videa', url: '/videa' },\n { value: 'gallery', label: t('homepage.gallery'), url: '/galerie' },\n { value: 'sponsors', label: 'Sponzoři', url: '/sponzori' },\n { value: 'contact', label: 'Kontakt', url: '/kontakt' },\n { value: 'search', label: 'Hledat', url: '/hledat' },\n ];\n\n const [navItems, setNavItems] = useState<NavigationItem[]>([]);\n const [adminNavItems, setAdminNavItems] = useState<NavigationItem[]>([]);\n const [socialLinks, setSocialLinks] = useState<SocialLink[]>([]);\n const [loading, setLoading] = useState(true);\n const [editingNav, setEditingNav] = useState<NavigationItem | null>(null);\n const [editingSocial, setEditingSocial] = useState<SocialLink | null>(null);\n const [expandedItems, setExpandedItems] = useState<Set<number>>(new Set());\n const [isAdminNav, setIsAdminNav] = useState(false);\n const toast = useToast();\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.600');\n const hoverBg = useColorModeValue('gray.50', 'gray.700');\n\n const { isOpen: isNavModalOpen, onOpen: onNavModalOpen, onClose: onNavModalClose } = useDisclosure();\n const { isOpen: isSocialModalOpen, onOpen: onSocialModalOpen, onClose: onSocialModalClose } = useDisclosure();\n const { confirm } = useConfirmDialog();\n\n useEffect(() => {\n loadData();\n }, []);\n\n const loadData = async () => {\n try {\n setLoading(true);\n const [navData, socialData] = await Promise.all([\n getAllNavigationItems(),\n getAllSocialLinks(),\n ]);\n\n // Auto-seed if navigation is empty\n if (!navData || navData.length === 0) {\n try {\n const seedResult = await seedDefaultNavigation();\n if (seedResult.seeded) {\n toast({\n title: 'Výchozí navigace vytvořena',\n description: `Automaticky vytvořeno ${seedResult.count} položek navigace`,\n status: 'success',\n duration: 4000,\n isClosable: true,\n });\n // Reload data after seeding\n const [newNavData, newSocialData] = await Promise.all([\n getAllNavigationItems(),\n getAllSocialLinks(),\n ]);\n const frontend = (newNavData || []).filter(item => !item.requires_admin);\n const admin = (newNavData || []).filter(item => item.requires_admin);\n setNavItems(frontend);\n setAdminNavItems(admin);\n setSocialLinks(newSocialData || []);\n return;\n }\n } catch (seedError) {\n console.error('Chyba při automatickém seedování:', seedError);\n // Continue with empty navigation\n }\n }\n \n // Split nav items into frontend and admin\n const frontend = (navData || []).filter(item => !item.requires_admin);\n const admin = (navData || []).filter(item => item.requires_admin);\n \n setNavItems(frontend);\n setAdminNavItems(admin);\n setSocialLinks(socialData || []);\n } catch (error: any) {\n console.error('Chyba při načítání navigace:', error);\n toast({\n title: 'Chyba při načítání dat',\n description: error?.response?.data?.error || error?.message || 'Neznámá chyba',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n } finally {\n setLoading(false);\n }\n };\n\n const toggleVisible = async (target: NavigationItem) => {\n const newVisible = !target.visible;\n try {\n await updateNavigationItem(target.id!, { visible: newVisible } as any);\n const applyToggle = (list: NavigationItem[]): NavigationItem[] =>\n (list || []).map((it) => {\n if (it.id === target.id) return { ...it, visible: newVisible } as NavigationItem;\n const children = it.children ? applyToggle(it.children) : it.children;\n return { ...it, children } as NavigationItem;\n });\n setNavItems((prev) => applyToggle(prev));\n setAdminNavItems((prev) => applyToggle(prev));\n toast({ title: newVisible ? 'Zobrazeno' : 'Skryto', status: 'success', duration: 1500 });\n } catch (e) {\n toast({ title: 'Chyba při změně viditelnosti', status: 'error', duration: 3000 });\n }\n };\n\n const onDragEnd = async (result: DropResult) => {\n if (!result.destination) return;\n const { source, destination } = result;\n const parseAdminChildrenId = (id: string) => id.startsWith('admin-children-') ? parseInt(id.replace('admin-children-', ''), 10) : null;\n const parseFrontChildrenId = (id: string) => id.startsWith('frontend-children-') ? parseInt(id.replace('frontend-children-', ''), 10) : null;\n\n if (source.droppableId === 'frontend-nav') {\n const items = Array.from(navItems);\n const [moved] = items.splice(source.index, 1);\n items.splice(destination.index, 0, moved);\n setNavItems(items);\n const orders = items.map((item, idx) => ({ id: item.id!, display_order: idx }));\n try {\n await reorderNavigationItems(orders);\n toast({ title: 'Pořadí aktualizováno', status: 'success', duration: 2000 });\n } catch (error) {\n toast({ title: 'Chyba při aktualizaci pořadí', status: 'error', duration: 3000 });\n loadData();\n }\n } else if (source.droppableId === 'admin-nav' && destination.droppableId === 'admin-nav') {\n const items = Array.from(adminNavItems);\n const [moved] = items.splice(source.index, 1);\n items.splice(destination.index, 0, moved);\n setAdminNavItems(items);\n const orders = items.map((item, idx) => ({ id: item.id!, display_order: idx }));\n try {\n await reorderNavigationItems(orders);\n toast({ title: 'Pořadí aktualizováno', status: 'success', duration: 2000 });\n } catch (error) {\n toast({ title: 'Chyba při aktualizaci pořadí', status: 'error', duration: 3000 });\n loadData();\n }\n } else if (\n source.droppableId.startsWith('admin-children-') || destination.droppableId.startsWith('admin-children-') ||\n (source.droppableId === 'admin-nav' && destination.droppableId.startsWith('admin-children-')) ||\n (source.droppableId.startsWith('admin-children-') && destination.droppableId === 'admin-nav')\n ) {\n const srcParentId = parseAdminChildrenId(source.droppableId);\n let destParentId = parseAdminChildrenId(destination.droppableId);\n const items = Array.from(adminNavItems);\n\n // Helper to find parent index by id\n const findParentIndex = (pid: number | null) => {\n if (pid === null) return -1;\n return items.findIndex((it) => it.id === pid);\n };\n\n // If dropping onto top-level container, but near a category card, treat as drop INTO that category\n let destChildIndex = destination.index;\n if (destParentId === null) {\n const at = items[destination.index];\n const before = destination.index > 0 ? items[destination.index - 1] : undefined;\n const after = destination.index < items.length - 1 ? items[destination.index + 1] : undefined;\n let dropIntoId: number | null = null;\n if (at && at.type === 'dropdown') dropIntoId = at.id!;\n else if (before && before.type === 'dropdown') dropIntoId = before.id!;\n else if (after && after.type === 'dropdown') dropIntoId = after.id!;\n if (dropIntoId) {\n destParentId = dropIntoId;\n const dIdxProbe = findParentIndex(destParentId);\n if (dIdxProbe >= 0) {\n destChildIndex = Array.isArray(items[dIdxProbe].children) ? items[dIdxProbe].children!.length : 0;\n } else {\n destChildIndex = 0;\n }\n }\n }\n\n // Fallback: if still no destination parent but we moved a sub-item, keep original parent to avoid promoting to top-level\n if (destParentId === null && srcParentId !== null) {\n destParentId = srcParentId;\n const dIdxProbe = findParentIndex(destParentId);\n destChildIndex = dIdxProbe >= 0 && Array.isArray(items[dIdxProbe].children) ? items[dIdxProbe].children!.length : 0;\n }\n\n let moved: NavigationItem | null = null;\n\n // Remove from source list\n if (srcParentId === null) {\n const [m] = items.splice(source.index, 1);\n moved = m;\n } else {\n const pIdx = findParentIndex(srcParentId);\n if (pIdx >= 0) {\n const srcChildren = Array.isArray(items[pIdx].children) ? Array.from(items[pIdx].children!) : [];\n const [m] = srcChildren.splice(source.index, 1);\n moved = m;\n items[pIdx] = { ...items[pIdx], children: srcChildren } as NavigationItem;\n }\n }\n\n if (!moved) return;\n\n // Insert into destination list\n if (destParentId === null) {\n items.splice(destination.index, 0, moved);\n } else {\n const dIdx = findParentIndex(destParentId);\n if (dIdx >= 0) {\n const destChildren = Array.isArray(items[dIdx].children) ? Array.from(items[dIdx].children!) : [];\n destChildren.splice(destChildIndex, 0, moved);\n items[dIdx] = { ...items[dIdx], children: destChildren } as NavigationItem;\n }\n }\n\n setAdminNavItems(items);\n\n // Persist parent change and reorder siblings at both source and destination\n try {\n await updateNavigationItem(moved.id!, { parent_id: destParentId === null ? null : destParentId, display_order: destParentId === null ? destination.index : destChildIndex } as any);\n\n // Reorder source siblings\n if (srcParentId === null) {\n const topOrders = items.map((it, idx) => ({ id: it.id!, display_order: idx }));\n await reorderNavigationItems(topOrders);\n } else {\n const srcIdx = findParentIndex(srcParentId);\n if (srcIdx >= 0) {\n const orders = (items[srcIdx].children || []).map((c, idx) => ({ id: c.id!, display_order: idx }));\n await reorderNavigationItems(orders);\n }\n }\n\n // Reorder destination siblings\n if (destParentId === null) {\n const topOrders = items.map((it, idx) => ({ id: it.id!, display_order: idx }));\n await reorderNavigationItems(topOrders);\n } else {\n const destIdx = findParentIndex(destParentId);\n if (destIdx >= 0) {\n const orders = (items[destIdx].children || []).map((c, idx) => ({ id: c.id!, display_order: idx }));\n await reorderNavigationItems(orders);\n }\n }\n\n toast({ title: 'Přesunuto', status: 'success', duration: 2000 });\n } catch (error) {\n toast({ title: 'Chyba při přesunu', status: 'error', duration: 3000 });\n loadData();\n }\n }\n // Frontend: moving between top-level and children or across categories\n else if (\n source.droppableId.startsWith('frontend-children-') || destination.droppableId.startsWith('frontend-children-') ||\n (source.droppableId === 'frontend-nav' && destination.droppableId.startsWith('frontend-children-')) ||\n (source.droppableId.startsWith('frontend-children-') && destination.droppableId === 'frontend-nav')\n ) {\n const srcParentId = parseFrontChildrenId(source.droppableId);\n let destParentId = parseFrontChildrenId(destination.droppableId);\n const items = Array.from(navItems);\n\n const findParentIndex = (pid: number | null) => {\n if (pid === null) return -1;\n return items.findIndex((it) => it.id === pid);\n };\n\n // If dropping onto top-level container, but near a category card, treat as drop INTO that category\n let destChildIndex = destination.index;\n if (destParentId === null) {\n const at = items[destination.index];\n const before = destination.index > 0 ? items[destination.index - 1] : undefined;\n let dropIntoId: number | null = null;\n if (at && at.type === 'dropdown') dropIntoId = at.id!;\n else if (before && before.type === 'dropdown') dropIntoId = before.id!;\n if (dropIntoId) {\n destParentId = dropIntoId;\n const dIdxProbe = findParentIndex(destParentId);\n if (dIdxProbe >= 0) {\n destChildIndex = Array.isArray(items[dIdxProbe].children) ? items[dIdxProbe].children!.length : 0;\n } else {\n destChildIndex = 0;\n }\n }\n }\n\n let moved: NavigationItem | null = null;\n\n if (srcParentId === null) {\n const [m] = items.splice(source.index, 1);\n moved = m;\n } else {\n const pIdx = findParentIndex(srcParentId);\n if (pIdx >= 0) {\n const srcChildren = Array.isArray(items[pIdx].children) ? Array.from(items[pIdx].children!) : [];\n const [m] = srcChildren.splice(source.index, 1);\n moved = m;\n items[pIdx] = { ...items[pIdx], children: srcChildren } as NavigationItem;\n }\n }\n\n if (!moved) return;\n\n if (destParentId === null) {\n items.splice(destination.index, 0, moved);\n } else {\n const dIdx = findParentIndex(destParentId);\n if (dIdx >= 0) {\n const destChildren = Array.isArray(items[dIdx].children) ? Array.from(items[dIdx].children!) : [];\n destChildren.splice(destChildIndex, 0, moved);\n items[dIdx] = { ...items[dIdx], children: destChildren } as NavigationItem;\n }\n }\n\n setNavItems(items);\n\n try {\n await updateNavigationItem(moved.id!, { parent_id: destParentId === null ? null : destParentId, display_order: destParentId === null ? destination.index : destChildIndex } as any);\n\n if (srcParentId === null) {\n const topOrders = items.map((it, idx) => ({ id: it.id!, display_order: idx }));\n await reorderNavigationItems(topOrders);\n } else {\n const srcIdx = findParentIndex(srcParentId);\n if (srcIdx >= 0) {\n const orders = (items[srcIdx].children || []).map((c, idx) => ({ id: c.id!, display_order: idx }));\n await reorderNavigationItems(orders);\n }\n }\n\n if (destParentId === null) {\n const topOrders = items.map((it, idx) => ({ id: it.id!, display_order: idx }));\n await reorderNavigationItems(topOrders);\n } else {\n const destIdx = findParentIndex(destParentId);\n if (destIdx >= 0) {\n const orders = (items[destIdx].children || []).map((c, idx) => ({ id: c.id!, display_order: idx }));\n await reorderNavigationItems(orders);\n }\n }\n\n toast({ title: 'Přesunuto', status: 'success', duration: 2000 });\n } catch (error) {\n toast({ title: 'Chyba při přesunu', status: 'error', duration: 3000 });\n loadData();\n }\n }\n };\n\n const moveChildNavItem = async (parentId: number, index: number, direction: 'up' | 'down') => {\n const moveWithin = async (\n list: NavigationItem[],\n setList: React.Dispatch<React.SetStateAction<NavigationItem[]>>\n ): Promise<boolean> => {\n const parentIdx = list.findIndex((it) => it.id === parentId);\n if (parentIdx === -1) return false;\n const parent = list[parentIdx];\n const children = Array.isArray(parent.children) ? [...parent.children] : [];\n if (children.length === 0) return true;\n if (direction === 'up' && index === 0) return true;\n if (direction === 'down' && index === children.length - 1) return true;\n const targetIndex = direction === 'up' ? index - 1 : index + 1;\n [children[index], children[targetIndex]] = [children[targetIndex], children[index]];\n\n const updatedParent: NavigationItem = { ...parent, children };\n const updated = [...list];\n updated[parentIdx] = updatedParent;\n setList(updated);\n\n const orders = children.map((c, idx) => ({ id: c.id!, display_order: idx }));\n try {\n await reorderNavigationItems(orders);\n toast({ title: 'Pořadí aktualizováno', status: 'success', duration: 2000 });\n } catch (err) {\n toast({ title: 'Chyba při aktualizaci pořadí', status: 'error', duration: 3000 });\n loadData();\n }\n return true;\n };\n\n const doneFront = await moveWithin(navItems, setNavItems);\n if (!doneFront) {\n await moveWithin(adminNavItems, setAdminNavItems);\n }\n };\n\n const moveNavItem = async (index: number, direction: 'up' | 'down') => {\n if (direction === 'up' && index === 0) return;\n if (direction === 'down' && index === navItems.length - 1) return;\n\n const items = Array.from(navItems);\n const targetIndex = direction === 'up' ? index - 1 : index + 1;\n [items[index], items[targetIndex]] = [items[targetIndex], items[index]];\n \n setNavItems(items);\n\n const orders = items.map((item, idx) => ({\n id: item.id!,\n display_order: idx,\n }));\n\n try {\n await reorderNavigationItems(orders);\n toast({\n title: 'Pořadí aktualizováno',\n status: 'success',\n duration: 2000,\n });\n } catch (error) {\n toast({\n title: 'Chyba při aktualizaci pořadí',\n status: 'error',\n duration: 3000,\n });\n loadData();\n }\n };\n\n const moveAdminNavItem = async (index: number, direction: 'up' | 'down') => {\n if (direction === 'up' && index === 0) return;\n if (direction === 'down' && index === adminNavItems.length - 1) return;\n\n const items = Array.from(adminNavItems);\n const targetIndex = direction === 'up' ? index - 1 : index + 1;\n [items[index], items[targetIndex]] = [items[targetIndex], items[index]];\n \n setAdminNavItems(items);\n\n const orders = items.map((item, idx) => ({\n id: item.id!,\n display_order: idx,\n }));\n\n try {\n await reorderNavigationItems(orders);\n toast({\n title: 'Pořadí aktualizováno',\n status: 'success',\n duration: 2000,\n });\n } catch (error) {\n toast({\n title: 'Chyba při aktualizaci pořadí',\n status: 'error',\n duration: 3000,\n });\n loadData();\n }\n };\n\n const moveSocialLink = async (index: number, direction: 'up' | 'down') => {\n if (direction === 'up' && index === 0) return;\n if (direction === 'down' && index === socialLinks.length - 1) return;\n\n const items = Array.from(socialLinks);\n const targetIndex = direction === 'up' ? index - 1 : index + 1;\n [items[index], items[targetIndex]] = [items[targetIndex], items[index]];\n \n setSocialLinks(items);\n\n const orders = items.map((item, idx) => ({\n id: item.id!,\n display_order: idx,\n }));\n\n try {\n await reorderSocialLinks(orders);\n toast({\n title: 'Pořadí aktualizováno',\n status: 'success',\n duration: 2000,\n });\n } catch (error) {\n toast({\n title: 'Chyba při aktualizaci pořadí',\n status: 'error',\n duration: 3000,\n });\n loadData();\n }\n };\n\n const openNavModal = (item?: NavigationItem, parentId?: number, forAdmin?: boolean) => {\n setIsAdminNav(forAdmin || false);\n if (item) {\n setEditingNav(item);\n } else {\n const itemsCount = forAdmin ? adminNavItems.length : navItems.length;\n setEditingNav({\n label: '',\n type: forAdmin ? 'internal' : 'page',\n visible: true,\n display_order: itemsCount,\n target: '_self',\n parent_id: parentId,\n requires_admin: forAdmin || false,\n allow_editor: false,\n } as NavigationItem);\n }\n onNavModalOpen();\n };\n\n const toggleExpand = (id: number) => {\n setExpandedItems(prev => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n };\n\n const openSocialModal = (link?: SocialLink) => {\n if (link) {\n setEditingSocial(link);\n } else {\n setEditingSocial({\n platform: 'facebook',\n url: '',\n visible: true,\n display_order: socialLinks.length,\n } as SocialLink);\n }\n onSocialModalOpen();\n };\n\n const saveNavItem = async () => {\n if (!editingNav) return;\n\n try {\n if (editingNav.id) {\n await updateNavigationItem(editingNav.id, editingNav);\n toast({\n title: 'Položka aktualizována',\n status: 'success',\n duration: 2000,\n });\n } else {\n await createNavigationItem(editingNav);\n toast({\n title: 'Položka vytvořena',\n status: 'success',\n duration: 2000,\n });\n }\n onNavModalClose();\n loadData();\n } catch (error) {\n toast({\n title: 'Chyba při ukládání',\n status: 'error',\n duration: 3000,\n });\n }\n };\n\n const saveSocialLink = async () => {\n if (!editingSocial) return;\n\n try {\n if (editingSocial.id) {\n await updateSocialLink(editingSocial.id, editingSocial);\n toast({\n title: 'Odkaz aktualizován',\n status: 'success',\n duration: 2000,\n });\n } else {\n await createSocialLink(editingSocial);\n toast({\n title: 'Odkaz vytvořen',\n status: 'success',\n duration: 2000,\n });\n }\n onSocialModalClose();\n loadData();\n } catch (error) {\n toast({\n title: 'Chyba při ukládání',\n status: 'error',\n duration: 3000,\n });\n }\n };\n\n const deleteNav = async (id: number) => {\n const ok = await confirm({\n title: 'Smazat položku',\n message: 'Opravdu smazat tuto položku?',\n confirmText: 'Smazat',\n cancelText: 'Zrušit',\n isDanger: true,\n });\n if (!ok) return;\n\n try {\n await deleteNavigationItem(id);\n toast({\n title: 'Položka smazána',\n status: 'success',\n duration: 2000,\n });\n loadData();\n } catch (error) {\n toast({\n title: 'Chyba při mazání',\n status: 'error',\n duration: 3000,\n });\n }\n };\n\n const deleteSocial = async (id: number) => {\n const ok = await confirm({\n title: 'Smazat odkaz',\n message: 'Opravdu smazat tento odkaz?'\n ,\n confirmText: 'Smazat',\n cancelText: 'Zrušit',\n isDanger: true,\n });\n if (!ok) return;\n\n try {\n await deleteSocialLink(id);\n toast({\n title: 'Odkaz smazán',\n status: 'success',\n duration: 2000,\n });\n loadData();\n } catch (error) {\n toast({\n title: 'Chyba při mazání',\n status: 'error',\n duration: 3000,\n });\n }\n };\n\n const getSocialIcon = (platform: string) => {\n const found = SOCIAL_PLATFORMS.find(p => p.value === platform);\n return found?.icon || FaFacebook;\n };\n\n const handleSeedDefaultNavigation = async () => {\n const ok = await confirm({\n title: 'Vytvořit výchozí navigaci',\n message: 'Vytvořit výchozí navigační položky? Toto lze provést pouze pokud databáze je prázdná.',\n confirmText: 'Vytvořit',\n cancelText: 'Zrušit',\n isDanger: false,\n });\n if (!ok) return;\n\n try {\n const result = await seedDefaultNavigation();\n \n if (result.seeded) {\n toast({\n title: 'Výchozí navigace vytvořena',\n description: `Vytvořeno ${result.count} položek`,\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n loadData();\n } else {\n toast({\n title: 'Navigace již existuje',\n description: result.message,\n status: 'info',\n duration: 3000,\n isClosable: true,\n });\n }\n } catch (error: any) {\n console.error('Chyba při seedování navigace:', error);\n toast({\n title: 'Chyba při vytváření výchozí navigace',\n description: error?.response?.data?.error || error?.message || 'Neznámá chyba',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n }\n };\n\n if (loading) {\n return (\n <AdminLayout>\n <Container maxW=\"7xl\" py={8}>\n <VStack spacing={4}>\n <Spinner size=\"xl\" />\n <Text>Načítání...</Text>\n </VStack>\n </Container>\n </AdminLayout>\n );\n }\n\n return (\n <AdminLayout>\n <Container maxW=\"7xl\" py={8}>\n <VStack spacing={6} align=\"stretch\">\n <HStack justify=\"space-between\" align=\"center\">\n <Heading size=\"lg\">Správa navigace</Heading>\n <Button onClick={loadData} size=\"sm\" colorScheme=\"gray\">\n Obnovit data\n </Button>\n </HStack>\n\n <Alert status=\"info\" variant=\"left-accent\">\n <AlertIcon />\n <Box flex=\"1\">\n <HStack spacing={4}>\n <Text fontSize=\"sm\">\n <strong>Načteno:</strong> {navItems.length} webových, {adminNavItems.length} admin\n </Text>\n </HStack>\n </Box>\n </Alert>\n\n <Alert status=\"info\">\n <AlertIcon />\n <Box>\n <Text fontWeight=\"bold\">Oddělená správa navigace</Text>\n <Text fontSize=\"sm\" mt={1}>\n • <strong>Webová navigace:</strong> Menu na veřejném webu<br/>\n • <strong>Admin panel:</strong> Postranní menu v administraci\n </Text>\n </Box>\n </Alert>\n\n <DragDropContext onDragEnd={onDragEnd}>\n <Tabs>\n <TabList>\n <Tab>Webová navigace</Tab>\n <Tab>Admin panel</Tab>\n </TabList>\n\n <TabPanels>\n {/* Frontend Navigation Items Tab */}\n <TabPanel>\n <VStack spacing={4} align=\"stretch\">\n <HStack>\n <Button leftIcon={<AddIcon />} colorScheme=\"blue\" onClick={() => openNavModal()}>\n Přidat hlavní položku\n </Button>\n <Text fontSize=\"sm\" color=\"gray.500\">\n Přetahujte položky nahoru/dolů pro změnu pořadí. Klikněte na šipku pro zobrazení podpoložek.\n </Text>\n </HStack>\n\n <Alert status=\"info\" borderRadius=\"md\">\n <AlertIcon />\n <Box>\n <Text fontWeight=\"bold\">Tipy pro správu navigace:</Text>\n <Text fontSize=\"sm\" mt={1}>\n • Použijte typ \"Dropdown\" pro položky s podpoložkami<br/>\n • Podpoložky se zobrazí při najetí myší na hlavní položku<br/>\n • Položky můžete skrýt bez smazání pomocí přepínače viditelnosti\n </Text>\n </Box>\n </Alert>\n\n <VStack spacing={2} align=\"stretch\">\n {navItems.length === 0 ? (\n <Alert status=\"warning\" variant=\"left-accent\">\n <AlertIcon />\n <Box flex=\"1\">\n <Text fontWeight=\"bold\">Žádné položky navigace</Text>\n <Text fontSize=\"sm\" mt={1} mb={2}>\n Nebyly nalezeny žádné položky navigace. Můžete vytvořit výchozí navigaci nebo přidat položky ručně.\n </Text>\n <HStack spacing={2}>\n <Button\n size=\"sm\"\n colorScheme=\"blue\"\n onClick={handleSeedDefaultNavigation}\n >\n Vytvořit výchozí navigaci\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => openNavModal()}\n >\n Přidat položku ručně\n </Button>\n </HStack>\n </Box>\n </Alert>\n ) : (\n <Droppable droppableId=\"frontend-nav\">\n {(provided) => (\n <Box ref={provided.innerRef} {...provided.droppableProps}>\n {navItems.map((item, index) => (\n <Draggable key={String(item.id)} draggableId={`nav-${item.id}`} index={index}>\n {(dragProvided) => (\n <Box ref={dragProvided.innerRef} {...dragProvided.draggableProps} {...dragProvided.dragHandleProps}>\n <NavItemCard\n item={item}\n index={index}\n total={navItems.length}\n onMoveUp={() => moveNavItem(index, 'up')}\n onMoveDown={() => moveNavItem(index, 'down')}\n onEdit={() => openNavModal(item)}\n onDelete={() => deleteNav(item.id!)}\n onAddChild={() => openNavModal(undefined, item.id)}\n isExpanded={expandedItems.has(item.id!)}\n onToggleExpand={() => toggleExpand(item.id!)}\n cardBg={cardBg}\n borderColor={borderColor}\n hoverBg={hoverBg}\n onChildMoveUp={(parentId, childIdx) => moveChildNavItem(parentId, childIdx, 'up')}\n onChildMoveDown={(parentId, childIdx) => moveChildNavItem(parentId, childIdx, 'down')}\n onToggleVisible={toggleVisible}\n childrenDroppableId={`frontend-children-${item.id}`}\n draggableChildPrefix={'front-child'}\n onEditTarget={(it) => openNavModal(it)}\n onDeleteTarget={(it) => deleteNav(it.id!)}\n />\n </Box>\n )}\n </Draggable>\n ))}\n {provided.placeholder}\n </Box>\n )}\n </Droppable>\n )}\n </VStack>\n </VStack>\n </TabPanel>\n\n {/* Admin Panel Navigation Tab */}\n <TabPanel>\n <VStack spacing={4} align=\"stretch\">\n <HStack>\n <Button leftIcon={<AddIcon />} colorScheme=\"purple\" onClick={() => openNavModal(undefined, undefined, true)}>\n Přidat položku do admin panelu\n </Button>\n <Text fontSize=\"sm\" color=\"gray.500\">\n Správa bočního menu v administraci\n </Text>\n </HStack>\n\n <Alert status=\"info\" borderRadius=\"md\" colorScheme=\"purple\">\n <AlertIcon />\n <Box>\n <Text fontWeight=\"bold\">Správa admin panelu:</Text>\n <Text fontSize=\"sm\" mt={1}>\n • Vyberte z přednastavených stránek nebo přidejte vlastní<br/>\n • Skryjte nepotřebné sekce pomocí viditelnosti<br/>\n • Přidejte externí odkazy (např. Webmail)<br/>\n • Kategorizujte pomocí dropdown menu\n </Text>\n </Box>\n </Alert>\n\n <VStack spacing={2} align=\"stretch\">\n <Droppable droppableId=\"admin-nav\">\n {(provided) => (\n <Box ref={provided.innerRef} {...provided.droppableProps}>\n {adminNavItems.map((item, index) => (\n <Draggable key={String(item.id)} draggableId={`admin-${item.id}`} index={index}>\n {(dragProvided) => (\n <Box ref={dragProvided.innerRef} {...dragProvided.draggableProps} {...dragProvided.dragHandleProps}>\n <NavItemCard\n item={item}\n index={index}\n total={adminNavItems.length}\n onMoveUp={() => moveAdminNavItem(index, 'up')}\n onMoveDown={() => moveAdminNavItem(index, 'down')}\n onEdit={() => openNavModal(item, undefined, true)}\n onDelete={() => deleteNav(item.id!)}\n onAddChild={() => openNavModal(undefined, item.id, true)}\n isExpanded={expandedItems.has(item.id!)}\n onToggleExpand={() => toggleExpand(item.id!)}\n cardBg={cardBg}\n borderColor={borderColor}\n hoverBg={hoverBg}\n onChildMoveUp={(parentId, childIdx) => moveChildNavItem(parentId, childIdx, 'up')}\n onChildMoveDown={(parentId, childIdx) => moveChildNavItem(parentId, childIdx, 'down')}\n onToggleVisible={toggleVisible}\n childrenDroppableId={`admin-children-${item.id}`}\n draggableChildPrefix={'admin-child'}\n onEditTarget={(it) => openNavModal(it, undefined, true)}\n onDeleteTarget={(it) => deleteNav(it.id!)}\n />\n </Box>\n )}\n </Draggable>\n ))}\n {provided.placeholder}\n </Box>\n )}\n </Droppable>\n {adminNavItems.length === 0 && (\n <Alert status=\"warning\">\n <AlertIcon />\n Žádné vlastní položky v admin panelu. Použijte tlačítko \"Přidat položku\" pro vytvoření vlastní navigace.\n </Alert>\n )}\n </VStack>\n </VStack>\n </TabPanel>\n </TabPanels>\n </Tabs>\n </DragDropContext>\n </VStack>\n </Container>\n\n <Modal isOpen={isNavModalOpen} onClose={onNavModalClose} size=\"xl\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>\n {editingNav?.id ? 'Upravit položku' : 'Nová položka'}\n {isAdminNav && <Badge ml={2} colorScheme=\"purple\">Admin panel</Badge>}\n </ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack spacing={4}>\n {isAdminNav && !editingNav?.id && (\n <Alert status=\"info\" fontSize=\"sm\">\n <AlertIcon />\n Vytvářejte položku pro boční menu v administraci. Můžete vybrat přednastavené stránky nebo přidat vlastní odkazy.\n </Alert>\n )}\n\n <FormControl isRequired>\n <FormLabel>Název</FormLabel>\n <Input\n value={editingNav?.label || ''}\n onChange={(e) => setEditingNav({ ...editingNav!, label: e.target.value })}\n placeholder={isAdminNav ? 'Např. Nástěnka, Webmail' : 'Např. Domů, O klubu'}\n />\n </FormControl>\n\n <FormControl isRequired>\n <FormLabel\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n sx={{ '.chakra-form__required-indicator': { display: 'none' } }}\n >\n <HStack spacing={1}>\n <Box>Typ</Box>\n <Text as=\"span\" color=\"red.500\">*</Text>\n </HStack>\n <HelpTooltipCard\n label=\"Jaký typ zvolit\"\n title=\"Typ navigační položky\"\n items={[\n 'Stránka / Admin stránka odkaz na existující stránku v rámci webu nebo administrace.',\n 'Interní odkaz vlastní URL v rámci webu (např. /info/partners).',\n 'Externí odkaz odkaz mimo web (např. klubový webmail, svazový web).',\n 'Dropdown / Kategorie skupina, která sama neotevírá stránku, ale obsahuje podpoložky.',\n ]}\n />\n </FormLabel>\n <Select\n value={editingNav?.type || (isAdminNav ? 'internal' : 'page')}\n onChange={(e) => setEditingNav({ ...editingNav!, type: e.target.value as any })}\n >\n {isAdminNav ? (\n <>\n <option value=\"internal\">Admin stránka (vyberte existující)</option>\n <option value=\"external\">Externí odkaz (např. Webmail)</option>\n <option value=\"dropdown\">Kategorie (má podpoložky)</option>\n </>\n ) : (\n <>\n <option value=\"page\">Stránka (vyberte existující)</option>\n <option value=\"internal\">Interní odkaz (vlastní URL)</option>\n <option value=\"external\">Externí odkaz</option>\n <option value=\"dropdown\">Dropdown (má podpoložky)</option>\n </>\n )}\n </Select>\n </FormControl>\n\n {editingNav?.type === 'page' && !isAdminNav && (\n <FormControl isRequired>\n <FormLabel>Webová stránka</FormLabel>\n <Select\n value={editingNav?.page_type || ''}\n onChange={(e) => {\n const selected = PAGE_TYPE_OPTIONS.find(opt => opt.value === e.target.value);\n setEditingNav({\n ...editingNav!,\n page_type: e.target.value,\n url: selected?.url || '',\n label: editingNav?.label || selected?.label || ''\n });\n }}\n >\n <option value=\"\">-- Vyberte stránku --</option>\n {PAGE_TYPE_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label} ({opt.url})\n </option>\n ))}\n </Select>\n </FormControl>\n )}\n\n {editingNav?.type === 'internal' && isAdminNav && (\n <FormControl isRequired>\n <FormLabel>Admin stránka</FormLabel>\n <Select\n value={editingNav?.page_type || ''}\n onChange={(e) => {\n const selected = ADMIN_PAGE_PRESETS.find(opt => opt.value === e.target.value);\n const isExternal = selected?.url?.startsWith('http');\n setEditingNav({\n ...editingNav!,\n page_type: e.target.value,\n url: selected?.url || '',\n label: editingNav?.label || selected?.label || '',\n type: isExternal ? 'external' : 'internal',\n });\n }}\n >\n <option value=\"\">-- Vyberte admin stránku --</option>\n <optgroup label=\"Hlavní\">\n <option value=\"dashboard\">Nástěnka (/admin)</option>\n <option value=\"analytics\">Analytika (/admin/analytika)</option>\n </optgroup>\n <optgroup label=\"Obsah\">\n <option value=\"teams\">Týmy (/admin/tymy)</option>\n <option value=\"matches\">Zápasy (/admin/zapasy)</option>\n <option value=\"activities\">Aktivity (/admin/aktivity)</option>\n <option value=\"players\">Hráči (/admin/hraci)</option>\n <option value=\"articles\">Články (/admin/clanky)</option>\n <option value=\"categories\">Kategorie (/admin/kategorie)</option>\n <option value=\"comments\">Komentáře (/admin/komentare)</option>\n <option value=\"videos\">Videa (/admin/videa)</option>\n <option value=\"gallery\">Galerie (/admin/galerie)</option>\n </optgroup>\n <optgroup label=\"Marketing\">\n <option value=\"sponsors\">Sponzoři (/admin/sponzori)</option>\n <option value=\"banners\">Bannery (/admin/bannery)</option>\n <option value=\"shortlinks\">Zkrácené odkazy (/admin/shortlinks)</option>\n <option value=\"polls\">Ankety (/admin/ankety)</option>\n <option value=\"sweepstakes\">Soutěže (/admin/sweepstakes)</option>\n <option value=\"engagement\">Odměny & Úspěchy (/admin/engagement)</option>\n </optgroup>\n <optgroup label=\"Nástroje\">\n <option value=\"scoreboard\">Tabule (Scoreboard) (/admin/scoreboard)</option>\n <option value=\"scoreboard_remote\">Scoreboard Remote (/admin/scoreboard/remote)</option>\n <option value=\"clothing\">Oblečení (/admin/obleceni)</option>\n </optgroup>\n <optgroup label=\"Komunikace\">\n <option value=\"messages\">Zprávy (/admin/zpravy)</option>\n <option value=\"contacts\">Kontakty (/admin/kontakty)</option>\n <option value=\"newsletter\">Zpravodaj (/admin/newsletter)</option>\n </optgroup>\n <optgroup label=\"Nastavení\">\n <option value=\"navigation\">Navigace (/admin/navigace)</option>\n <option value=\"competition_aliases\">Alias soutěží (/admin/aliasy-soutezi)</option>\n <option value=\"users\">Uživatelé (/admin/uzivatele)</option>\n <option value=\"settings\">Nastavení (/admin/nastaveni)</option>\n <option value=\"files\">Soubory (/admin/soubory)</option>\n <option value=\"prefetch\">Prefetch (/admin/prefetch)</option>\n <option value=\"docs\">Dokumentace (/admin/docs)</option>\n </optgroup>\n <optgroup label=\"Externí odkazy\">\n <option value=\"webmail\">Webmail (vlastní URL)</option>\n </optgroup>\n </Select>\n </FormControl>\n )}\n\n {editingNav?.type === 'dropdown' && (\n <Alert status=\"info\" fontSize=\"sm\">\n <AlertIcon />\n Po vytvoření této položky můžete přidat podpoložky kliknutím na tlačítko \"Přidat podpoložku\".\n </Alert>\n )}\n\n {(editingNav?.type === 'internal' || editingNav?.type === 'external') && (\n <FormControl isRequired>\n <FormLabel>URL</FormLabel>\n <Input\n value={editingNav?.url || ''}\n onChange={(e) => setEditingNav({ ...editingNav!, url: e.target.value })}\n placeholder={editingNav?.type === 'external' ? 'https://example.com' : '/vlastni-stranka'}\n />\n </FormControl>\n )}\n\n <FormControl>\n <FormLabel>Ikona</FormLabel>\n <Select\n value={editingNav?.icon || ''}\n onChange={(e) => setEditingNav({ ...editingNav!, icon: e.target.value || undefined })}\n >\n <option value=\"\">Bez ikony</option>\n {NAV_ICON_OPTIONS.map(opt => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </Select>\n {editingNav?.icon && (\n <HStack mt={2} spacing={2} align=\"center\">\n <Icon as={ICON_COMPONENTS[editingNav.icon]} boxSize={5} />\n <Text fontSize=\"sm\">{editingNav.icon}</Text>\n </HStack>\n )}\n </FormControl>\n\n {editingNav?.parent_id && (\n <Alert status=\"warning\" fontSize=\"sm\">\n <AlertIcon />\n Toto je podpoložka. Zobrazí se v dropdown menu rodičovské položky.\n </Alert>\n )}\n\n <FormControl>\n <FormLabel>Popis (volitelné)</FormLabel>\n <Textarea\n value={editingNav?.css_class || ''}\n onChange={(e) => setEditingNav({ ...editingNav!, css_class: e.target.value })}\n placeholder=\"Krátký popis pro administrátory\"\n rows={2}\n />\n </FormControl>\n\n {editingNav?.type === 'external' && (\n <FormControl>\n <FormLabel>Target</FormLabel>\n <Select\n value={editingNav?.target || '_self'}\n onChange={(e) => setEditingNav({ ...editingNav!, target: e.target.value as any })}\n >\n <option value=\"_self\">Stejné okno</option>\n <option value=\"_blank\">Nové okno</option>\n </Select>\n </FormControl>\n )}\n\n {isAdminNav && editingNav?.type !== 'dropdown' && (\n <FormControl display=\"flex\" alignItems=\"center\">\n <FormLabel mb=\"0\">Povolit editorům</FormLabel>\n <Switch\n isChecked={!!editingNav?.allow_editor}\n onChange={(e) => setEditingNav({ ...editingNav!, allow_editor: e.target.checked })}\n />\n </FormControl>\n )}\n\n <FormControl display=\"flex\" alignItems=\"center\">\n <FormLabel mb=\"0\">Viditelné</FormLabel>\n <Switch\n isChecked={editingNav?.visible ?? true}\n onChange={(e) => setEditingNav({ ...editingNav!, visible: e.target.checked })}\n />\n </FormControl>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" mr={3} onClick={onNavModalClose}>Zrušit</Button>\n <Button colorScheme=\"blue\" onClick={saveNavItem}>Uložit</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n </AdminLayout>\n );\n};\n\nexport default NavigationAdminPage;\n","import React, { useEffect, useMemo, useState } from 'react';\nimport MainLayout from '../components/layout/MainLayout';\nimport { Box, Container, Heading, Text, Tabs, TabList, TabPanels, Tab, TabPanel, Table, Thead, Tbody, Tr, Th, Td, Flex, Spinner, Badge, Link, useColorModeValue } from '@chakra-ui/react';\nimport { getCompetitionAliasesPublic, CompetitionAlias } from '../services/competitionAliases';\nimport NewsletterCTA from '../components/common/NewsletterCTA';\nimport ClubModal from '../components/home/ClubModal';\nimport { usePublicSettings } from '../hooks/usePublicSettings';\nimport { sortCategoriesWithOrder } from '../utils/categorySort';\nimport { TeamLogo } from '../components/common/TeamLogo';\nimport { API_URL } from '../services/api';\nimport { useTranslation } from 'react-i18next';\n\ntype TableRow = {\n rank: string;\n team: string;\n team_id?: string;\n team_logo_url?: string;\n played: string;\n wins: string;\n draws: string;\n losses: string;\n score: string;\n points: string;\n};\n\nfunction deriveTeamIdFromLogoUrl(url?: string): string | undefined {\n try {\n const u = String(url || '');\n if (!u) return undefined;\n const m = u.match(/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}/);\n return m ? m[0].toLowerCase() : undefined;\n } catch {\n return undefined;\n }\n}\n\ntype CompetitionTable = {\n id: string;\n name: string;\n code?: string;\n matches_link?: string;\n rows: TableRow[];\n};\n\nconst resolveBackendUrl = (path: string) => {\n try {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (path.startsWith('/cache') || path.startsWith('/uploads')) {\n const u = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : undefined);\n const abs = new URL(path, `${u.protocol}//${u.host}`);\n return abs.toString();\n }\n return path;\n } catch {\n return path;\n }\n};\n\nconst TablesPage: React.FC = () => {\n const { t } = useTranslation();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [competitions, setCompetitions] = useState<CompetitionTable[]>([]);\n const [aliasMap, setAliasMap] = useState<Record<string, { alias: string; original_name?: string; display_order?: number }>>({});\n const [selectedClub, setSelectedClub] = useState<any>(null);\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [overrides, setOverrides] = useState<{ by_id?: Record<string, { name?: string; logo_url?: string }>; by_name?: Record<string, string> } | null>(null);\n const { data: settings } = usePublicSettings();\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const textSecondary = useColorModeValue('gray.600', 'gray.400');\n const tableBg = useColorModeValue('white', 'gray.800');\n const tableHeaderBg = useColorModeValue('var(--primary, #C53030)', 'var(--primary, #9b2c2c)');\n const tableTextColor = useColorModeValue('gray.800', 'gray.200');\n const rowOddBg = useColorModeValue('white', 'gray.800');\n const rowEvenBg = useColorModeValue('gray.50', 'gray.700');\n\n type SortKey = 'rank' | 'team' | 'played' | 'wins' | 'draws' | 'losses' | 'score' | 'points';\n type SortOrder = 'desc' | 'asc';\n const [sortState, setSortState] = useState<Record<string, { key: SortKey; order: SortOrder } | null>>({});\n const toNumber = (v: any): number => {\n if (typeof v === 'number') return v;\n const n = parseFloat(String(v ?? '').replace(/[^0-9\\-\\.]/g, ''));\n return isNaN(n) ? 0 : n;\n };\n const scoreDiff = (s: any): number => {\n const str = String(s ?? '').trim();\n const m = str.match(/(-?\\d+)\\s*[:\\-]\\s*(-?\\d+)/);\n if (m) return Number(m[1]) - Number(m[2]);\n return toNumber(str);\n };\n const toggleSort = (compId: string, key: SortKey) => {\n const cur = sortState[compId];\n if (!cur || cur.key !== key) { setSortState({ ...sortState, [compId]: { key, order: 'desc' } }); return; }\n if (cur.order === 'desc') { setSortState({ ...sortState, [compId]: { key, order: 'asc' } }); return; }\n const next = { ...sortState }; next[compId] = null; setSortState(next);\n };\n const arrow = (compId: string, key: SortKey) => {\n const cur = sortState[compId];\n if (!cur || cur.key !== key) return '';\n return cur.order === 'desc' ? '▼' : '▲';\n };\n\n const handleClubClick = (club: any) => {\n setSelectedClub(club);\n setIsModalOpen(true);\n };\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n setLoading(true);\n setError(null);\n try {\n // Load overrides (API + cached file)\n try {\n const now = Date.now();\n let ovr: any = null;\n try {\n const res = await fetch(`/api/v1/public/team-logo-overrides?t=${now}`, { cache: 'no-cache' });\n if (res.ok) ovr = await res.json();\n } catch {}\n if (!ovr) {\n try {\n const res2 = await fetch('/cache/prefetch/team_logo_overrides.json', { cache: 'no-cache' });\n if (res2.ok) ovr = await res2.json();\n } catch {}\n }\n if (!cancelled) setOverrides(ovr || { by_id: {}, by_name: {} });\n } catch {}\n // Load aliases first\n let amap: Record<string, { alias: string; original_name?: string; display_order?: number }> = {};\n try {\n const aliases: CompetitionAlias[] = await getCompetitionAliasesPublic();\n (aliases || []).forEach((a) => { if (a?.code && a?.alias) amap[a.code] = { alias: a.alias, original_name: a.original_name, display_order: a.display_order }; });\n } catch {}\n const res = await fetch(resolveBackendUrl('/cache/prefetch/facr_tables.json'), { cache: 'no-cache' });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const json = await res.json();\n const comps: CompetitionTable[] = Array.isArray(json?.competitions)\n ? json.competitions.map((c: any, idx: number) => {\n const overall = c?.table?.overall || [];\n const rows: TableRow[] = Array.isArray(overall) ? overall.map((r: any) => ({\n rank: String(r.rank ?? ''),\n team: String(r.team ?? ''),\n team_id: r.team_id,\n team_logo_url: r.team_logo_url ? resolveBackendUrl(r.team_logo_url) : undefined,\n played: String(r.played ?? ''),\n wins: String(r.wins ?? ''),\n draws: String(r.draws ?? ''),\n losses: String(r.losses ?? ''),\n score: String(r.score ?? ''),\n points: String(r.points ?? ''),\n })) : [];\n return {\n id: String(c.id || idx),\n name: (amap?.[c?.code]?.alias) || (amap?.[String(c.id || idx)]?.alias) || c.name || c.code || `Soutěž ${idx+1}`,\n alias: (amap?.[c?.code]?.alias) || (amap?.[String(c.id || idx)]?.alias),\n display_order: (amap?.[c?.code]?.display_order) ?? (amap?.[String(c.id || idx)]?.display_order),\n code: c.code,\n matches_link: c.matches_link,\n rows,\n };\n }) : [];\n if (!cancelled) {\n setAliasMap(amap);\n // Only keep competitions that have at least one row in the table\n const filtered = (comps || []).filter((c) => Array.isArray(c.rows) && c.rows.length > 0);\n // Sort competitions by age (Muži first, then U19, U17, etc.) and respect custom order\n const sorted = sortCategoriesWithOrder(filtered) as typeof filtered;\n setCompetitions(sorted);\n }\n } catch (e: any) {\n if (!cancelled) setError(e?.message || 'Nepodařilo se načíst tabulky.');\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => { cancelled = true; };\n }, []);\n\n // Normalization helpers (same as CalendarPage/TableSection)\n const normalize = (s: string) => String(s || '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\n const stripPrefixes = (s: string) => {\n let x = normalize(s);\n x = x.replace(/\\b(mestsky|m\\.?f\\.?k\\.?|mfk|tj|sk|sokol|fotbalovy|fotbalový|fotbalovy\\s+klub|fotbalovy\\s+klub)\\b/g, '');\n return x.replace(/\\s+/g, ' ').trim();\n };\n const byNameMap = useMemo(() => {\n const m: Record<string, string> = {};\n const src = overrides?.by_name || {};\n for (const k of Object.keys(src)) m[normalize(k)] = src[k];\n return m;\n }, [overrides]);\n const byIdMap = useMemo(() => (overrides?.by_id || {}) as Record<string, { name?: string; logo_url?: string }>, [overrides]);\n const overridesNameIndex = useMemo(() => {\n const idx: Record<string, { id: string; name: string }> = {};\n try {\n for (const [id, v] of Object.entries(byIdMap)) {\n const name = String((v as any)?.name || '').trim();\n if (!name) continue;\n const key = normalize(name);\n if (!key) continue;\n idx[key] = { id, name };\n }\n } catch {}\n return idx;\n }, [byIdMap]);\n const pickName = (teamId?: string, original?: string, logoUrl?: string) => {\n const id = String(teamId || '') || deriveTeamIdFromLogoUrl(logoUrl) || '';\n const v = id ? byIdMap?.[id]?.name : undefined;\n if (v && String(v).trim().length > 0) return String(v);\n const orig = String(original || '');\n if (orig) {\n const n = normalize(orig);\n let hit = overridesNameIndex[n];\n if (!hit) {\n for (const [k, val] of Object.entries(overridesNameIndex)) {\n if (!k) continue;\n if (n.endsWith(k) || k.endsWith(n)) { hit = val as any; break; }\n }\n }\n if (!hit) {\n const t1 = n.split(' ')[0];\n if (t1 && t1.length >= 5) {\n for (const [k, val] of Object.entries(overridesNameIndex)) {\n const k1 = String(k).split(' ')[0];\n if (k1 === t1) { hit = val as any; break; }\n }\n }\n }\n if (hit?.name) return hit.name;\n }\n return orig;\n };\n const pickLogo = (teamId?: string, teamName?: string, original?: string): string | undefined => {\n if (teamId && byIdMap?.[teamId]?.logo_url) return byIdMap[teamId]!.logo_url as string;\n if (teamName) {\n const exact = (overrides?.by_name || {})[teamName];\n if (exact) return exact;\n const n = normalize(teamName);\n const cand = byNameMap[n];\n if (cand) return cand;\n const stripped = stripPrefixes(teamName);\n for (const k of Object.keys(overrides?.by_name || {})) {\n const kn = stripPrefixes(k);\n if (!kn) continue;\n if (stripped.endsWith(kn) || kn.endsWith(stripped)) return (overrides!.by_name as any)[k];\n }\n }\n return original;\n };\n\n return (\n <MainLayout>\n <Container maxW=\"7xl\" py={{ base: 6, md: 10 }}>\n <Heading as=\"h1\" size=\"xl\" mb={2}>{t('tables.title')}</Heading>\n <Text color={textSecondary} mb={6}>{t('tables.subtitle')}</Text>\n\n {loading && (\n <Flex align=\"center\" gap={3} color={textSecondary} mb={6}>\n <Spinner size=\"sm\" />\n <span>{t('tables.loading')}</span>\n </Flex>\n )}\n {error && (\n <Box color=\"red.600\" mb={6}>{error}</Box>\n )}\n\n {!!competitions.length && (\n <Tabs variant=\"enclosed\" size=\"sm\">\n <TabList px={2} pt={2} overflowX=\"auto\" overflowY=\"hidden\" css={{\n '&::-webkit-scrollbar': { height: '4px' },\n '&::-webkit-scrollbar-track': { background: 'transparent' },\n '&::-webkit-scrollbar-thumb': { background: 'var(--chakra-colors-gray-300)', borderRadius: '4px' },\n }}>\n {competitions.map((c) => (\n <Tab\n key={c.id}\n _selected={{ bg: 'brand.primary', color: 'text.onPrimary', borderColor: 'brand.primary' }}\n _hover={{ bg: 'rgba(0,0,0,0.04)' }}\n flex=\"0 0 auto\"\n px={3}\n py={2}\n >\n <Text as=\"span\" noOfLines={1} maxW=\"300px\" title={c.name}>{c.name}</Text>\n </Tab>\n ))}\n </TabList>\n <TabPanels>\n {competitions.map((c) => (\n <TabPanel key={c.id} px={0}>\n <Flex align=\"center\" justify=\"space-between\" mb={3}>\n <Heading as=\"h2\" size=\"md\">{c.name}</Heading>\n {c.matches_link && (\n <Link href={c.matches_link} isExternal color=\"brand.primary\" _hover={{ filter: 'brightness(0.9)' }}>{t('tables.schedule_link')}</Link>\n )}\n </Flex>\n <Box borderWidth=\"1px\" borderColor={borderColor} borderRadius=\"lg\" overflowX=\"auto\" boxShadow=\"sm\" bg={tableBg}>\n <Table size=\"sm\" variant=\"unstyled\" color={tableTextColor}>\n <Thead position=\"sticky\" top={0} zIndex={2}>\n <Tr bg={tableHeaderBg} color=\"white\">\n <Th w=\"56px\" color=\"white\" cursor=\"pointer\" onClick={() => toggleSort(c.id, 'rank')}>{t('tables.rank')} {arrow(c.id, 'rank')}</Th>\n <Th color=\"white\" cursor=\"pointer\" onClick={() => toggleSort(c.id, 'team')}>{t('tables.team')} {arrow(c.id, 'team')}</Th>\n <Th isNumeric color=\"white\" cursor=\"pointer\" onClick={() => toggleSort(c.id, 'played')}>{t('tables.played')} {arrow(c.id, 'played')}</Th>\n <Th isNumeric color=\"white\" cursor=\"pointer\" onClick={() => toggleSort(c.id, 'wins')}>{t('tables.wins')} {arrow(c.id, 'wins')}</Th>\n <Th isNumeric color=\"white\" cursor=\"pointer\" onClick={() => toggleSort(c.id, 'draws')}>{t('tables.draws')} {arrow(c.id, 'draws')}</Th>\n <Th isNumeric color=\"white\" cursor=\"pointer\" onClick={() => toggleSort(c.id, 'losses')}>{t('tables.losses')} {arrow(c.id, 'losses')}</Th>\n <Th isNumeric color=\"white\" cursor=\"pointer\" onClick={() => toggleSort(c.id, 'score')}>{t('tables.score')} {arrow(c.id, 'score')}</Th>\n <Th isNumeric color=\"white\" cursor=\"pointer\" onClick={() => toggleSort(c.id, 'points')}>{t('tables.points')} {arrow(c.id, 'points')}</Th>\n </Tr>\n </Thead>\n <Tbody>\n {(() => {\n const cur = sortState[c.id];\n const arr = [...(c.rows || [])];\n if (cur) {\n arr.sort((a: any, b: any) => {\n let va: any; let vb: any; let isText = false;\n switch (cur.key) {\n case 'team': va = pickName(a.team_id, a.team, a.team_logo_url); vb = pickName(b.team_id, b.team, b.team_logo_url); isText = true; break;\n case 'rank': va = toNumber(a.rank); vb = toNumber(b.rank); break;\n case 'played': va = toNumber(a.played); vb = toNumber(b.played); break;\n case 'wins': va = toNumber(a.wins); vb = toNumber(b.wins); break;\n case 'draws': va = toNumber(a.draws); vb = toNumber(b.draws); break;\n case 'losses': va = toNumber(a.losses); vb = toNumber(b.losses); break;\n case 'score': va = scoreDiff(a.score); vb = scoreDiff(b.score); break;\n case 'points': va = toNumber(a.points); vb = toNumber(b.points); break;\n default: va = 0; vb = 0;\n }\n let res = isText ? String(va).localeCompare(String(vb)) : (va as number) - (vb as number);\n if (cur.order === 'desc') res = -res;\n if (res === 0) {\n const ra = toNumber(a.rank); const rb = toNumber(b.rank);\n res = ra - rb;\n }\n return res;\n });\n }\n return arr.map((r, idx) => {\n const displayTeam = pickName(r.team_id, r.team, r.team_logo_url);\n const displayLogo = pickLogo(r.team_id, displayTeam, r.team_logo_url);\n return (\n <Tr \n key={`${c.id}-${r.rank}-${r.team}`} \n transition=\"all 0.15s\" \n _hover={{ transform: 'translateY(-3px)', boxShadow: 'lg', zIndex: 3, cursor: 'pointer' }} \n position=\"relative\" \n bg={idx % 2 === 0 ? rowOddBg : rowEvenBg}\n onClick={() => handleClubClick(r)}\n >\n <Td>\n <Badge variant=\"subtle\" bg={useColorModeValue('gray.100', 'gray.700')} color={tableTextColor} borderWidth=\"1px\" borderColor={borderColor}>{r.rank}</Badge>\n </Td>\n <Td>\n <Flex align=\"center\" gap={3}>\n <TeamLogo\n teamId={r.team_id || deriveTeamIdFromLogoUrl(r.team_logo_url)}\n teamName={displayTeam}\n facrLogo={displayLogo}\n size=\"small\"\n alt={displayTeam}\n objectFit=\"contain\"\n bg={cardBg}\n borderWidth=\"1px\"\n borderColor={borderColor}\n />\n <Text fontWeight=\"medium\" color={tableTextColor}>{displayTeam}</Text>\n </Flex>\n </Td>\n <Td isNumeric color={tableTextColor}>{r.played}</Td>\n <Td isNumeric color={tableTextColor}>{r.wins}</Td>\n <Td isNumeric color={tableTextColor}>{r.draws}</Td>\n <Td isNumeric color={tableTextColor}>{r.losses}</Td>\n <Td isNumeric color={tableTextColor}>{r.score}</Td>\n <Td isNumeric>\n <Badge variant=\"solid\" bg=\"blue.600\" color=\"white\">{r.points}</Badge>\n </Td>\n </Tr>\n );});})()}\n </Tbody>\n </Table>\n </Box>\n </TabPanel>\n ))}\n </TabPanels>\n </Tabs>\n )}\n {!loading && !error && competitions.length === 0 && (\n <Text color={textSecondary}>{t('tables.no_tables')}</Text>\n )}\n </Container>\n \n {/* Newsletter CTA */}\n <NewsletterCTA />\n\n <ClubModal\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n club={selectedClub}\n clubType={(settings?.club_type as 'football' | 'futsal') || 'football'}\n />\n </MainLayout>\n );\n};\n\nexport default TablesPage;\n","import api from './api';\n\nexport type Sweepstake = {\n id: number;\n title: string;\n description?: string;\n image_url?: string;\n rules_url?: string;\n start_at: string;\n end_at: string;\n status: string;\n picker_style?: 'wheel' | 'cycler' | string;\n total_prizes?: number;\n prize_summary?: string;\n entry_cost_points?: number;\n entry_fee_czk?: number;\n max_entries_per_user?: number;\n winners_selected_at?: string | null;\n visibility_until?: string | null;\n};\n\nexport type SweepstakePrize = {\n id: number;\n sweepstake_id: number;\n name: string;\n description?: string;\n image_url?: string;\n value?: string;\n quantity: number;\n display_order: number;\n kind?: 'physical' | 'points' | 'xp' | 'points_xp';\n points?: number;\n xp?: number;\n};\n\nexport type SweepstakeWinner = {\n id: number;\n sweepstake_id: number;\n entry_id: number;\n user_id: number;\n prize_id?: number | null;\n prize_name?: string;\n claim_status: string;\n announced_at?: string | null;\n};\n\nexport type CurrentSweepstakeResponse = {\n sweepstake: Sweepstake | null;\n prizes?: SweepstakePrize[];\n winners?: SweepstakeWinner[];\n state?: 'upcoming' | 'active' | 'finalized';\n has_entered?: boolean;\n visual_played_at?: string | null;\n my_entries_count?: number;\n can_enter?: boolean;\n};\n\nexport async function getCurrentSweepstake(): Promise<CurrentSweepstakeResponse> {\n const res = await api.get('/sweepstakes/current');\n return res.data;\n}\n\nexport async function enterSweepstake(id: number): Promise<void> {\n await api.post(`/sweepstakes/${id}/enter`, {});\n}\n\nexport async function markSweepstakeVisualPlayed(id: number): Promise<void> {\n await api.post(`/sweepstakes/${id}/played`, {});\n}\n\nexport async function getMyWinnings(): Promise<{ items: SweepstakeWinner[] }> {\n const res = await api.get('/sweepstakes/my-winnings');\n return res.data;\n}\n\n// Admin\nexport async function adminListSweepstakes(params?: { status?: string }) {\n const res = await api.get('/admin/sweepstakes', { params });\n return res.data?.items || [];\n}\n\nexport async function adminCreateSweepstake(data: Partial<Sweepstake> & { start_at: string; end_at: string }) {\n const res = await api.post('/admin/sweepstakes', data);\n return res.data;\n}\n\nexport async function adminUpdateSweepstake(id: number, data: Partial<Sweepstake>) {\n const res = await api.put(`/admin/sweepstakes/${id}`, data);\n return res.data;\n}\n\nexport async function adminDeleteSweepstake(id: number) {\n const res = await api.delete(`/admin/sweepstakes/${id}`);\n return res.data;\n}\n\nexport async function adminListEntries(id: number) {\n const res = await api.get(`/admin/sweepstakes/${id}/entries`);\n return res.data?.items || [];\n}\n\nexport async function adminListWinners(id: number) {\n const res = await api.get(`/admin/sweepstakes/${id}/winners`);\n return res.data?.items || [];\n}\n\nexport async function adminFinalizeSweepstake(id: number, seed?: string) {\n const res = await api.post(`/admin/sweepstakes/${id}/finalize`, seed ? { seed } : {});\n return res.data;\n}\n\n// Visualizer data\nexport type VisualEntry = { user_id: number; display_name: string; avatar_url?: string };\nexport type VisualWinner = { id?: number; user_id: number; prize_name?: string; claim_status?: string };\nexport type VisualData = { sweepstake: Sweepstake; entries: VisualEntry[]; winners: VisualWinner[] };\nexport async function adminGetVisualData(id: number): Promise<VisualData> {\n const res = await api.get(`/admin/sweepstakes/${id}/visual`);\n return res.data;\n}\n\nexport async function getPublicVisualData(id: number): Promise<VisualData> {\n const res = await api.get(`/sweepstakes/${id}/visual`);\n return res.data;\n}\n\n// Prizes CRUD\nexport type SweepstakePrizeInput = Partial<SweepstakePrize> & {\n name?: string;\n quantity?: number;\n display_order?: number;\n kind?: 'physical' | 'points' | 'xp' | 'points_xp';\n points?: number;\n xp?: number;\n};\nexport async function adminListPrizes(id: number): Promise<SweepstakePrize[]> {\n const res = await api.get(`/admin/sweepstakes/${id}/prizes`);\n return res.data?.items || [];\n}\nexport async function adminCreatePrize(id: number, data: SweepstakePrizeInput) {\n const res = await api.post(`/admin/sweepstakes/${id}/prizes`, data);\n return res.data;\n}\nexport async function adminUpdatePrize(id: number, prizeId: number, data: SweepstakePrizeInput) {\n const res = await api.put(`/admin/sweepstakes/${id}/prizes/${prizeId}`, data);\n return res.data;\n}\nexport async function adminDeletePrize(id: number, prizeId: number) {\n const res = await api.delete(`/admin/sweepstakes/${id}/prizes/${prizeId}`);\n return res.data;\n}\nexport async function adminReorderPrizes(id: number, order: number[]) {\n const res = await api.post(`/admin/sweepstakes/${id}/prizes/reorder`, { order });\n return res.data;\n}\n\n// Winners management\nexport async function adminUpdateWinner(id: number, winnerId: number, data: { claim_status?: 'pending'|'claimed'|'delivered'; claim_note?: string }) {\n const res = await api.patch(`/admin/sweepstakes/${id}/winners/${winnerId}`, data);\n return res.data;\n}\n\nexport async function adminSetWinnerPrize(id: number, winnerId: number, prizeId: number) {\n const res = await api.patch(`/admin/sweepstakes/${id}/winners/${winnerId}/prize`, { prize_id: prizeId });\n return res.data;\n}\n","import { Article } from './articles';\n\nexport interface MatchSnapshot {\n external_match_id?: string;\n competition?: string;\n date_time?: string;\n venue?: string;\n home?: string;\n away?: string;\n score?: string;\n}\n\nexport function stripHtml(html?: string): string {\n if (!html) return '';\n if (typeof window === 'undefined') {\n return html.replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim();\n }\n const div = document.createElement('div');\n div.innerHTML = html;\n return (div.textContent || div.innerText || '')?.replace(/\\s+/g, ' ').trim();\n}\n\nexport function composeInstagramPostFromArticle(params: {\n article: Article;\n trackingUrl: string;\n clubName?: string;\n hashtags?: string[];\n match?: MatchSnapshot | null;\n}): string {\n const { article, trackingUrl, clubName, hashtags = [], match } = params;\n const title = article.title?.trim() || '';\n const catName = (article as any)?.category?.name || (article as any)?.category_name || '';\n const snippet = stripHtml(article.content).slice(0, 160);\n const defaultTags = hashtags.length ? hashtags : [\n `#${normalizeTag(clubName || 'FKKrnov')}`,\n '#fotbal',\n '#modrazluta',\n ];\n\n if (match && (match.home || match.away)) {\n const home = match.home || '';\n const away = match.away || '';\n const comp = match.competition ? `${match.competition}` : '';\n const date = match.date_time ? formatDateTime(match.date_time) : '';\n const score = match.score && /\\d/.test(match.score) ? match.score : '';\n\n const header = `💙💛 ${(catName || clubName || 'Náš klub')}: ${title} 💛💙`;\n const lines = [\n header,\n '',\n score ? `Výsledek: ${home} ${score} ${away}` : `${home} vs ${away}`,\n comp || date ? `${comp}${comp && date ? ' • ' : ''}${date}` : '',\n match.venue ? `Místo: ${cleanVenue(String(match.venue))}` : '',\n '',\n snippet ? `${snippet}${snippet.length === 160 ? '…' : ''}` : '',\n '',\n '📸 Celý článek najdeš tady 👇',\n `🔗 ${trackingUrl}`,\n '',\n defaultTags.join(' '),\n '💙💛'\n ].filter(Boolean);\n return lines.join('\\n');\n }\n\n // Informative/general article\n const header = `💙💛 ${(catName || clubName || 'Náš klub')}: ${title} 💛💙`;\n const lines = [\n header,\n '',\n snippet,\n '',\n '📸 Celý článek najdeš tady 👇',\n `🔗 ${trackingUrl}`,\n '',\n defaultTags.join(' '),\n '💙💛'\n ];\n return lines.join('\\n');\n}\n\nexport function composeInstagramPostFromActivity(params: {\n activity: any;\n trackingUrl: string;\n clubName?: string;\n hashtags?: string[];\n}): string {\n const { activity, trackingUrl, clubName, hashtags = [] } = params;\n const title = String(activity?.title || '').trim();\n const desc = stripHtml(String(activity?.description || '')).slice(0, 280);\n const date = activity?.start_time ? formatDateTime(activity.start_time) : '';\n const place = activity?.location ? String(activity.location) : '';\n\n const defaultTags = hashtags.length ? hashtags : [\n `#${normalizeTag(clubName || 'FKKrnov')}`,\n '#aktivity',\n '#fotbal',\n ];\n\n const header = `💙💛 ${clubName || 'Náš klub'}: ${title} 💛💙`;\n const lines = [\n header,\n '',\n date || place ? `${date}${date && place ? ' • ' : ''}${place}` : '',\n desc,\n '',\n '📸 Více informací najdeš tady 👇',\n `🔗 ${trackingUrl}`,\n '',\n defaultTags.join(' '),\n '💙💛'\n ].filter(Boolean);\n return lines.join('\\n');\n}\n\nexport function formatDateTime(dt: string): string {\n const s = String(dt || '').trim();\n // Handle FAČR format: dd.mm.yyyy or dd.mm.yyyy HH:MM\n const m = s.match(/^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})(?:\\s+(\\d{1,2}):(\\d{2}))?$/);\n if (m) {\n const dd = parseInt(m[1], 10);\n const MM = parseInt(m[2], 10);\n const yyyy = parseInt(m[3], 10);\n const hh = m[4] ? parseInt(m[4], 10) : 0;\n const min = m[5] ? parseInt(m[5], 10) : 0;\n const d = new Date(yyyy, MM - 1, dd, hh, min);\n const dateStr = d.toLocaleDateString('cs-CZ');\n const timeStr = (m[4] ? d.toLocaleTimeString('cs-CZ', { hour: '2-digit', minute: '2-digit' }) : '');\n return timeStr ? `${dateStr} ${timeStr}` : dateStr;\n }\n // ISO-like or other parseable formats\n try {\n const d = new Date(s);\n if (!isNaN(d.getTime())) {\n return `${d.toLocaleDateString('cs-CZ')} ${d.toLocaleTimeString('cs-CZ', { hour: '2-digit', minute: '2-digit' })}`;\n }\n } catch {}\n return s;\n}\n\nexport function cleanVenue(v: string): string {\n try {\n const base = String(v || '').trim();\n // Prefer locality before first \" - \" (e.g., \"Kobeřice - tráva\" -> \"Kobeřice\")\n return base.split(' - ')[0].trim();\n } catch {\n return v;\n }\n}\n\nfunction normalizeTag(s: string): string {\n return s\n .replace(/[^\\p{L}\\p{N}]+/gu, '') // remove spaces/symbols\n .replace(/[áä]/gi, 'a')\n .replace(/[č]/gi, 'c')\n .replace(/[ď]/gi, 'd')\n .replace(/[éěë]/gi, 'e')\n .replace(/[íï]/gi, 'i')\n .replace(/[ľĺ]/gi, 'l')\n .replace(/[ň]/gi, 'n')\n .replace(/[óö]/gi, 'o')\n .replace(/[ř]/gi, 'r')\n .replace(/[š]/gi, 's')\n .replace(/[ť]/gi, 't')\n .replace(/[úůü]/gi, 'u')\n .replace(/[ý]/gi, 'y')\n .replace(/[ž]/gi, 'z');\n}\n","import React from 'react';\nimport { IconButton, Button, useDisclosure, Modal, ModalOverlay, ModalContent, ModalHeader, ModalBody, ModalFooter, Textarea, useToast, Tooltip, Box, Menu, MenuButton, MenuList, MenuItem, SimpleGrid, Text, Image as ChakraImage } from '@chakra-ui/react';\nimport { Share2, Instagram, Twitter, Facebook, Copy } from 'lucide-react';\nimport { useAuth } from '../../contexts/AuthContext';\nimport { createShortLink, createPublicShortLink } from '../../services/shortlinks';\nimport { Article, getArticleMatchLink } from '../../services/articles';\nimport { API_URL } from '../../services/api';\nimport { composeInstagramPostFromArticle, composeInstagramPostFromActivity, MatchSnapshot, stripHtml, formatDateTime, cleanVenue } from '../../services/instagram';\nimport { generateInstagramAI, generateInstagramImagesAI } from '../../services/ai';\nimport { usePublicSettings } from '../../hooks/usePublicSettings';\nimport AILoadingModal from '../common/AILoadingModal';\n\ninterface Props {\n article?: Article;\n activity?: any;\n match?: MatchSnapshot | null;\n targetUrl?: string;\n size?: 'sm' | 'md' | 'lg';\n placement?: 'fixed' | 'inline';\n mr?: number | string;\n mb?: number | string;\n zIndex?: number;\n variant?: 'button' | 'icon';\n onGenerated?: (text: string, shortUrl: string) => void;\n align?: 'left' | 'right';\n position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';\n}\n\nconst InstagramGeneratorButton: React.FC<Props> = ({\n article,\n activity,\n match,\n targetUrl,\n size = 'md',\n placement = 'fixed',\n mr = 6,\n mb = 6,\n zIndex = 40,\n variant = 'icon',\n onGenerated,\n align = 'right',\n position = 'top-right',\n}) => {\n const { user } = useAuth();\n const role = String(user?.role || '').toLowerCase();\n const isAdmin = role === 'admin';\n const { data: publicSettings } = usePublicSettings();\n const toast = useToast();\n const { isOpen, onOpen, onClose } = useDisclosure();\n const [text, setText] = React.useState('');\n const [shortUrl, setShortUrl] = React.useState('');\n const [loading, setLoading] = React.useState(false);\n const [aiProgress, setAiProgress] = React.useState<number | undefined>(undefined);\n const [aiStartTime, setAiStartTime] = React.useState<number | null>(null);\n const [images, setImages] = React.useState<string[]>([]);\n\n // Build deterministic campaign id for UTM and shortlink code\n const campaignId = React.useMemo(() => {\n if (article?.id) return `article-${article.id}`;\n if (activity?.id) return `activity-${activity.id}`;\n return 'share';\n }, [article?.id, activity?.id]);\n\n const computeTarget = () => {\n if (targetUrl) return targetUrl;\n if (typeof window !== 'undefined') return window.location.href;\n return '';\n };\n\n const withUtm = (urlStr: string) => {\n try {\n const u = new URL(urlStr, typeof window !== 'undefined' ? window.location.origin : 'http://localhost');\n if (!u.searchParams.get('utm_source')) u.searchParams.set('utm_source', 'instagram');\n if (!u.searchParams.get('utm_medium')) u.searchParams.set('utm_medium', 'social');\n if (!u.searchParams.get('utm_campaign')) u.searchParams.set('utm_campaign', campaignId);\n return u.toString();\n } catch {\n return urlStr;\n }\n };\n\n const handleGenerate = async (e?: React.MouseEvent) => {\n if (e) {\n e.preventDefault();\n e.stopPropagation();\n }\n try {\n setLoading(true);\n setAiProgress(0);\n setAiStartTime(Date.now());\n setImages([]);\n \n // Start progress simulation\n const progressInterval = setInterval(() => {\n setAiProgress(prev => {\n if (prev === undefined || prev >= 95) return prev;\n return Math.min(prev + Math.random() * 20 + 10, 95);\n });\n }, 1500);\n\n const fullUrl = withUtm(computeTarget());\n if (!fullUrl) throw new Error('Nelze zjistit URL článku/aktivity');\n\n // Deterministic shortlink code to keep link stable across generations\n const platformCode = article?.id ? `ig-a${article.id}` : (activity?.id ? `ig-e${activity.id}` : 'ig-share');\n const payload = {\n target_url: fullUrl,\n title: article?.title || activity?.title || 'Link',\n source_type: article ? 'article' : (activity ? 'event' : 'other'),\n source_id: article?.id || activity?.id,\n code: platformCode,\n } as any;\n let sUrl = '';\n try {\n const res = await createShortLink(payload);\n sUrl = res?.short_url || '';\n } catch (err) {\n // Fallback to public shortlink (deterministic per URL) or use long URL\n try {\n const resPub = await createPublicShortLink({ target_url: fullUrl, title: article?.title || activity?.title || 'Link' });\n sUrl = resPub?.short_url || fullUrl;\n } catch {\n sUrl = fullUrl;\n }\n }\n setShortUrl(sUrl || fullUrl);\n\n const clubName = publicSettings?.club_name || undefined;\n let composed = '';\n if (article) {\n let resolvedMatch = match || null;\n if (!resolvedMatch && article?.id) {\n try {\n const link = await getArticleMatchLink(article.id);\n const extId = (link as any)?.external_match_id;\n if (extId) {\n try {\n const origin = new URL(API_URL, window.location.origin).origin;\n const resp = await fetch(`${origin}/cache/prefetch/facr_club_info.json`, { cache: 'no-cache' });\n if (resp.ok) {\n const json = await resp.json();\n const comps = Array.isArray(json?.competitions) ? json.competitions : [];\n let snapshot: MatchSnapshot | null = null;\n for (const c of comps) {\n const matches = Array.isArray(c.matches) ? c.matches : [];\n for (const m of matches) {\n const mid = String(m.match_id || m.id);\n if (mid === String(extId)) {\n let score = '';\n if (m?.score && m.score !== 'vs') score = String(m.score);\n else if (m?.result_home != null && m?.result_away != null) score = `${m.result_home}:${m.result_away}`;\n snapshot = {\n external_match_id: String(extId),\n competition: String(c.name || ''),\n date_time: String(m.date_time || m.date || ''),\n venue: m.venue ? String(m.venue) : undefined,\n home: String(m.home || m.home_team || ''),\n away: String(m.away || m.away_team || ''),\n score,\n };\n break;\n }\n }\n if (snapshot) break;\n }\n if (snapshot) resolvedMatch = snapshot;\n }\n } catch {}\n }\n } catch {}\n }\n // Try real AI caption generation first; fallback to template composer\n try {\n const ai = await generateInstagramAI({\n type: 'article',\n title: article.title,\n content: stripHtml(article.content),\n club_name: clubName,\n link: sUrl || fullUrl,\n category: (article as any)?.category?.name || (article as any)?.category_name,\n match: resolvedMatch ? {\n home: resolvedMatch.home,\n away: resolvedMatch.away,\n competition: resolvedMatch.competition,\n date_time: resolvedMatch.date_time ? formatDateTime(resolvedMatch.date_time) : undefined,\n venue: resolvedMatch.venue ? cleanVenue(resolvedMatch.venue) : undefined,\n score: resolvedMatch.score,\n } : undefined,\n });\n composed = ai?.text?.trim() || '';\n } catch {}\n if (!composed) {\n composed = composeInstagramPostFromArticle({ article, trackingUrl: sUrl || fullUrl, clubName, match: resolvedMatch });\n }\n } else if (activity) {\n // Try AI generation first\n try {\n const ai = await generateInstagramAI({\n type: 'event',\n title: String(activity?.title || ''),\n content: stripHtml(String(activity?.description || '')),\n club_name: clubName,\n link: sUrl || fullUrl,\n });\n composed = ai?.text?.trim() || '';\n } catch {}\n if (!composed) {\n composed = composeInstagramPostFromActivity({ activity, trackingUrl: sUrl || fullUrl, clubName });\n }\n } else {\n composed = `${clubName || 'Náš klub'}\\n\\n🔗 ${sUrl || fullUrl}`;\n }\n\n try {\n const primaryColor = (publicSettings as any)?.primary_color || '';\n const secondaryColor = (publicSettings as any)?.secondary_color || '';\n const imagePromptBase = article\n ? `Návrh instagramového obrázku k článku \"${article.title}\" pro oficiální profil fotbalového klubu${clubName ? ' ' + clubName : ''}.`\n : activity\n ? `Návrh instagramového obrázku k aktivitě \"${activity.title}\" pro oficiální profil fotbalového klubu${clubName ? ' ' + clubName : ''}.`\n : `Návrh univerzálního instagramového obrázku pro oficiální profil fotbalového klubu${clubName ? ' ' + clubName : ''}.`;\n\n let colorHint = '';\n if (primaryColor || secondaryColor) {\n colorHint = ` Klubové barvy: ${primaryColor || ''}${primaryColor && secondaryColor ? ', ' : ''}${secondaryColor || ''}.`;\n }\n\n const imagePrompt = `${imagePromptBase} Zobraz stadion, hráče nebo fanoušky našeho klubu, žádné loga soupeře ani text v obrázku.${colorHint} Styl: realistický, moderní, sportovní, poměr stran 4:5, bez textu, vhodné jako hlavní vizuál příspěvku.`;\n const imgResp = await generateInstagramImagesAI({\n prompt: imagePrompt,\n aspect: '4:5',\n count: 2,\n });\n if (Array.isArray(imgResp?.urls) && imgResp.urls.length > 0) {\n setImages(imgResp.urls);\n }\n } catch (imgErr) {\n console.error('Instagram image generation failed', imgErr);\n }\n \n clearInterval(progressInterval);\n setAiProgress(100);\n setText(composed);\n onGenerated?.(composed, sUrl || fullUrl);\n \n setTimeout(() => {\n onOpen();\n }, 500); // Brief moment to show 100% completion\n } catch (err: any) {\n toast({ status: 'error', title: 'Nelze vygenerovat příspěvek', description: err?.message || 'Zkuste to prosím znovu.' });\n } finally {\n setTimeout(() => {\n setLoading(false);\n setAiProgress(undefined);\n setAiStartTime(null);\n }, 1000); // Brief moment to show 100% completion or clear on error\n }\n };\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(text);\n toast({ status: 'success', title: 'Zkopírováno', description: 'Text příspěvku byl zkopírován do schránky.' });\n } catch {\n toast({ status: 'warning', title: 'Nelze kopírovat', description: 'Zkopírujte prosím ručně.' });\n }\n };\n\n // Build share URL with platform-specific UTMs (base long URL)\n const buildShareUrl = (platform: 'instagram' | 'twitter' | 'facebook' | 'copy'): string => {\n const base = computeTarget();\n try {\n const u = new URL(base, typeof window !== 'undefined' ? window.location.origin : 'http://localhost');\n if (!u.searchParams.get('utm_source')) u.searchParams.set('utm_source', platform);\n if (!u.searchParams.get('utm_medium')) u.searchParams.set('utm_medium', 'social');\n if (!u.searchParams.get('utm_campaign')) u.searchParams.set('utm_campaign', campaignId);\n return u.toString();\n } catch {\n return base;\n }\n };\n\n // Create or reuse a public shortlink for visitors for a given long URL\n const getPublicShortUrl = async (longUrl: string): Promise<string> => {\n try {\n const res = await createPublicShortLink({ target_url: longUrl, title: article?.title || activity?.title });\n return res?.short_url || longUrl;\n } catch {\n return longUrl;\n }\n };\n\n const handleShareClick = async (platform: 'instagram' | 'twitter' | 'facebook' | 'copy') => {\n const longUrl = buildShareUrl(platform);\n const sUrl = await getPublicShortUrl(longUrl);\n if (platform === 'copy') {\n try {\n await navigator.clipboard.writeText(sUrl);\n toast({ status: 'success', title: 'Krátký odkaz zkopírován' });\n } catch {\n toast({ status: 'warning', title: 'Kopírování se nezdařilo' });\n }\n return;\n }\n if (platform === 'twitter') {\n const text = article?.title || activity?.title || '';\n const tw = `https://twitter.com/intent/tweet?url=${encodeURIComponent(sUrl)}&text=${encodeURIComponent(text)}`;\n window.open(tw, '_blank');\n return;\n }\n if (platform === 'facebook') {\n const fb = `https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(sUrl)}`;\n window.open(fb, '_blank');\n return;\n }\n // Instagram has no official web share with prefilled text; open site and copy short link\n try {\n await navigator.clipboard.writeText(sUrl);\n toast({ status: 'info', title: 'Krátký odkaz zkopírován', description: 'Vložte jej do Instagramu.' });\n } catch {}\n window.open('https://www.instagram.com/', '_blank');\n };\n\n const AdminButtonEl = (\n <Tooltip label=\"Vygenerovat Instagram příspěvek\" placement=\"right\">\n {variant === 'icon' ? (\n <IconButton aria-label=\"Instagram příspěvek\" icon={<Share2 size={18} />} colorScheme=\"brand\" onClick={handleGenerate} isDisabled={loading} size={size} />\n ) : (\n <Button leftIcon={<Share2 size={18} />} colorScheme=\"brand\" onClick={handleGenerate} isDisabled={loading} size={size}>\n Instagram příspěvek\n </Button>\n )}\n </Tooltip>\n );\n\n const VisitorShareEl = (\n <Menu placement=\"top-start\">\n <MenuButton\n as={IconButton}\n aria-label=\"Sdílet\"\n icon={<Share2 size={18} />}\n variant=\"solid\"\n colorScheme=\"brand\"\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); }}\n onMouseDown={(e) => { e.preventDefault(); e.stopPropagation(); }}\n onTouchStart={(e) => { e.preventDefault(); e.stopPropagation(); }}\n />\n <MenuList>\n <MenuItem onClick={() => handleShareClick('instagram')} icon={<Instagram size={16} />}>Instagram</MenuItem>\n <MenuItem onClick={() => handleShareClick('twitter')} icon={<Twitter size={16} />}>Twitter</MenuItem>\n <MenuItem onClick={() => handleShareClick('facebook')} icon={<Facebook size={16} />}>Facebook</MenuItem>\n <MenuItem onClick={() => handleShareClick('copy')} icon={<Copy size={16} />}>Kopírovat odkaz</MenuItem>\n </MenuList>\n </Menu>\n );\n\n return (\n <>\n {placement === 'fixed' ? (\n <Box position=\"fixed\" bottom={mb} zIndex={zIndex} {...(align === 'left' ? { left: mr } : { right: mr })}>\n {isAdmin ? AdminButtonEl : VisitorShareEl}\n </Box>\n ) : (\n <Box\n position=\"absolute\"\n zIndex={zIndex}\n {...(position === 'top-left' ? { top: 2, left: 2 } : {})}\n {...(position === 'top-right' ? { top: 2, right: 2 } : {})}\n {...(position === 'bottom-left' ? { bottom: 2, left: 2 } : {})}\n {...(position === 'bottom-right' ? { bottom: 2, right: 2 } : {})}\n >\n {isAdmin ? AdminButtonEl : VisitorShareEl}\n </Box>\n )}\n\n <Modal isOpen={isOpen} onClose={onClose} size=\"xl\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Instagram příspěvek</ModalHeader>\n <ModalBody>\n <Textarea value={text} onChange={(e) => setText(e.target.value)} rows={12} fontFamily=\"mono\" />\n {images.length > 0 && (\n <Box mt={4}>\n <Text fontSize=\"sm\" mb={2}>Návrhy obrázků pro Instagram (Grok):</Text>\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={3}>\n {images.map((url, idx) => (\n <Box key={idx}>\n <ChakraImage src={url} alt={`Instagram obrázek ${idx + 1}`} borderRadius=\"md\" w=\"100%\" objectFit=\"cover\" />\n <Button\n mt={2}\n size=\"xs\"\n variant=\"outline\"\n onClick={() => { window.open(url, '_blank'); }}\n >\n Otevřít v novém okně\n </Button>\n </Box>\n ))}\n </SimpleGrid>\n </Box>\n )}\n </ModalBody>\n <ModalFooter gap={3}>\n <Button variant=\"outline\" onClick={handleCopy}>Kopírovat</Button>\n <Button onClick={onClose}>Zavřít</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n <AILoadingModal\n isOpen={loading}\n onClose={() => {}} // Can't close while AI is working\n title=\"AI generuje Instagram příspěvek\"\n message=\"Pracuji na vytvoření příspěvku pro Instagram...\"\n progress={aiProgress}\n estimatedTime={aiStartTime ? 20 : undefined} // 20 seconds estimated\n />\n </>\n );\n};\n\nexport default InstagramGeneratorButton;\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { Link as RouterLink, useLocation } from 'react-router-dom';\nimport '../../styles/sparta-styles.css';\nimport { usePublicSettings } from '../../hooks/usePublicSettings';\nimport { useClubTheme } from '../../contexts/ClubThemeContext';\nimport { getNavigationItems, NavigationItem, seedDefaultNavigation } from '../../services/navigation';\nimport { getCategories, Category } from '../../services/public';\nimport { assetUrl } from '../../utils/url';\nimport { useTranslation } from 'react-i18next';\n\n// Minimal NavLink type used to render items\ntype NavLink = { label: string; to?: string; items?: { label: string; to: string }[]; external?: boolean };\n\nconst SpartaNavbar: React.FC = () => {\n const { t } = useTranslation();\n const { data: settings } = usePublicSettings();\n const theme = useClubTheme();\n const location = useLocation();\n\n const [mobileOpen, setMobileOpen] = useState(false);\n const [dynamicNavItems, setDynamicNavItems] = useState<NavigationItem[]>([]);\n const [navLoading, setNavLoading] = useState(true);\n const [navCategories, setNavCategories] = useState<Category[] | null>(null);\n\n // Load dynamic navigation\n useEffect(() => {\n let active = true;\n (async () => {\n try {\n const items = await getNavigationItems();\n if (active && Array.isArray(items)) {\n const publicItems = items.filter(item => !item.requires_admin);\n if (publicItems.length === 0) {\n try {\n await seedDefaultNavigation();\n const newItems = await getNavigationItems();\n if (active && Array.isArray(newItems)) {\n const publicNewItems = newItems.filter(item => !item.requires_admin);\n setDynamicNavItems(publicNewItems);\n }\n } catch {\n setDynamicNavItems([]);\n }\n } else {\n setDynamicNavItems(publicItems);\n }\n }\n } catch {\n // leave empty, fallback will handle\n } finally {\n if (active) setNavLoading(false);\n }\n })();\n return () => { active = false };\n }, []);\n\n // Load categories (for Blog dropdown fallback)\n useEffect(() => {\n let active = true;\n (async () => {\n try {\n const cats = await getCategories();\n if (active && Array.isArray(cats) && cats.length > 0) {\n setNavCategories(cats);\n } else if (active && Array.isArray(settings?.categories)) {\n setNavCategories(settings!.categories as any);\n }\n } catch {\n if (active && Array.isArray(settings?.categories)) {\n setNavCategories(settings!.categories as any);\n }\n }\n })();\n return () => { active = false };\n }, [settings?.categories]);\n\n const isPathActive = (to?: string) => {\n if (!to) return false;\n return location.pathname === to || location.pathname.startsWith((to || '') + '/');\n };\n\n const convertToNavLink = (item: NavigationItem): NavLink => {\n // Map known Czech labels to translation keys\n const getTranslatedLabel = (label: string) => {\n const labelMap: Record<string, string> = {\n 'Domů': 'nav.home',\n 'Aktuality': 'nav.news',\n 'Zápasy': 'nav.matches',\n 'Hráči': 'nav.players',\n 'Fotogalerie': 'nav.gallery',\n 'Videa': 'nav.videos',\n 'Kontakt': 'nav.contact',\n 'O klubu': 'nav.about',\n 'Aktivity': 'nav.activities',\n 'Sponzoři': 'nav.sponsors',\n 'Články': 'nav.news',\n 'Blog': 'nav.news',\n 'Kalendář': 'nav.calendar',\n 'Tabulky': 'nav.table'\n };\n const translationKey = labelMap[label];\n return translationKey ? t(translationKey) : label;\n };\n\n const link: NavLink = {\n label: getTranslatedLabel(item.label),\n to: item.url || '#',\n external: item.type === 'external',\n };\n if (item.type === 'dropdown' && item.children && item.children.length > 0) {\n link.items = item.children.map(child => ({ \n label: getTranslatedLabel(child.label), \n to: child.url || '#' \n }));\n }\n return link;\n };\n\n const categoryItems = useMemo(() => {\n const source = Array.isArray(navCategories) && navCategories.length > 0 ? navCategories : [];\n return source.map((cat: any) => ({ label: cat.name, to: cat.url || (cat.id ? `/blog?category_id=${cat.id}` : (cat.slug ? `/blog?category=${encodeURIComponent(cat.slug)}` : '/blog')) }));\n }, [navCategories]);\n\n const NAV_LINKS: NavLink[] = useMemo(() => {\n if (!navLoading && dynamicNavItems.length > 0) {\n const navLinks = dynamicNavItems.map(convertToNavLink);\n if (categoryItems.length > 0) {\n const idx = navLinks.findIndex(l => l.label === 'Články' || l.label === 'Blog' || l.to === '/blog');\n if (idx !== -1) navLinks[idx] = { ...navLinks[idx], items: categoryItems };\n }\n return navLinks;\n }\n\n // Fallback minimal menu\n const links: NavLink[] = [\n { label: 'Domů', to: '/' },\n ...(settings?.show_about_in_nav === false ? [] : [{ label: 'O klubu', to: '/o-klubu' } as NavLink]),\n { label: 'Kalendář', to: '/kalendar' },\n { label: 'Zápasy', to: '/zapasy' },\n { label: 'Aktivity', to: '/aktivity' },\n { label: 'Hráči', to: '/hraci' },\n categoryItems.length > 0 ? { label: 'Články', to: '/blog', items: categoryItems } : { label: 'Články', to: '/blog' },\n { label: 'Videa', to: '/videa' },\n { label: settings?.gallery_label || t('nav.gallery'), to: '/galerie' },\n ...(settings?.shop_url ? [{ label: 'Fanshop', to: settings.shop_url, external: true } as NavLink] : []),\n { label: 'Sponzoři', to: '/sponzori' },\n { label: 'Kontakt', to: '/kontakt' },\n ];\n return links;\n }, [navLoading, dynamicNavItems, settings?.show_about_in_nav, settings?.shop_url, settings?.gallery_label, categoryItems]);\n\n const logoUrl = (assetUrl(settings?.club_logo_url || theme.logoUrl) || settings?.club_logo_url || theme.logoUrl) || '/dist/img/logo-club-empty.svg';\n const clubName = settings?.club_name || theme.name || 'Klub';\n\n return (\n <div className=\"sparta-navbar-container\">\n <div className=\"sparta-navbar\">\n {/* Burger toggle for mobile */}\n <button\n aria-label=\"Menu\"\n className=\"sparta-navbar-toggle\"\n onClick={() => setMobileOpen(o => !o)}\n >\n <div className=\"sparta-burger-icon\" aria-hidden>\n <div className=\"sparta-burger-line\" />\n <div className=\"sparta-burger-line\" />\n <div className=\"sparta-burger-line\" />\n </div>\n </button>\n\n {/* Brand */}\n <RouterLink to=\"/\" className=\"sparta-navbar-brand\" onClick={() => setMobileOpen(false)}>\n <img src={logoUrl} alt={clubName} />\n </RouterLink>\n\n {/* Links */}\n <nav\n className=\"sparta-navbar-links\"\n style={{ display: mobileOpen ? 'flex' : undefined, flexWrap: 'wrap' }}\n >\n {NAV_LINKS.map((nav) => {\n const isActive = isPathActive(nav.to);\n const className = isActive ? 'sparta-button-tertiary' : 'sparta-button-tertiary';\n\n // When categories are present under Články/Blog, render clickable parent + category links\n if (nav.items && nav.items.length > 0 && (nav.label === 'Články' || nav.label === 'Blog' || (nav.to || '').startsWith('/blog'))) {\n return (\n <React.Fragment key={nav.label}>\n <RouterLink to={nav.to || '/blog'} className={className} onClick={() => setMobileOpen(false)}>\n {nav.label}\n </RouterLink>\n {nav.items.map((it) => (\n <RouterLink key={`${nav.label}-${it.to}`} to={it.to} className={className} onClick={() => setMobileOpen(false)}>\n {it.label}\n </RouterLink>\n ))}\n </React.Fragment>\n );\n }\n\n if (nav.external && nav.to) {\n return (\n <a key={nav.label} href={nav.to} target=\"_blank\" rel=\"noreferrer\" className={className} onClick={() => setMobileOpen(false)}>\n {nav.label}\n </a>\n );\n }\n\n return (\n <RouterLink key={nav.label} to={nav.to || '#'} className={className} onClick={() => setMobileOpen(false)}>\n {nav.label}\n </RouterLink>\n );\n })}\n </nav>\n </div>\n </div>\n );\n};\n\nexport default SpartaNavbar;\n","import React from 'react';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport {\n Box,\n Button,\n HStack,\n IconButton,\n Input,\n Table,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n useToast,\n Text,\n VStack,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalCloseButton,\n ModalBody,\n ModalFooter,\n useDisclosure,\n Link as ChakraLink,\n Badge,\n Select,\n} from '@chakra-ui/react';\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useAuth } from '../../contexts/AuthContext';\nimport { createShortLink, listShortLinks, getShortLinkStats } from '../../services/shortlinks';\nimport { FiClipboard, FiExternalLink, FiRefreshCcw, FiBarChart2 } from 'react-icons/fi';\nimport { getArticles } from '../../services/articles';\nimport { getEvents } from '../../services/eventService';\n\nconst ShortlinksAdminPage: React.FC = () => {\n const toast = useToast();\n const { user } = useAuth();\n const isAdmin = (user as any)?.role === 'admin';\n const qc = useQueryClient();\n const [selectedTarget, setSelectedTarget] = React.useState('');\n const [title, setTitle] = React.useState('');\n const [code, setCode] = React.useState('');\n const [creating, setCreating] = React.useState(false);\n const statsModal = useDisclosure();\n const [statsLink, setStatsLink] = React.useState<any>(null);\n const [statsData, setStatsData] = React.useState<any>(null);\n\n const linksQ = useQuery({\n queryKey: ['admin-shortlinks'],\n queryFn: listShortLinks,\n staleTime: 60_000,\n });\n\n // Fetch latest published articles (limit ~50) and activities for dropdown\n const articlesQ = useQuery({\n queryKey: ['shortlinks-articles'],\n queryFn: () => getArticles({ published: true, page_size: 50 }),\n staleTime: 60_000,\n });\n const eventsQ = useQuery({\n queryKey: ['shortlinks-events'],\n queryFn: () => getEvents(),\n staleTime: 60_000,\n });\n\n const staticTargets: Array<{ label: string; path: string }> = React.useMemo(() => ([\n { label: 'Domů', path: '/' },\n { label: 'Blog', path: '/blog' },\n { label: 'Kalendář', path: '/kalendar' },\n { label: 'Aktivity', path: '/aktivity' },\n { label: 'Tabulky', path: '/tabulky' },\n { label: 'Zápasy', path: '/zapasy' },\n { label: 'Hráči', path: '/hraci' },\n { label: 'Sponzoři', path: '/sponzori' },\n { label: 'Galerie', path: '/galerie' },\n { label: 'Videa', path: '/videa' },\n { label: 'Kontakt', path: '/kontakt' },\n { label: 'O klubu', path: '/o-klubu' },\n { label: 'Oblečení', path: '/obleceni' },\n ]), []);\n\n const handleCreate = async () => {\n const val = selectedTarget.trim();\n if (!val) { toast({ title: 'Vyberte cíl odkazu', status: 'warning' }); return; }\n try {\n setCreating(true);\n // sanitize code early for UX\n const rawCode = code.trim();\n const safeCode = rawCode ? rawCode.replace(/[^a-zA-Z0-9_-]/g, '').slice(0, 16) : undefined;\n // Decode selection to absolute URL + optional source metadata\n let target_url = '';\n let source_type: string | undefined;\n let source_id: number | undefined;\n const origin = typeof window !== 'undefined' ? window.location.origin : '';\n if (val.startsWith('static:')) {\n const path = val.substring('static:'.length);\n target_url = origin + path;\n source_type = 'page';\n } else if (val.startsWith('article:')) {\n const rest = val.substring('article:'.length); // id[:slug]\n const [idStr, slug] = rest.split(':');\n const idNum = Number(idStr);\n source_type = 'article';\n if (!isNaN(idNum)) source_id = idNum;\n // Always use the ID-based URL for reliability, slug-based URLs can break if slug changes\n target_url = origin + `/articles/${idStr}`;\n } else if (val.startsWith('event:')) {\n const idStr = val.substring('event:'.length);\n const idNum = Number(idStr);\n source_type = 'event';\n if (!isNaN(idNum)) source_id = idNum;\n target_url = origin + `/aktivita/${idStr}`;\n }\n if (!target_url) { toast({ title: 'Neplatná volba cíle', status: 'error' }); return; }\n const defaultCode = !safeCode && source_id && source_type\n ? (source_type === 'article' ? `a${source_id}` : (source_type === 'event' ? `e${source_id}` : undefined))\n : undefined;\n const res = await createShortLink({ target_url, title: title.trim() || undefined, code: (safeCode || defaultCode), active: true, ...(source_type ? { source_type } : {}), ...(source_id ? { source_id } : {}) });\n await navigator.clipboard.writeText(res.short_url);\n toast({ title: 'Odkaz vytvořen', description: `Zkopírováno: ${res.short_url}`, status: 'success' });\n setSelectedTarget(''); setTitle(''); setCode('');\n qc.invalidateQueries({ queryKey: ['admin-shortlinks'] });\n } catch (e: any) {\n const msg = e?.response?.data?.error || e?.response?.data?.details || e?.message || 'Zkuste to znovu';\n toast({ title: 'Vytvoření selhalo', description: String(msg), status: 'error' });\n } finally {\n setCreating(false);\n }\n };\n\n const openStats = async (item: any) => {\n try {\n setStatsLink(item);\n setStatsData(null);\n statsModal.onOpen();\n const data = await getShortLinkStats(item.id);\n setStatsData(data);\n } catch (e: any) {\n toast({ title: 'Načtení statistik selhalo', status: 'error' });\n }\n };\n\n return (\n <AdminLayout requireAdmin={false}>\n <Box>\n <HStack justify=\"space-between\" mb={4}>\n <Text fontSize=\"xl\" fontWeight=\"bold\">Zkrácené odkazy</Text>\n <IconButton aria-label=\"Obnovit\" icon={<FiRefreshCcw />} onClick={() => qc.invalidateQueries({ queryKey: ['admin-shortlinks'] })} />\n </HStack>\n\n {/* Create form */}\n <Box borderWidth=\"1px\" borderRadius=\"lg\" p={4} mb={6} bg=\"bg.card\">\n <Text fontWeight=\"semibold\" mb={2}>Vytvořit nový odkaz</Text>\n <HStack spacing={2} flexWrap=\"wrap\">\n <Select placeholder=\"Vyberte cíl\" value={selectedTarget} onChange={(e)=>setSelectedTarget(e.target.value)} flex={3}>\n <option value=\"\" disabled>— Vnitřní stránky —</option>\n {staticTargets.map((opt) => (\n <option key={opt.path} value={`static:${opt.path}`}>{opt.label}</option>\n ))}\n <option value=\"\" disabled>— Články (publikované) —</option>\n {(articlesQ.data?.data || []).map((a: any) => (\n <option key={a.id} value={`article:${a.id}:${a.slug || ''}`.replace(/:$/, '')}>{a.title}</option>\n ))}\n <option value=\"\" disabled>— Aktivity —</option>\n {(eventsQ.data || []).filter((ev: any) => ev?.is_public !== false).slice(0, 50).map((ev: any) => (\n <option key={ev.id} value={`event:${ev.id}`}>{ev.title}</option>\n ))}\n </Select>\n <Input placeholder=\"Titulek (volitelný)\" value={title} onChange={(e)=>setTitle(e.target.value)} flex={2} />\n <Input placeholder=\"Vlastní kód (volitelné)\" value={code} onChange={(e)=>setCode(e.target.value)} flex={1} maxLength={16} pattern=\"[A-Za-z0-9_-]+\" title=\"Povoleno: písmena, čísla, -, _ (max 16 znaků)\" />\n <Button onClick={handleCreate} isLoading={creating} colorScheme=\"blue\">Vytvořit</Button>\n </HStack>\n </Box>\n\n {/* List */}\n <Box borderWidth=\"1px\" borderRadius=\"lg\" overflowX=\"auto\" bg=\"bg.card\">\n <Table size=\"sm\">\n <Thead>\n <Tr>\n <Th>Kód</Th>\n <Th>Cíl</Th>\n <Th>Titulek</Th>\n <Th>Zdroj</Th>\n <Th>Prokliky</Th>\n <Th>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {linksQ.data?.items?.map((it: any) => {\n const shortUrl = `${window.location.origin}/s/${it.code}`;\n const source = it.source_type ? `${it.source_type}${it.source_id ? `#${it.source_id}` : ''}` : '-';\n return (\n <Tr key={it.id}>\n <Td><Badge colorScheme=\"blue\">{it.code}</Badge></Td>\n <Td maxW=\"420px\">\n <ChakraLink href={it.target_url} isExternal color=\"blue.600\">{it.target_url}</ChakraLink>\n </Td>\n <Td>{it.title || '-'}</Td>\n <Td>{source}</Td>\n <Td>{it.click_count ?? 0}</Td>\n <Td>\n <HStack>\n <IconButton aria-label=\"Otevřít krátkou URL\" icon={<FiExternalLink />} as={ChakraLink as any} href={shortUrl} isExternal />\n <IconButton aria-label=\"Zkopírovat\" icon={<FiClipboard />} onClick={async ()=>{ await navigator.clipboard.writeText(shortUrl); toast({ title: 'Zkopírováno', description: shortUrl, status: 'success', duration: 2000 }); }} />\n {isAdmin && (\n <IconButton aria-label=\"Statistiky\" icon={<FiBarChart2 />} onClick={()=> openStats(it)} />\n )}\n </HStack>\n </Td>\n </Tr>\n );\n })}\n {(!linksQ.data?.items || linksQ.data.items.length === 0) && (\n <Tr><Td colSpan={6}><Text p={3}>Žádné odkazy</Text></Td></Tr>\n )}\n </Tbody>\n </Table>\n </Box>\n\n {/* Stats modal (admins only) */}\n {isAdmin && (\n <Modal isOpen={statsModal.isOpen} onClose={statsModal.onClose} size=\"xl\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Statistiky: {statsLink?.code}</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n {!statsData ? (\n <Text>Načítání…</Text>\n ) : (\n <VStack align=\"stretch\" spacing={3}>\n <Box>\n <Text fontWeight=\"semibold\" mb={1}>Prokliky za posledních 30 dní</Text>\n <Table size=\"sm\" variant=\"simple\">\n <Thead><Tr><Th>Den</Th><Th isNumeric>Počet</Th></Tr></Thead>\n <Tbody>\n {statsData.timeseries?.map((row: any, idx: number) => (\n <Tr key={idx}><Td>{row.date}</Td><Td isNumeric>{row.count}</Td></Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n <Box>\n <Text fontWeight=\"semibold\" mb={1}>Referrers (Top)</Text>\n <Table size=\"sm\" variant=\"simple\">\n <Thead><Tr><Th>Referrer</Th><Th isNumeric>Počet</Th></Tr></Thead>\n <Tbody>\n {(statsData.referrers || []).map((r: any, i: number) => (\n <Tr key={i}><Td>{r.Referrer || '-'}</Td><Td isNumeric>{r.Count}</Td></Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n <Box>\n <Text fontWeight=\"semibold\" mb={1}>UTM kombinace (Top)</Text>\n <Table size=\"sm\" variant=\"simple\">\n <Thead><Tr><Th>Source</Th><Th>Medium</Th><Th>Campaign</Th><Th isNumeric>Počet</Th></Tr></Thead>\n <Tbody>\n {(statsData.utms || []).map((r: any, i: number) => (\n <Tr key={i}><Td>{r.Source || '-'}</Td><Td>{r.Medium || '-'}</Td><Td>{r.Campaign || '-'}</Td><Td isNumeric>{r.Count}</Td></Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n </VStack>\n )}\n </ModalBody>\n <ModalFooter>\n <Button onClick={statsModal.onClose}>Zavřít</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n )}\n </Box>\n </AdminLayout>\n );\n};\n\nexport default ShortlinksAdminPage;\n","import { Box, Text, VStack, HStack, Image, Skeleton, Link as ChakraLink, Icon } from '@chakra-ui/react';\nimport { FaNewspaper, FaUser, FaCalendarAlt } from 'react-icons/fa';\nimport { Link as RouterLink } from 'react-router-dom';\nimport { useQuery } from '@tanstack/react-query';\nimport { api } from '../../services/api';\nimport { Widget } from './Widget';\nimport { format, parseISO } from 'date-fns';\nimport { cs } from 'date-fns/locale';\nimport { Article } from '../../services/articles';\n\nexport const ArticlesWidget = () => {\n const { data: articles = [], isLoading, error } = useQuery<Article[]>({\n queryKey: ['recentArticles'],\n queryFn: async () => {\n try {\n const { data } = await api.get('/articles', {\n params: {\n page: 1,\n page_size: 3,\n published: true\n }\n });\n // Backend returns { items, total, page, page_size }\n return data.items || [];\n } catch (err) {\n console.error('Error fetching articles:', err);\n return [];\n }\n },\n staleTime: 5 * 60 * 1000, // 5 minutes\n });\n\n if (isLoading) {\n return (\n <Widget title=\"Poslední články\" icon={FaNewspaper}>\n <VStack spacing={4} align=\"stretch\">\n {[1, 2, 3].map((i) => (\n <Box key={i}>\n <Skeleton height=\"120px\" mb={2} borderRadius=\"md\" />\n <Skeleton height=\"20px\" mb={2} width=\"80%\" />\n <Skeleton height=\"16px\" width=\"60%\" />\n </Box>\n ))}\n </VStack>\n </Widget>\n );\n }\n\n if (error || !articles.length) {\n return (\n <Widget title=\"Poslední články\" icon={FaNewspaper}>\n <VStack p={4} spacing={4}>\n <Box p={4} bg=\"gray.50\" borderRadius=\"md\" textAlign=\"center\" w=\"full\">\n <Icon as={FaNewspaper} boxSize={6} color=\"gray.400\" mb={2} />\n <Text color=\"gray.500\">Žádné články nebyly nalezeny</Text>\n </Box>\n </VStack>\n </Widget>\n );\n }\n\n return (\n <Widget title=\"Poslední články\" icon={FaNewspaper}>\n <VStack spacing={3} align=\"stretch\" divider={<Box borderBottomWidth=\"1px\" borderColor=\"gray.100\" />}>\n {articles.map((article) => (\n <ChakraLink\n key={article.id}\n as={RouterLink}\n to={`/clanky/${article.slug}`}\n _hover={{ textDecoration: 'none' }}\n display=\"block\"\n >\n <Box _hover={{ bg: 'gray.50' }} borderRadius=\"md\" p={2}>\n <HStack align=\"flex-start\" spacing={3}>\n <Box\n flexShrink={0}\n width=\"60px\"\n height=\"60px\"\n bg=\"gray.100\"\n borderRadius=\"md\"\n overflow=\"hidden\"\n position=\"relative\"\n >\n {article.image_url ? (\n <Image\n src={article.image_url}\n alt={article.title}\n width=\"100%\"\n height=\"100%\"\n objectFit=\"cover\"\n />\n ) : (\n <Box\n width=\"100%\"\n height=\"100%\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n bg=\"gray.200\"\n >\n <Icon as={FaNewspaper} color=\"gray.400\" boxSize={5} />\n </Box>\n )}\n </Box>\n <Box flex={1} minW={0}>\n <Text fontWeight=\"medium\" fontSize=\"sm\" noOfLines={2} mb={1}>\n {article.title}\n </Text>\n <HStack spacing={3} fontSize=\"xs\" color=\"gray.500\">\n <HStack spacing={1}>\n <Icon as={FaUser} boxSize={3} />\n <Text>\n {article.author?.first_name && article.author?.last_name\n ? `${article.author.first_name} ${article.author.last_name}`\n : article.author?.email || 'Autor'}\n </Text>\n </HStack>\n <HStack spacing={1}>\n <Icon as={FaCalendarAlt} boxSize={3} />\n <Text>\n {article.created_at && format(parseISO(article.created_at), 'd. M. yyyy', {\n locale: cs,\n })}\n </Text>\n </HStack>\n </HStack>\n </Box>\n </HStack>\n </Box>\n </ChakraLink>\n ))}\n <Box textAlign=\"right\" mt={2}>\n <ChakraLink\n as={RouterLink}\n to=\"/admin/clanky\"\n color=\"blue.500\"\n fontWeight=\"medium\"\n fontSize=\"sm\"\n _hover={{ textDecoration: 'underline' }}\n >\n Zobrazit všechny články →\n </ChakraLink>\n </Box>\n </VStack>\n </Widget>\n );\n};\n","import { Box, Text, VStack, HStack, Avatar, Skeleton, Icon, Alert, AlertIcon } from '@chakra-ui/react';\nimport { FaUsers, FaFutbol } from 'react-icons/fa';\nimport { useQuery } from '@tanstack/react-query';\nimport { Widget } from './Widget';\nimport { getFacrTablesCache } from '../../services/facr/cache';\nimport { getPublicSettings, PublicSettings } from '../../services/settings';\n\nexport const TeamsWidget = () => {\n // Load settings for primary club name (for exclusion)\n const { data: settings, isLoading: settingsLoading } = useQuery<PublicSettings>({\n queryKey: ['public-settings'],\n queryFn: getPublicSettings as any,\n staleTime: 5 * 60 * 1000,\n });\n\n // Load FACR tables cache\n const { data: facrTables, isLoading, error } = useQuery<any>({\n queryKey: ['facr-tables-cache'],\n queryFn: getFacrTablesCache,\n staleTime: 5 * 60 * 1000,\n });\n\n const normalize = (s?: string) => {\n let out = String(s || '');\n // Normalize diacritics and case\n out = out\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase();\n // Unify various dash characters to a simple hyphen\n out = out.replace(/[\\u2012\\u2013\\u2014\\u2015\\u2212]/g, '-');\n // Remove legal suffixes like \", z.s.\" / \", z. s.\" / \" z.s.\" / \"o.s.\" at end\n out = out.replace(/[,\\s]*(z\\.?\\s*s\\.?|o\\.?\\s*s\\.?)\\s*$/g, '');\n // Remove organization phrases/prefixes anywhere (keep core locality/name)\n const orgPhrases = [\n 'fotbalovy klub',\n 'sportovni klub',\n 'telovychovna jednota',\n 'skolni sportovni klub',\n 'fotbal',\n 'futsal',\n ];\n for (const phrase of orgPhrases) {\n const re = new RegExp(`(^|\\\\b)${phrase}(\\\\b|$)`, 'g');\n out = out.replace(re, ' ');\n }\n // Remove common short prefixes (tokens) like FC, FK, MFK, TJ, SK, SFC, AFK at word boundaries\n out = out.replace(/\\b(1\\.)?\\s*(sfc|afc|fc|fk|mfk|tj|sk|afk)\\b\\.?/g, ' ');\n // Remove punctuation except hyphen\n out = out.replace(/[\\.,!;:()\\[\\]{}]/g, ' ');\n // Collapse multiple spaces and trim\n out = out.replace(/\\s+/g, ' ').trim();\n return out;\n };\n\n const primaryKey = normalize((settings as any)?.club_name);\n const teams = (() => {\n const map: Record<string, { id: string; name: string; logoUrl?: string }> = {};\n const comps = Array.isArray(facrTables?.competitions) ? facrTables.competitions : [];\n for (const c of comps) {\n const rows = Array.isArray(c?.table?.overall) ? c.table.overall : [];\n for (const r of rows) {\n const name = (r?.team || '').trim();\n if (!name) continue;\n const key = normalize(name);\n if (key && key === primaryKey) continue; // exclude primary club from listing\n if (!map[key]) {\n map[key] = { id: key, name, logoUrl: r?.team_logo_url };\n }\n }\n }\n return Object.values(map).slice(0, 8); // show up to 8\n })();\n\n // If application settings are still loading, show skeletons\n if (settingsLoading || isLoading) {\n return (\n <Widget title=\"Týmy klubu\" icon={FaUsers}>\n <VStack spacing={3} align=\"stretch\">\n {[1, 2, 3].map((i) => (\n <HStack key={i} p={2} spacing={3}>\n <Skeleton boxSize=\"40px\" borderRadius=\"md\" />\n <Box flex={1}>\n <Skeleton height=\"16px\" width=\"80%\" mb={1} />\n <Skeleton height=\"12px\" width=\"60%\" />\n </Box>\n </HStack>\n ))}\n </VStack>\n </Widget>\n );\n }\n\n if (error) {\n return (\n <Widget title=\"Týmy klubu\" icon={FaUsers}>\n <Alert status=\"info\" variant=\"left-accent\">\n <AlertIcon />\n Nepodařilo se načíst seznam týmů z cache.\n </Alert>\n </Widget>\n );\n }\n\n if (teams.length === 0) {\n return (\n <Widget title=\"Týmy klubu\" icon={FaUsers}>\n <VStack p={4} spacing={4}>\n <Box p={4} bg=\"gray.50\" borderRadius=\"md\" textAlign=\"center\" w=\"full\">\n <Icon as={FaFutbol} boxSize={6} color=\"gray.400\" mb={2} />\n <Text color=\"gray.500\">Žádné týmy nebyly nalezeny</Text>\n </Box>\n </VStack>\n </Widget>\n );\n }\n\n return (\n <Widget title=\"Týmy klubu\" icon={FaUsers}>\n <VStack spacing={3} align=\"stretch\" divider={<Box borderBottomWidth=\"1px\" borderColor=\"gray.100\" />}>\n {teams.map((team) => (\n <Box\n key={team.id}\n p={3}\n _hover={{ bg: 'gray.50', cursor: 'pointer' }}\n borderRadius=\"md\"\n >\n <HStack spacing={3}>\n <Avatar\n name={team.name}\n src={team.logoUrl}\n size=\"sm\"\n bg=\"blue.100\"\n color=\"blue.700\"\n icon={<FaFutbol />}\n />\n <Box flex={1} minW={0}>\n <Text fontWeight=\"medium\" isTruncated>{team.name}</Text>\n </Box>\n </HStack>\n </Box>\n ))}\n </VStack>\n </Widget>\n );\n};\n","import { Box, Text, HStack, VStack, Icon, Skeleton, Badge, useColorModeValue, Tooltip, Progress, Divider, Heading, SimpleGrid } from '@chakra-ui/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { FaCloud, FaCloudSun, FaSun, FaCloudRain, FaSnowflake, FaWind, FaTint, FaEye, FaThermometerHalf, FaMapMarkerAlt, FaSyncAlt, FaMoon } from 'react-icons/fa';\nimport api from '../../services/api';\n\ninterface WeatherData {\n location: {\n name: string;\n region: string;\n country: string;\n lat: number;\n lon: number;\n tz_id: string;\n localtime: string;\n };\n current: {\n last_updated: string;\n temp_c: number;\n temp_f: number;\n is_day: number;\n condition: {\n text: string;\n icon: string;\n code: number;\n };\n wind_mph: number;\n wind_kph: number;\n wind_degree: number;\n wind_dir: string;\n pressure_mb: number;\n pressure_in: number;\n precip_mm: number;\n precip_in: number;\n humidity: number;\n cloud: number;\n feelslike_c: number;\n feelslike_f: number;\n vis_km: number;\n vis_miles: number;\n uv: number;\n gust_mph: number;\n gust_kph: number;\n };\n forecast: {\n forecastday: Array<{\n date: string;\n date_epoch: number;\n day: {\n maxtemp_c: number;\n maxtemp_f: number;\n mintemp_c: number;\n mintemp_f: number;\n avgtemp_c: number;\n avgtemp_f: number;\n maxwind_mph: number;\n maxwind_kph: number;\n totalprecip_mm: number;\n totalprecip_in: number;\n totalsnow_cm: number;\n avgvis_km: number;\n avgvis_miles: number;\n avghumidity: number;\n daily_will_it_rain: number;\n daily_chance_of_rain: number;\n daily_will_it_snow: number;\n daily_chance_of_snow: number;\n condition: {\n text: string;\n icon: string;\n code: number;\n };\n uv: number;\n };\n astro: {\n sunrise: string;\n sunset: string;\n moonrise: string;\n moonset: string;\n moon_phase: string;\n moon_illumination: string;\n is_moon_up: number;\n is_sun_up: number;\n };\n hour: Array<{\n time_epoch: number;\n time: string;\n temp_c: number;\n temp_f: number;\n is_day: number;\n condition: {\n text: string;\n icon: string;\n code: number;\n };\n wind_mph: number;\n wind_kph: number;\n wind_degree: number;\n wind_dir: string;\n pressure_mb: number;\n pressure_in: number;\n precip_mm: number;\n precip_in: number;\n humidity: number;\n cloud: number;\n feelslike_c: number;\n feelslike_f: number;\n windchill_c: number;\n windchill_f: number;\n heatindex_c: number;\n heatindex_f: number;\n dewpoint_c: number;\n dewpoint_f: number;\n will_it_rain: number;\n chance_of_rain: number;\n will_it_snow: number;\n chance_of_snow: number;\n vis_km: number;\n vis_miles: number;\n gust_mph: number;\n gust_kph: number;\n uv: number;\n }>;\n }>;\n };\n}\n\nconst getWeatherIcon = (condition: string, isDay: number) => {\n const lowerCondition = condition.toLowerCase();\n \n if (lowerCondition.includes('sunny') || lowerCondition.includes('clear')) {\n return isDay ? FaSun : FaMoon;\n }\n if (lowerCondition.includes('partly cloudy') || lowerCondition.includes('partly sunny')) {\n return FaCloudSun;\n }\n if (lowerCondition.includes('cloudy') || lowerCondition.includes('overcast')) {\n return FaCloud;\n }\n if (lowerCondition.includes('rain') || lowerCondition.includes('drizzle') || lowerCondition.includes('shower')) {\n return FaCloudRain;\n }\n if (lowerCondition.includes('snow') || lowerCondition.includes('sleet') || lowerCondition.includes('blizzard')) {\n return FaSnowflake;\n }\n \n return FaCloud;\n};\n\nconst getUVColor = (uv: number) => {\n if (uv <= 2) return 'green';\n if (uv <= 5) return 'yellow';\n if (uv <= 7) return 'orange';\n if (uv <= 10) return 'red';\n return 'purple';\n};\n\nconst getUVLabel = (uv: number) => {\n if (uv <= 2) return 'Nízké';\n if (uv <= 5) return 'Střední';\n if (uv <= 7) return 'Vysoké';\n if (uv <= 10) return 'Velmi vysoké';\n return 'Extrémní';\n};\n\nconst getWindDirection = (degree: number) => {\n const directions = ['S', 'SV', 'V', 'JV', 'J', 'JZ', 'Z', 'SZ'];\n const index = Math.round(degree / 45) % 8;\n return directions[index];\n};\n\nconst WeatherWidget = () => {\n const { data: weather, isLoading, error, refetch } = useQuery<WeatherData>({\n queryKey: ['weather', 'club'],\n queryFn: async () => {\n const response = await api.get('/weather/club');\n return response.data;\n },\n staleTime: 10 * 60 * 1000, // 10 minutes\n refetchInterval: 15 * 60 * 1000, // 15 minutes\n });\n\n const bgCard = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const textColor = useColorModeValue('gray.600', 'gray.400');\n\n if (isLoading) {\n return (\n <Box\n bg={bgCard}\n p={6}\n borderRadius=\"xl\"\n boxShadow=\"md\"\n borderWidth=\"1px\"\n borderColor={borderColor}\n >\n <VStack spacing={4} align=\"stretch\">\n <Skeleton height=\"20px\" width=\"60%\" />\n <Skeleton height=\"40px\" width=\"80%\" />\n <Skeleton height=\"16px\" width=\"40%\" />\n <Skeleton height=\"16px\" width=\"50%\" />\n </VStack>\n </Box>\n );\n }\n\n if (error || !weather) {\n return (\n <Box\n bg={bgCard}\n p={6}\n borderRadius=\"xl\"\n boxShadow=\"md\"\n borderWidth=\"1px\"\n borderColor={borderColor}\n >\n <VStack spacing={4} align=\"center\">\n <Icon as={FaCloud} boxSize={12} color=\"gray.400\" />\n <Text color=\"gray.500\" textAlign=\"center\">\n Počasí není dostupné\n </Text>\n <Text fontSize=\"sm\" color=\"gray.400\" textAlign=\"center\">\n Zkuste to znovu později\n </Text>\n </VStack>\n </Box>\n );\n }\n\n const currentIcon = getWeatherIcon(weather.current.condition.text, weather.current.is_day);\n const uvColor = getUVColor(weather.current.uv);\n const uvLabel = getUVLabel(weather.current.uv);\n\n return (\n <Box\n bg={bgCard}\n p={6}\n borderRadius=\"xl\"\n boxShadow=\"md\"\n borderWidth=\"1px\"\n borderColor={borderColor}\n position=\"relative\"\n overflow=\"hidden\"\n >\n {/* Refresh button */}\n <Box position=\"absolute\" top={4} right={4}>\n <Tooltip label=\"Obnovit počasí\">\n <Box\n as=\"button\"\n onClick={() => refetch()}\n p={2}\n borderRadius=\"md\"\n _hover={{ bg: useColorModeValue('gray.100', 'gray.700') }}\n transition=\"all 0.2s\"\n >\n <Icon as={FaSyncAlt} color={textColor} boxSize={4} />\n </Box>\n </Tooltip>\n </Box>\n\n <VStack spacing={4} align=\"stretch\">\n {/* Location */}\n <HStack spacing={2} color={textColor}>\n <Icon as={FaMapMarkerAlt} boxSize={3} />\n <Text fontSize=\"sm\" fontWeight=\"medium\">\n {weather.location.name}\n {weather.location.region && `, ${weather.location.region}`}\n </Text>\n </HStack>\n\n {/* Current Weather */}\n <HStack spacing={4} align=\"center\">\n <VStack spacing={1} align=\"center\" minW=\"80px\">\n <Icon as={currentIcon} boxSize={12} color=\"blue.400\" />\n <Text fontSize=\"sm\" color={textColor} textAlign=\"center\">\n {weather.current.condition.text}\n </Text>\n </VStack>\n \n <VStack spacing={1} align=\"start\" flex={1}>\n <Text fontSize=\"4xl\" fontWeight=\"bold\" lineHeight=\"1\">\n {Math.round(weather.current.temp_c)}°C\n </Text>\n <Text fontSize=\"sm\" color={textColor}>\n Pocitově {Math.round(weather.current.feelslike_c)}°C\n </Text>\n </VStack>\n </HStack>\n\n <Divider />\n\n {/* Weather Details Grid */}\n <SimpleGrid columns={2} spacing={3}>\n <HStack spacing={2}>\n <Icon as={FaWind} boxSize={4} color={textColor} />\n <VStack spacing={0} align=\"start\">\n <Text fontSize=\"xs\" color={textColor}>Vítr</Text>\n <Text fontSize=\"sm\" fontWeight=\"medium\">\n {weather.current.wind_kph} km/h {getWindDirection(weather.current.wind_degree)}\n </Text>\n </VStack>\n </HStack>\n\n <HStack spacing={2}>\n <Icon as={FaTint} boxSize={4} color={textColor} />\n <VStack spacing={0} align=\"start\">\n <Text fontSize=\"xs\" color={textColor}>Vlhkost</Text>\n <Text fontSize=\"sm\" fontWeight=\"medium\">{weather.current.humidity}%</Text>\n </VStack>\n </HStack>\n\n <HStack spacing={2}>\n <Icon as={FaEye} boxSize={4} color={textColor} />\n <VStack spacing={0} align=\"start\">\n <Text fontSize=\"xs\" color={textColor}>Viditelnost</Text>\n <Text fontSize=\"sm\" fontWeight=\"medium\">{weather.current.vis_km} km</Text>\n </VStack>\n </HStack>\n\n <HStack spacing={2}>\n <Icon as={FaThermometerHalf} boxSize={4} color={textColor} />\n <VStack spacing={0} align=\"start\">\n <Text fontSize=\"xs\" color={textColor}>Tlak</Text>\n <Text fontSize=\"sm\" fontWeight=\"medium\">{weather.current.pressure_mb} hPa</Text>\n </VStack>\n </HStack>\n </SimpleGrid>\n\n {/* UV Index */}\n <Box>\n <HStack justify=\"space-between\" mb={1}>\n <Text fontSize=\"xs\" color={textColor}>UV Index</Text>\n <Badge colorScheme={uvColor} fontSize=\"xs\">\n {uvLabel} ({weather.current.uv})\n </Badge>\n </HStack>\n <Progress \n value={Math.min(weather.current.uv * 10, 100)} \n size=\"xs\" \n colorScheme={uvColor}\n borderRadius=\"md\"\n />\n </Box>\n\n {/* Forecast for next 2 days */}\n {weather.forecast.forecastday.length > 1 && (\n <>\n <Divider />\n <Text fontSize=\"sm\" fontWeight=\"bold\" mb={2}>\n Předpověď na následující dny\n </Text>\n <SimpleGrid columns={2} spacing={3}>\n {weather.forecast.forecastday.slice(1, 3).map((day, index) => {\n const dayIcon = getWeatherIcon(day.day.condition.text, 1);\n const date = new Date(day.date);\n const dayName = date.toLocaleDateString('cs-CZ', { weekday: 'short' });\n \n return (\n <Box\n key={index}\n p={3}\n bg={useColorModeValue('gray.50', 'gray.700')}\n borderRadius=\"md\"\n border=\"1px solid\"\n borderColor={useColorModeValue('gray.200', 'gray.600')}\n >\n <HStack spacing={3} align=\"center\">\n <Icon as={dayIcon} boxSize={6} color=\"blue.400\" />\n <VStack spacing={1} align=\"start\" flex={1}>\n <Text fontSize=\"xs\" fontWeight=\"medium\">{dayName}</Text>\n <HStack spacing={2}>\n <Text fontSize=\"sm\" fontWeight=\"bold\">\n {Math.round(day.day.maxtemp_c)}°\n </Text>\n <Text fontSize=\"sm\" color={textColor}>\n {Math.round(day.day.mintemp_c)}°\n </Text>\n </HStack>\n {day.day.daily_chance_of_rain > 0 && (\n <Badge size=\"xs\" colorScheme=\"blue\">\n {day.day.daily_chance_of_rain}% déšť\n </Badge>\n )}\n </VStack>\n </HStack>\n </Box>\n );\n })}\n </SimpleGrid>\n </>\n )}\n\n {/* Last updated */}\n <Text fontSize=\"xs\" color={textColor} textAlign=\"center\">\n Aktualizováno: {new Date(weather.current.last_updated).toLocaleTimeString('cs-CZ', {\n hour: '2-digit',\n minute: '2-digit'\n })}\n </Text>\n </VStack>\n </Box>\n );\n};\n\nexport default WeatherWidget;\n","import { Box, Text, Link, Alert, AlertIcon } from '@chakra-ui/react';\n\nconst AdminHelp: React.FC = () => {\n return (\n <Box mt={6}>\n <Alert status=\"info\" borderRadius=\"md\">\n <AlertIcon />\n <Text>\n Pro kompletní dokumentaci navštivte{' '}\n <Link href=\"/docs\" color=\"blue.600\" fontWeight=\"semibold\" textDecoration=\"underline\">\n dokumentaci administrace\n </Link>\n </Text>\n </Alert>\n </Box>\n );\n};\n\nexport default AdminHelp;\n","import { Box, Text, SimpleGrid, Stat, StatLabel, StatNumber, StatHelpText, Icon, HStack, Skeleton, Alert, AlertIcon, AlertTitle, AlertDescription, Button, Link, VStack, Badge, Heading, useColorModeValue, Divider, Table, Thead, Tbody, Tr, Th, Td, Tooltip } from '@chakra-ui/react';\nimport { useQuery } from '@tanstack/react-query';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport { getAnalytics, AnalyticsData, getAnalyticsOverview, getTopPages, AnalyticsOverview, PageStats } from '../../services/analyticsService';\nimport { MatchesWidget } from '../../components/widgets/MatchesWidget';\nimport { ArticlesWidget } from '../../components/widgets/ArticlesWidget';\nimport { TeamsWidget } from '../../components/widgets/TeamsWidget';\nimport WeatherWidget from '../../components/admin/WeatherWidget';\nimport { FaUsers, FaCalendarAlt, FaNewspaper, FaChartLine, FaCog, FaBook, FaRocket, FaEye, FaMousePointer, FaVideo, FaImages } from 'react-icons/fa';\nimport AdminHelp from '../../components/admin/AdminHelp';\nimport { getFacrTablesCache } from '../../services/facr/cache';\nimport { Link as RouterLink } from 'react-router-dom';\nimport api from '../../services/api';\nimport { useAuth } from '../../contexts/AuthContext';\n\nconst StatCard = ({ label, value, help, icon, color = 'blue' }: { label: string; value: number | string; help?: string; icon?: any; color?: string }) => {\n const bgCard = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const iconBg = useColorModeValue(`${color}.50`, `${color}.900`);\n const iconColor = useColorModeValue(`${color}.600`, `${color}.300`);\n \n return (\n <Box \n bg={bgCard} \n p={6} \n borderRadius=\"xl\" \n boxShadow=\"md\" \n borderWidth=\"1px\"\n borderColor={borderColor}\n _hover={{ shadow: 'lg', transform: 'translateY(-2px)' }}\n transition=\"all 0.2s\"\n >\n <HStack justify=\"space-between\" align=\"start\" mb={3}>\n <Stat>\n <StatLabel fontSize=\"sm\" fontWeight=\"medium\" color=\"gray.500\">{label}</StatLabel>\n <StatNumber fontSize=\"3xl\" fontWeight=\"bold\" mt={2}>{value}</StatNumber>\n {help && <StatHelpText fontSize=\"xs\" mt={1}>{help}</StatHelpText>}\n </Stat>\n {icon && (\n <Box p={3} bg={iconBg} borderRadius=\"xl\">\n <Icon as={icon} boxSize={6} color={iconColor} />\n </Box>\n )}\n </HStack>\n </Box>\n );\n};\n\n// Event translation and description mapping\nconst getEventTranslation = (eventName: string): { name: string; source: string; description: string } => {\n const eventMap: Record<string, { name: string; source: string; description: string }> = {\n 'Contact Form Submit': {\n name: 'Odeslání kontaktního formuláře',\n source: 'Kontaktní stránka',\n description: 'Uživatel odeslal kontaktní formulář na stránce Kontakt'\n },\n 'Contact Form': {\n name: 'Zobrazení kontaktního formuláře',\n source: 'Kontaktní stránka',\n description: 'Uživatel zobrazil kontaktní formulář'\n },\n 'Form Submit': {\n name: 'Odeslání formuláře',\n source: 'Různé stránky',\n description: 'Obecné odeslání formuláře na webu'\n },\n 'Newsletter Subscribe': {\n name: 'Odběr newsletteru',\n source: 'Newsletter formulář',\n description: 'Uživatel se přihlásil k odběru newsletteru'\n },\n 'Newsletter Submit': {\n name: 'Potvrzení newsletteru',\n source: 'Newsletter formulář',\n description: 'Uživatel potvrdil přihlášení k newsletteru'\n },\n 'Newsletter Unsubscribe': {\n name: 'Odhlášení z newsletteru',\n source: 'Nastavení newsletteru',\n description: 'Uživatel se odhlásil z odběru newsletteru'\n },\n 'Newsletter Preferences Saved': {\n name: 'Uložení předvoleb newsletteru',\n source: 'Nastavení newsletteru',\n description: 'Uživatel uložil své předvolby pro newsletter'\n },\n 'Unsubscribe': {\n name: 'Odhlášení z odběru',\n source: 'Nastavení',\n description: 'Uživatel se odhlásil z odběru'\n },\n 'Save Preferences': {\n name: 'Uložení předvoleb',\n source: 'Nastavení',\n description: 'Uživatel uložil své předvolby (souhlas s cookies apod.)'\n },\n 'Refresh Preferences': {\n name: 'Obnovení předvoleb',\n source: 'Nastavení',\n description: 'Uživatel obnovil nebo změnil své předvolby'\n },\n 'Article View': {\n name: 'Zobrazení článku',\n source: 'Blog',\n description: 'Uživatel si zobrazil článek na blogu'\n },\n 'Match View': {\n name: 'Zobrazení zápasu',\n source: 'Stránka zápasů',\n description: 'Uživatel si zobrazil detail zápasu'\n },\n 'Gallery View': {\n name: 'Zobrazení galerie',\n source: 'Galerie',\n description: 'Uživatel si otevřel galerii fotografií'\n },\n 'Video Play': {\n name: 'Přehrání videa',\n source: 'Video sekce',\n description: 'Uživatel spustil přehrávání videa'\n },\n 'Social Share': {\n name: 'Sdílení na sociálních sítích',\n source: 'Sdílecí tlačítka',\n description: 'Uživatel sdílel obsah na sociální síť'\n },\n 'Download': {\n name: 'Stažení souboru',\n source: 'Různé stránky',\n description: 'Uživatel stáhl soubor'\n },\n 'External Link Click': {\n name: 'Kliknutí na externí odkaz',\n source: 'Různé stránky',\n description: 'Uživatel klikl na odkaz vedoucí mimo web'\n },\n 'Button Click': {\n name: 'Kliknutí na tlačítko',\n source: 'Různé stránky',\n description: 'Uživatel klikl na tlačítko'\n },\n 'Navigation': {\n name: 'Navigace',\n source: 'Menu / odkazy',\n description: 'Uživatel přešel na jinou stránku'\n },\n 'Search': {\n name: 'Vyhledávání',\n source: 'Vyhledávání',\n description: 'Uživatel vyhledával na webu'\n },\n 'Email Open': {\n name: 'Otevření emailu',\n source: 'Email',\n description: 'Příjemce otevřel email'\n },\n 'Email Click': {\n name: 'Kliknutí v emailu',\n source: 'Email',\n description: 'Příjemce klikl na odkaz v emailu'\n },\n 'Email Spam': {\n name: 'Označeno jako spam',\n source: 'Email',\n description: 'Příjemce označil zprávu jako spam'\n },\n 'Email Unsubscribe': {\n name: 'Odhlášení z emailu',\n source: 'Email',\n description: 'Příjemce se odhlásil z odběru'\n },\n 'ShortLink Click': {\n name: 'Kliknutí na zkrácený odkaz',\n source: 'Zkrácené odkazy',\n description: 'Uživatel klikl na zkrácený odkaz'\n },\n 'Link Redirect': {\n name: 'Přesměrování odkazu',\n source: 'Sledování odkazů',\n description: 'Zaznamenané přesměrování sledovaného odkazu'\n }\n };\n\n return eventMap[eventName] || {\n name: eventName,\n source: 'Neznámý zdroj',\n description: `Událost: ${eventName}`\n };\n};\n\nconst AdminDashboardPage = () => {\n const { user } = useAuth();\n const role = String((user as any)?.role || '').toLowerCase();\n const isEditor = role === 'editor';\n\tconst isAdmin = role === 'admin';\n\n const { data, isLoading, error, refetch, isFetching } = useQuery<AnalyticsData>({\n queryKey: ['admin', 'analytics'],\n queryFn: getAnalytics,\n staleTime: 5 * 60 * 1000,\n });\n\n // Fetch analytics overview (page views, visitors, etc.)\n const { data: analyticsOverview, isLoading: isLoadingOverview } = useQuery<AnalyticsOverview>({\n queryKey: ['admin', 'analytics', 'overview'],\n queryFn: getAnalyticsOverview,\n staleTime: 5 * 60 * 1000,\n });\n\n // Fetch top pages\n const { data: topPages } = useQuery<PageStats[]>({\n queryKey: ['admin', 'analytics', 'top-pages'],\n queryFn: () => getTopPages(5),\n staleTime: 10 * 60 * 1000,\n });\n\n // Fetch top events (adblock-safe alias)\n const { data: topEvents } = useQuery<Array<{ x: string; y: number }>>({\n queryKey: ['admin', 'analytics', 'umami-events'],\n queryFn: async () => {\n const response = await api.get('/admin/insights/breakdown/event?days=7');\n return response.data || [];\n },\n staleTime: 10 * 60 * 1000,\n });\n\n // Club stats from FACR tables cache\n const { data: facrTables } = useQuery<any>({\n queryKey: ['facr-tables-cache'],\n queryFn: getFacrTablesCache,\n staleTime: 5 * 60 * 1000,\n });\n\n const competitionsCount = Array.isArray(facrTables?.competitions) ? facrTables.competitions.length : 0;\n const uniqueTeamsCount = (() => {\n try {\n const comps = Array.isArray(facrTables?.competitions) ? facrTables.competitions : [];\n const set = new Set<string>();\n for (const c of comps) {\n const rows = Array.isArray(c?.table?.overall) ? c.table.overall : [];\n for (const r of rows) {\n const name = String(r?.team || '').normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').replace(/\\s+/g, ' ').trim().toLowerCase();\n if (name) set.add(name);\n }\n }\n return set.size;\n } catch {\n return 0;\n }\n })();\n \n const quickActions = isEditor\n ? [\n { label: 'Nový článek', icon: FaNewspaper, to: '/admin/clanky', color: 'green' },\n { label: 'Nová aktivita', icon: FaCalendarAlt, to: '/admin/aktivity', color: 'teal' },\n { label: 'Videa', icon: FaVideo, to: '/admin/videa', color: 'purple' },\n { label: 'Galerie', icon: FaImages, to: '/admin/galerie', color: 'pink' },\n ]\n : [\n { label: 'Nastavení', icon: FaCog, to: '/admin/nastaveni', color: 'blue' },\n { label: 'Dokumentace', icon: FaBook, to: '/admin/docs', color: 'purple' },\n { label: 'Nový článek', icon: FaRocket, to: '/admin/clanky', color: 'green' },\n { label: 'Prefetch', icon: FaChartLine, to: '/admin/prefetch', color: 'orange' },\n ];\n\n\n return (\n <AdminLayout requireAdmin={false}>\n <Box maxW=\"1600px\" mx=\"auto\">\n {/* Welcome Header */}\n <Box mb={8}>\n <HStack spacing={3} mb={2}>\n <Text fontSize=\"3xl\">👋</Text>\n <Heading size=\"xl\">Vítejte v administraci</Heading>\n </HStack>\n <Text color=\"gray.500\" fontSize=\"lg\">\n Přehled klíčových statistik a rychlý přístup k nejdůležitějším funkcím\n </Text>\n </Box>\n\n {!!error && (\n <Alert status=\"error\" mb={4} borderRadius=\"md\">\n <AlertIcon />\n <Box>\n <AlertTitle>Nelze načíst statistiky</AlertTitle>\n <AlertDescription>\n Zkontrolujte připojení nebo přihlášení správce a zkuste to znovu.\n </AlertDescription>\n </Box>\n <Button onClick={() => refetch()} ml=\"auto\" size=\"sm\" isLoading={isFetching}>\n Zkusit znovu\n </Button>\n </Alert>\n )}\n\n {/* Top stats */}\n <SimpleGrid columns={{ base: 1, sm: 2, lg: 3 }} spacing={4} mb={6}>\n {isLoading ? (\n <>\n {[1,2,3].map((i) => (\n <Box key={i} bg=\"white\" p={4} borderRadius=\"lg\" boxShadow=\"sm\" borderWidth=\"1px\">\n <Skeleton height=\"20px\" width=\"40%\" mb={2} />\n <Skeleton height=\"28px\" width=\"50%\" mb={2} />\n <Skeleton height=\"16px\" width=\"35%\" />\n </Box>\n ))}\n </>\n ) : (\n <>\n <StatCard\n label=\"Uživatelé (admin)\"\n value={data?.users?.total ?? '—'}\n help={data?.users ? `Nových tento týden: ${data.users.new_this_week ?? 0}` : undefined}\n icon={FaUsers}\n color=\"blue\"\n />\n <StatCard\n label=\"Události\"\n value={data?.events?.total ?? '—'}\n help={data?.events ? `Nadcházející: ${data.events.upcoming ?? 0}` : undefined}\n icon={FaCalendarAlt}\n color=\"green\"\n />\n <StatCard\n label=\"Články\"\n value={data?.articles?.total ?? '—'}\n help={data?.articles ? `Publikovaných: ${data.articles.published ?? 0}` : undefined}\n icon={FaNewspaper}\n color=\"purple\"\n />\n <StatCard\n label=\"Zobrazení stránek\"\n value={analyticsOverview?.total_page_views?.toLocaleString('cs-CZ') ?? '—'}\n help={analyticsOverview ? `Dnes: ${analyticsOverview.page_views_today ?? 0}` : undefined}\n icon={FaEye}\n color=\"cyan\"\n />\n <StatCard\n label=\"Unikátní návštěvníci\"\n value={analyticsOverview?.unique_visitors?.toLocaleString('cs-CZ') ?? '—'}\n help={analyticsOverview ? `Tento týden: ${analyticsOverview.unique_visitors_week ?? 0}` : undefined}\n icon={FaChartLine}\n color=\"teal\"\n />\n <StatCard\n label=\"Zobrazení (týden)\"\n value={analyticsOverview?.page_views_week?.toLocaleString('cs-CZ') ?? '—'}\n help=\"Za posledních 7 dní\"\n icon={FaMousePointer}\n color=\"orange\"\n />\n </>\n )}\n </SimpleGrid>\n\n {/* Quick Actions */}\n <Box mb={8}>\n <Heading size=\"md\" mb={4}>Rychlé akce</Heading>\n <SimpleGrid columns={{ base: 2, md: 4 }} spacing={4}>\n {quickActions.map((action, idx) => (\n <Link \n key={idx} \n as={RouterLink} \n to={action.to}\n _hover={{ textDecoration: 'none' }}\n >\n <Box\n bg={useColorModeValue('white', 'gray.800')}\n p={4}\n borderRadius=\"lg\"\n borderWidth=\"1px\"\n borderColor={useColorModeValue('gray.200', 'gray.700')}\n textAlign=\"center\"\n cursor=\"pointer\"\n _hover={{ \n shadow: 'lg', \n transform: 'translateY(-2px)',\n borderColor: `${action.color}.400`\n }}\n transition=\"all 0.2s\"\n >\n <VStack spacing={2}>\n <Box \n p={3} \n bg={useColorModeValue(`${action.color}.50`, `${action.color}.900`)} \n borderRadius=\"lg\"\n >\n <Icon \n as={action.icon} \n boxSize={6} \n color={useColorModeValue(`${action.color}.600`, `${action.color}.300`)} \n />\n </Box>\n <Text fontWeight=\"semibold\" fontSize=\"sm\">{action.label}</Text>\n </VStack>\n </Box>\n </Link>\n ))}\n </SimpleGrid>\n </Box>\n\n <Divider my={8} />\n\n {!isEditor && (\n <>\n {/* Analytics Tables */}\n <Heading size=\"md\" mb={4}>Analytika návštěvnosti</Heading>\n <SimpleGrid columns={{ base: 1, lg: 2 }} spacing={6} mb={8}>\n {/* Top Pages */}\n <Box \n bg={useColorModeValue('white', 'gray.800')} \n p={5} \n borderRadius=\"xl\" \n boxShadow=\"md\" \n borderWidth=\"1px\"\n borderColor={useColorModeValue('gray.200', 'gray.700')}\n >\n <HStack justify=\"space-between\" mb={4}>\n <Text fontWeight=\"bold\" fontSize=\"lg\">Nejnavštěvovanější stránky</Text>\n <Link as={RouterLink} to=\"/admin/analytika\" color=\"blue.500\" fontSize=\"sm\" fontWeight=\"semibold\">\n Více →\n </Link>\n </HStack>\n {topPages && topPages.length > 0 ? (\n <Table size=\"sm\" variant=\"simple\">\n <Thead>\n <Tr>\n <Th>Stránka</Th>\n <Th isNumeric>Zobrazení</Th>\n <Th isNumeric>Návštěvníci</Th>\n </Tr>\n </Thead>\n <Tbody>\n {topPages.map((page, idx) => (\n <Tr key={idx}>\n <Td fontSize=\"sm\">\n <Text isTruncated maxW=\"200px\" title={page.page_name || page.page_path}>\n {page.page_name || page.page_path}\n </Text>\n </Td>\n <Td isNumeric fontWeight=\"semibold\">{page.view_count}</Td>\n <Td isNumeric>{page.unique_visitors}</Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n ) : (\n <Text color=\"gray.500\" fontSize=\"sm\">Zatím žádná data</Text>\n )}\n </Box>\n\n {/* Top User Events */}\n <Box \n bg={useColorModeValue('white', 'gray.800')} \n p={5} \n borderRadius=\"xl\" \n boxShadow=\"md\" \n borderWidth=\"1px\"\n borderColor={useColorModeValue('gray.200', 'gray.700')}\n >\n <HStack justify=\"space-between\" mb={4}>\n <Text fontWeight=\"bold\" fontSize=\"lg\">Nejčastější interakce</Text>\n <Badge colorScheme=\"blue\">7 dní</Badge>\n </HStack>\n {topEvents && topEvents.length > 0 ? (\n <Table size=\"sm\" variant=\"simple\">\n <Thead>\n <Tr>\n <Th>Akce</Th>\n <Th isNumeric>Počet</Th>\n </Tr>\n </Thead>\n <Tbody>\n {topEvents.slice(0, 10).map((event, idx) => {\n const eventName = event.x || '';\n const eventInfo = getEventTranslation(eventName);\n return (\n <Tr key={idx}>\n <Td fontSize=\"sm\">\n <Tooltip label={eventInfo.description} placement=\"top\" hasArrow>\n <Box>\n <Text fontWeight=\"medium\">{eventInfo.name}</Text>\n <Text fontSize=\"xs\" color=\"gray.500\">{eventInfo.source}</Text>\n </Box>\n </Tooltip>\n </Td>\n <Td isNumeric>\n <Badge colorScheme=\"blue\" fontWeight=\"semibold\">{event.y}</Badge>\n </Td>\n </Tr>\n );\n })}\n </Tbody>\n </Table>\n ) : (\n <Text color=\"gray.500\" fontSize=\"sm\">Zatím žádná data</Text>\n )}\n </Box>\n </SimpleGrid>\n\n <Divider my={8} />\n </>\n )}\n\n {/* Widgets grid */}\n <Heading size=\"md\" mb={4}>Přehled aktivit</Heading>\n <SimpleGrid columns={{ base: 1, md: 2, xl: 4 }} spacing={6} mb={8}>\n <WeatherWidget />\n <MatchesWidget />\n <ArticlesWidget />\n {isEditor && <TeamsWidget />}\n </SimpleGrid>\n\n {/* Admin guidance */}\n <AdminHelp />\n </Box>\n </AdminLayout>\n );\n};\n\nexport default AdminDashboardPage;\n","import { api } from '../../services/api';\n\nexport type SubscriberPreferences = {\n blogs?: boolean;\n matches?: boolean;\n events?: boolean;\n scores?: boolean;\n competitions?: string; // comma-separated list for now\n categories?: string; // legacy key used by backend filtering\n // allow future keys without strict typing issues\n [key: string]: boolean | string | number | null | string[] | undefined;\n};\n\ntype NormalizedPreferences = Record<string, boolean | string | number | null>;\n\nconst normalizePreferences = (preferences: SubscriberPreferences = {}): NormalizedPreferences => {\n const normalized: NormalizedPreferences = {};\n\n Object.entries(preferences).forEach(([key, raw]) => {\n if (raw === undefined) {\n return;\n }\n\n if (typeof raw === 'boolean' || typeof raw === 'number') {\n normalized[key] = raw;\n return;\n }\n\n if (typeof raw === 'string') {\n normalized[key] = raw.trim();\n return;\n }\n\n if (Array.isArray(raw)) {\n const joined = (raw as Array<unknown>)\n .map((item: unknown) => {\n if (typeof item === 'string') {\n return item.trim();\n }\n if (item === null || item === undefined) {\n return '';\n }\n return String(item);\n })\n .filter((item: string) => item !== '');\n normalized[key] = joined.join(', ');\n return;\n }\n\n if (raw === null) {\n normalized[key] = null;\n return;\n }\n\n try {\n normalized[key] = JSON.stringify(raw);\n } catch {\n normalized[key] = String(raw);\n }\n });\n\n const competitions = normalized['competitions'];\n if (typeof competitions === 'string' && !normalized['categories']) {\n normalized['categories'] = competitions;\n }\n\n return normalized;\n};\n\nexport type PreferencesResponse = {\n email: string;\n is_active: boolean;\n preferences: SubscriberPreferences;\n};\n\nexport async function getPreferences(token: string): Promise<PreferencesResponse> {\n const { data } = await api.get<PreferencesResponse>(`/newsletter/preferences`, {\n params: { token },\n });\n return data;\n}\n\nexport async function savePreferences(token: string, preferences: SubscriberPreferences): Promise<{ message: string }> {\n const normalized = normalizePreferences(preferences);\n if (typeof normalized.competitions === 'string' && !normalized.categories) {\n normalized.categories = normalized.competitions;\n }\n const { data } = await api.post<{ message: string }>(`/newsletter/preferences`, {\n token,\n preferences: normalized,\n });\n return data;\n}\n\nexport async function unsubscribeToken(token: string): Promise<{ message: string }> {\n const { data } = await api.post<{ message: string }>(`/newsletter/unsubscribe-token`, { token });\n return data;\n}\n\n// Fetch a short-lived newsletter preferences token for the currently authenticated user\nexport async function getMyNewsletterToken(): Promise<{ token: string }> {\n const { data } = await api.get<{ token: string }>(`/newsletter/token/me`);\n return data;\n}\n","// API configuration\nexport const API_BASE_URL = process.env.REACT_APP_API_BASE_URL || '';\n\n// App configuration\nexport const APP_NAME = 'Fotbal Club';\nexport const APP_DESCRIPTION = 'Oficiální web fotbalového klubu';\n\n// Feature flags\nexport const FEATURES = {\n ENABLE_REGISTRATION: process.env.REACT_APP_ENABLE_REGISTRATION !== 'false',\n ENABLE_NEWSLETTER: true,\n ENABLE_CONTACT_FORM: true,\n};\n\n// Default settings\nexport const DEFAULTS = {\n PAGE_SIZE: 10,\n DATE_FORMAT: 'dd. MM. yyyy',\n DATE_TIME_FORMAT: 'dd. MM. yyyy HH:mm',\n};\n\n// Local storage keys\nexport const STORAGE_KEYS = {\n AUTH_TOKEN: 'auth_token',\n USER_DATA: 'user_data',\n THEME_PREFERENCE: 'theme_preference',\n};\n","import axios from 'axios';\nimport { API_BASE_URL } from '../config';\n\nexport interface ContactFormData {\n name: string;\n email: string;\n subject: string;\n message: string;\n}\n\nexport const submitContactForm = async (data: ContactFormData) => {\n const response = await axios.post(`${API_BASE_URL}/api/v1/contact`, data);\n return response.data;\n};\n\nexport const subscribeToNewsletter = async (email: string) => {\n const response = await axios.post(`${API_BASE_URL}/api/v1/newsletter/subscribe`, { email });\n return response.data;\n};\n\nexport const unsubscribeFromNewsletter = async (email: string) => {\n const response = await axios.post(`${API_BASE_URL}/api/v1/newsletter/unsubscribe/${encodeURIComponent(email)}`);\n return response.data;\n};\n","import { useState, useEffect } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport { \n Box, \n Button, \n Container, \n Heading, \n Text, \n useToast,\n VStack,\n Spinner\n} from '@chakra-ui/react';\nimport { unsubscribeFromNewsletter } from '../services/contact';\nimport { trackEvent } from '../utils/umami';\n\nexport default function NewsletterUnsubscribePage() {\n const { email: encodedEmail } = useParams<{ email: string }>();\n const [isLoading, setIsLoading] = useState(true);\n const [isSuccess, setIsSuccess] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const toast = useToast();\n const navigate = useNavigate();\n\n useEffect(() => {\n const processUnsubscribe = async () => {\n if (!encodedEmail) {\n setError('Neplatný odhlašovací odkaz');\n setIsLoading(false);\n return;\n }\n\n try {\n const email = decodeURIComponent(encodedEmail);\n await unsubscribeFromNewsletter(email);\n setIsSuccess(true);\n \n // Track successful unsubscribe\n trackEvent('Newsletter Unsubscribe', { \n success: true,\n source: 'email_link' \n });\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Při odhlašování z newsletteru došlo k chybě';\n setError(errorMessage);\n toast({\n title: 'Chyba',\n description: errorMessage,\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n } finally {\n setIsLoading(false);\n }\n };\n\n processUnsubscribe();\n }, [encodedEmail, toast]);\n\n const handleBackToHome = () => {\n navigate('/');\n };\n\n if (isLoading) {\n return (\n <Container maxW=\"container.md\" py={10}>\n <VStack spacing={6} textAlign=\"center\">\n <Spinner size=\"xl\" />\n <Text>Zpracovávám vaši žádost o odhlášení...</Text>\n </VStack>\n </Container>\n );\n }\n\n if (error) {\n return (\n <Container maxW=\"container.md\" py={10}>\n <VStack spacing={6} textAlign=\"center\">\n <Heading as=\"h1\" size=\"xl\" color=\"red.500\">Chyba při odhlašování</Heading>\n <Text fontSize=\"lg\">{error}</Text>\n <Button colorScheme=\"blue\" onClick={handleBackToHome}>\n Zpět na úvodní stránku\n </Button>\n </VStack>\n </Container>\n );\n }\n\n if (isSuccess) {\n return (\n <Container maxW=\"container.md\" py={10}>\n <VStack spacing={6} textAlign=\"center\">\n <Box>\n <Heading as=\"h1\" size=\"xl\" color=\"green.500\" mb={4}>\n Byl jste úspěšně odhlášen\n </Heading>\n <Text fontSize=\"lg\">\n Je nám líto, že odcházíte. Vaše e-mailová adresa byla odebrána z našeho seznamu odběratelů.\n </Text>\n </Box>\n \n <Text color=\"gray.600\">\n Pokud jste se odhlásili omylem, můžete se znovu přihlásit k odběru na našich webových stránkách.\n </Text>\n \n <Button \n colorScheme=\"blue\" \n onClick={handleBackToHome}\n data-umami-event=\"Back to Home\"\n data-umami-event-from=\"unsubscribe\"\n >\n Zpět na úvodní stránku\n </Button>\n </VStack>\n </Container>\n );\n }\n\n return null;\n}\n","import { useState, useEffect } from 'react';\nimport { PageElementConfig, getPageElementConfigs } from '../services/pageElements';\n\nexport const usePageElementConfig = (pageType: string, elementName: string, defaultVariant: string = 'unified') => {\n const [variant, setVariant] = useState<string>(defaultVariant);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let active = true;\n\n const loadConfig = async () => {\n try {\n const configs = await getPageElementConfigs(pageType);\n if (active) {\n const config = configs.find(c => c.element_name === elementName);\n if (config) {\n setVariant(config.variant);\n }\n }\n } catch (error) {\n console.error(`Failed to load config for ${elementName}:`, error);\n } finally {\n if (active) {\n setLoading(false);\n }\n }\n };\n\n loadConfig();\n\n return () => {\n active = false;\n };\n }, [pageType, elementName, defaultVariant]);\n\n return { variant, loading };\n};\n\nexport const useAllPageElementConfigs = (pageType: string) => {\n const [configs, setConfigs] = useState<Record<string, string>>({});\n const [visibility, setVisibility] = useState<Record<string, boolean>>({});\n const [styles, setStyles] = useState<Record<string, Record<string, any>>>({});\n const [elementOrder, setElementOrder] = useState<string[]>([]);\n const [loading, setLoading] = useState(true);\n const [refreshKey, setRefreshKey] = useState<number>(0);\n\n useEffect(() => {\n let active = true;\n\n // Helper function to apply DOM order\n const applyDOMOrder = (order: string[]) => {\n // Check if MyUIbrix viewport wrapper is active\n const viewportWrapper = document.querySelector('.myuibrix-viewport-wrapper');\n const container = viewportWrapper || document.querySelector('.container');\n if (!container) return;\n \n const sections = Array.from(container.querySelectorAll('[data-element]')) as HTMLElement[];\n const elementMap = new Map<string, HTMLElement>();\n sections.forEach(section => {\n const elementName = section.getAttribute('data-element');\n if (elementName) {\n elementMap.set(elementName, section);\n }\n });\n \n order.forEach((elementName) => {\n const element = elementMap.get(elementName);\n if (element && element.parentElement === container) {\n container.appendChild(element);\n }\n });\n };\n\n // Helper: inject style properties for each element into a single <style> tag\n // This ensures style applying/previewing works even if components do not spread getStyles()\n // Uses ultra-high specificity to override any component CSS\n const updateInjectedStyleProps = (stylesMap: Record<string, Record<string, any>>) => {\n try {\n const styleId = 'myuibrix-style-props';\n let styleEl = document.getElementById(styleId) as HTMLStyleElement | null;\n if (!styleEl) {\n styleEl = document.createElement('style');\n styleEl.id = styleId;\n // Insert at end of head for maximum specificity\n document.head.appendChild(styleEl);\n }\n\n const cssBlocks: string[] = [];\n const addDecl = (decls: string[], prop: string, val: any, unit?: 'px' | '') => {\n if (val === undefined || val === null || val === '') return;\n const needsPx = unit === 'px';\n const v = typeof val === 'number' && needsPx ? `${val}px` : `${val}`;\n decls.push(`${prop}: ${v} !important;`);\n };\n const toKebab = (key: string) => key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n\n Object.entries(stylesMap || {}).forEach(([name, st]) => {\n if (!st || typeof st !== 'object') return;\n const decls: string[] = [];\n // Track known keys we handle explicitly so we can inject the rest generically\n const handled = new Set<string>();\n\n addDecl(decls, 'font-family', st.fontFamily);\n handled.add('fontFamily');\n addDecl(decls, 'font-size', st.fontSize, 'px');\n handled.add('fontSize');\n addDecl(decls, 'font-weight', st.fontWeight);\n handled.add('fontWeight');\n addDecl(decls, 'line-height', st.lineHeight);\n handled.add('lineHeight');\n addDecl(decls, 'letter-spacing', st.letterSpacing, 'px');\n handled.add('letterSpacing');\n addDecl(decls, 'text-transform', st.textTransform);\n handled.add('textTransform');\n addDecl(decls, 'color', st.color);\n handled.add('color');\n addDecl(decls, 'background-color', st.backgroundColor);\n handled.add('backgroundColor');\n addDecl(decls, 'padding-top', st.paddingTop, 'px');\n handled.add('paddingTop');\n addDecl(decls, 'padding-right', st.paddingRight, 'px');\n handled.add('paddingRight');\n addDecl(decls, 'padding-bottom', st.paddingBottom, 'px');\n handled.add('paddingBottom');\n addDecl(decls, 'padding-left', st.paddingLeft, 'px');\n handled.add('paddingLeft');\n addDecl(decls, 'margin-top', st.marginTop, 'px');\n handled.add('marginTop');\n addDecl(decls, 'margin-right', st.marginRight, 'px');\n handled.add('marginRight');\n addDecl(decls, 'margin-bottom', st.marginBottom, 'px');\n handled.add('marginBottom');\n addDecl(decls, 'margin-left', st.marginLeft, 'px');\n handled.add('marginLeft');\n // width/height may be numbers (px) or strings (%, auto, etc.)\n if (st.width !== undefined) addDecl(decls, 'width', st.width, typeof st.width === 'number' ? 'px' : '');\n handled.add('width');\n if (st.height !== undefined) addDecl(decls, 'height', st.height, typeof st.height === 'number' ? 'px' : '');\n handled.add('height');\n addDecl(decls, 'display', st.display);\n handled.add('display');\n addDecl(decls, 'grid-template-columns', st.gridTemplateColumns);\n handled.add('gridTemplateColumns');\n addDecl(decls, 'grid-template-rows', st.gridTemplateRows);\n handled.add('gridTemplateRows');\n addDecl(decls, 'grid-auto-flow', st.gridAutoFlow);\n handled.add('gridAutoFlow');\n addDecl(decls, 'grid-column-gap', st.gridColumnGap, 'px');\n handled.add('gridColumnGap');\n addDecl(decls, 'grid-row-gap', st.gridRowGap, 'px');\n handled.add('gridRowGap');\n addDecl(decls, 'align-items', st.alignItems);\n handled.add('alignItems');\n addDecl(decls, 'justify-items', st.justifyItems);\n handled.add('justifyItems');\n // Additional commonly used properties\n addDecl(decls, 'gap', st.gap, 'px');\n handled.add('gap');\n // Borders\n addDecl(decls, 'border', st.border);\n handled.add('border');\n if (st.borderTop !== undefined) addDecl(decls, 'border-top', st.borderTop);\n handled.add('borderTop');\n if (st.borderRight !== undefined) addDecl(decls, 'border-right', st.borderRight);\n handled.add('borderRight');\n if (st.borderBottom !== undefined) addDecl(decls, 'border-bottom', st.borderBottom);\n handled.add('borderBottom');\n if (st.borderLeft !== undefined) addDecl(decls, 'border-left', st.borderLeft);\n handled.add('borderLeft');\n if (st.borderRadius !== undefined) addDecl(decls, 'border-radius', st.borderRadius, typeof st.borderRadius === 'number' ? 'px' : '');\n handled.add('borderRadius');\n if (st.borderTopLeftRadius !== undefined) addDecl(decls, 'border-top-left-radius', st.borderTopLeftRadius, typeof st.borderTopLeftRadius === 'number' ? 'px' : '');\n handled.add('borderTopLeftRadius');\n if (st.borderTopRightRadius !== undefined) addDecl(decls, 'border-top-right-radius', st.borderTopRightRadius, typeof st.borderTopRightRadius === 'number' ? 'px' : '');\n handled.add('borderTopRightRadius');\n if (st.borderBottomLeftRadius !== undefined) addDecl(decls, 'border-bottom-left-radius', st.borderBottomLeftRadius, typeof st.borderBottomLeftRadius === 'number' ? 'px' : '');\n handled.add('borderBottomLeftRadius');\n if (st.borderBottomRightRadius !== undefined) addDecl(decls, 'border-bottom-right-radius', st.borderBottomRightRadius, typeof st.borderBottomRightRadius === 'number' ? 'px' : '');\n handled.add('borderBottomRightRadius');\n // Effects\n addDecl(decls, 'box-shadow', st.boxShadow);\n handled.add('boxShadow');\n addDecl(decls, 'opacity', st.opacity);\n handled.add('opacity');\n // Positioning\n addDecl(decls, 'position', st.position);\n handled.add('position');\n if (st.top !== undefined) addDecl(decls, 'top', st.top, typeof st.top === 'number' ? 'px' : '');\n handled.add('top');\n if (st.right !== undefined) addDecl(decls, 'right', st.right, typeof st.right === 'number' ? 'px' : '');\n handled.add('right');\n if (st.bottom !== undefined) addDecl(decls, 'bottom', st.bottom, typeof st.bottom === 'number' ? 'px' : '');\n handled.add('bottom');\n if (st.left !== undefined) addDecl(decls, 'left', st.left, typeof st.left === 'number' ? 'px' : '');\n handled.add('left');\n addDecl(decls, 'z-index', st.zIndex);\n handled.add('zIndex');\n // Overflow\n addDecl(decls, 'overflow', st.overflow);\n handled.add('overflow');\n addDecl(decls, 'overflow-x', st.overflowX);\n handled.add('overflowX');\n addDecl(decls, 'overflow-y', st.overflowY);\n handled.add('overflowY');\n // Alignment (flex/grid)\n addDecl(decls, 'justify-content', st.justifyContent);\n handled.add('justifyContent');\n addDecl(decls, 'align-content', st.alignContent);\n handled.add('alignContent');\n addDecl(decls, 'justify-self', st.justifySelf);\n handled.add('justifySelf');\n addDecl(decls, 'align-self', st.alignSelf);\n handled.add('alignSelf');\n addDecl(decls, 'place-items', st.placeItems);\n handled.add('placeItems');\n addDecl(decls, 'place-content', st.placeContent);\n handled.add('placeContent');\n addDecl(decls, 'place-self', st.placeSelf);\n handled.add('placeSelf');\n // Sizing constraints\n if (st.maxWidth !== undefined) addDecl(decls, 'max-width', st.maxWidth, typeof st.maxWidth === 'number' ? 'px' : '');\n handled.add('maxWidth');\n if (st.minWidth !== undefined) addDecl(decls, 'min-width', st.minWidth, typeof st.minWidth === 'number' ? 'px' : '');\n handled.add('minWidth');\n if (st.maxHeight !== undefined) addDecl(decls, 'max-height', st.maxHeight, typeof st.maxHeight === 'number' ? 'px' : '');\n handled.add('maxHeight');\n if (st.minHeight !== undefined) addDecl(decls, 'min-height', st.minHeight, typeof st.minHeight === 'number' ? 'px' : '');\n handled.add('minHeight');\n // Text alignment\n addDecl(decls, 'text-align', st.textAlign);\n handled.add('textAlign');\n\n // Generic fallback: inject any additional properties provided in styles\n Object.keys(st).forEach((k) => {\n if (k === 'customCSS') return;\n if (!handled.has(k)) {\n const val = (st as any)[k];\n if (val !== undefined && val !== null && val !== '') {\n addDecl(decls, toKebab(k), val);\n }\n }\n });\n\n if (decls.length > 0) {\n // Ultra-high specificity selector: body > .container [data-element=\"name\"]\n // This overrides most component CSS without needing to modify every component\n cssBlocks.push(`\nbody [data-element=\"${name}\"],\n.container [data-element=\"${name}\"],\n[data-element=\"${name}\"].chakra-box,\n[data-element=\"${name}\"].section,\n[data-element=\"${name}\"] {\n ${decls.join('\\n ')}\n}`);\n }\n });\n\n styleEl.textContent = `/* MyUIbrix Dynamic Styles - Auto-generated */\\n${cssBlocks.join('\\n\\n')}`;\n \n // Force browser to recalculate styles\n if (typeof document !== 'undefined') {\n // Trigger a reflow to ensure styles are applied immediately\n document.body.offsetHeight; // Read operation forces reflow\n }\n } catch (e) {\n console.error('[MyUIbrix] Style injection failed:', e);\n }\n };\n\n const loadConfigs = async () => {\n try {\n const data = await getPageElementConfigs(pageType);\n if (active) {\n const configMap: Record<string, string> = {};\n const visMap: Record<string, boolean> = {};\n const stylesMap: Record<string, Record<string, any>> = {};\n \n // Sort by display_order to get correct element order\n const sorted = [...data].sort((a, b) => (a.display_order || 0) - (b.display_order || 0));\n const order = sorted.map(config => config.element_name);\n \n sorted.forEach(config => {\n configMap[config.element_name] = config.variant;\n visMap[config.element_name] = config.visible !== false;\n // Load saved styles from settings.styles and apply to state\n try {\n const st = (config.settings && (config.settings as any).styles) || {};\n if (st && typeof st === 'object' && Object.keys(st).length > 0) {\n stylesMap[config.element_name] = st as Record<string, any>;\n }\n } catch {}\n // Inject saved custom CSS (from settings.customCSS or settings.styles.customCSS)\n try {\n const css = String(((config.settings as any)?.customCSS) || ((config.settings as any)?.styles?.customCSS) || '').trim();\n const styleId = `custom-css-${config.element_name}`;\n const existing = document.getElementById(styleId);\n if (existing) existing.remove();\n if (css) {\n const style = document.createElement('style');\n style.id = styleId;\n const hasBlocks = /\\{[^}]*\\}|@media|@keyframes/.test(css);\n if (hasBlocks) {\n style.textContent = css;\n } else {\n const importantDecls = css\n .split(';')\n .map(s => s.trim())\n .filter(Boolean)\n .map(s => (/!important\\s*$/.test(s) ? s : `${s} !important`))\n .join(';\\n ');\n style.textContent = `\\n [data-element=\"${config.element_name}\"] {\\n ${importantDecls};\\n }\\n `;\n }\n document.head.appendChild(style);\n }\n } catch {}\n });\n \n setConfigs(configMap);\n setVisibility(visMap);\n if (Object.keys(stylesMap).length > 0) {\n setStyles(stylesMap);\n } else {\n setStyles({});\n }\n setElementOrder(order);\n // Apply style-pack body class\n try {\n const sp = configMap['style-pack'] || 'default';\n const body = document.body;\n // Remove any previous style-pack-* classes\n Array.from(body.classList)\n .filter(cls => cls.startsWith('style-pack-'))\n .forEach(cls => body.classList.remove(cls));\n body.classList.add(`style-pack-${sp}`);\n } catch {}\n // Inject style properties so they apply even without inline spreading\n updateInjectedStyleProps(stylesMap);\n \n // Apply initial order to DOM only in editor/preview mode\n const isEditingMode = (() => {\n try {\n if (typeof document !== 'undefined' && (document.body?.classList?.contains('myuibrix-edit-mode'))) return true;\n const params = new URLSearchParams(window.location.search);\n return params.get('myuibrix') === 'edit';\n } catch {\n return false;\n }\n })();\n\n if (order.length > 0 && isEditingMode) {\n requestAnimationFrame(() => {\n applyDOMOrder(order);\n });\n }\n }\n } catch (error) {\n console.error('Failed to load page element configs:', error);\n } finally {\n if (active) {\n setLoading(false);\n }\n }\n };\n\n loadConfigs();\n\n // Listen for live updates from MyUIbrix editor (ONLY in preview mode)\n const handleMyUIbrixChange = ((event: CustomEvent) => {\n const { elementName, variant, visible, previewMode, timestamp } = event.detail;\n \n // Only apply changes if in preview mode (editing)\n // This prevents production users from seeing draft changes\n if (previewMode) {\n console.log(`[usePageElementConfig] Variant change: ${elementName} -> ${variant}`);\n \n setConfigs(prev => ({\n ...prev,\n [elementName]: variant\n }));\n \n setVisibility(prev => ({\n ...prev,\n [elementName]: visible\n }));\n // If style-pack changed, toggle body class for live preview\n if (elementName === 'style-pack') {\n try {\n const body = document.body;\n Array.from(body.classList)\n .filter(cls => cls.startsWith('style-pack-'))\n .forEach(cls => body.classList.remove(cls));\n body.classList.add(`style-pack-${variant || 'default'}`);\n } catch {}\n }\n \n // Force React to re-render by incrementing refresh key\n setRefreshKey(prev => prev + 1);\n }\n }) as EventListener;\n\n // Listen for reorder events\n const handleMyUIbrixReorder = ((event: CustomEvent) => {\n const { order } = event.detail;\n setElementOrder(order);\n try {\n const inEdit = document.body?.classList?.contains('myuibrix-edit-mode') || false;\n if (inEdit) {\n applyDOMOrder(order);\n }\n } catch {\n // no-op\n }\n }) as EventListener;\n\n // Listen for style changes from VisualStylePanel\n const handleMyUIbrixStyleChange = ((event: CustomEvent) => {\n const { elementName, styles: newStyles, previewMode } = event.detail;\n \n if (previewMode) {\n console.log(`[MyUIbrix] Style change received for: ${elementName}`, newStyles);\n \n // Only update state - let React apply the styles through component rendering\n // This prevents conflicts with React's virtual DOM\n setStyles(prev => {\n const next = {\n ...prev,\n [elementName]: newStyles\n };\n \n // Also update injected CSS for global preview application\n // This ensures immediate visual feedback even before React re-renders\n requestAnimationFrame(() => {\n updateInjectedStyleProps(next);\n });\n \n // Live-inject custom CSS if provided, with enhanced specificity\n try {\n const css = String((newStyles && (newStyles as any).customCSS) || '').trim();\n const styleId = `custom-css-${elementName}`;\n const existing = document.getElementById(styleId);\n if (existing) existing.remove();\n if (css) {\n const style = document.createElement('style');\n style.id = styleId;\n const hasBlocks = /\\{[^}]*\\}|@media|@keyframes/.test(css);\n if (hasBlocks) {\n // User wrote full CSS rules - use as-is\n style.textContent = `/* Custom CSS for ${elementName} */\\n${css}`;\n } else {\n // Simple declarations - wrap with high-specificity selector\n const importantDecls = css\n .split(';')\n .map(s => s.trim())\n .filter(Boolean)\n .map(s => (/!important\\s*$/.test(s) ? s : `${s} !important`))\n .join(';\\n ');\n style.textContent = `/* Custom CSS for ${elementName} */\\nbody [data-element=\"${elementName}\"],\\n.container [data-element=\"${elementName}\"] {\\n ${importantDecls};\\n}`;\n }\n document.head.appendChild(style);\n }\n } catch (e) {\n console.error(`[MyUIbrix] Custom CSS injection failed for ${elementName}:`, e);\n }\n \n return next;\n });\n \n // Force React re-render of affected component by incrementing refresh key\n setRefreshKey(prev => prev + 1);\n }\n }) as EventListener;\n\n window.addEventListener('myuibrix-change', handleMyUIbrixChange);\n window.addEventListener('myuibrix-reorder', handleMyUIbrixReorder);\n window.addEventListener('myuibrix-style-change', handleMyUIbrixStyleChange);\n // Support force refresh event from editorController\n const handleForceRefresh = ((event: CustomEvent) => {\n updateInjectedStyleProps(styles);\n }) as EventListener;\n window.addEventListener('myuibrix-force-refresh', handleForceRefresh);\n\n return () => {\n active = false;\n window.removeEventListener('myuibrix-change', handleMyUIbrixChange);\n window.removeEventListener('myuibrix-reorder', handleMyUIbrixReorder);\n window.removeEventListener('myuibrix-style-change', handleMyUIbrixStyleChange);\n window.removeEventListener('myuibrix-force-refresh', handleForceRefresh);\n try {\n const s = document.getElementById('myuibrix-style-props');\n if (s) s.remove();\n } catch {}\n };\n }, [pageType]);\n\n const getVariant = (elementName: string, defaultVariant: string = 'unified'): string => {\n return configs[elementName] || defaultVariant;\n };\n\n const isVisible = (elementName: string, defaultVisible: boolean = true): boolean => {\n return visibility[elementName] !== undefined ? visibility[elementName] : defaultVisible;\n };\n\n const getStyles = (elementName: string): Record<string, any> | undefined => {\n return styles[elementName];\n };\n\n return { configs, visibility, styles, elementOrder, getVariant, isVisible, getStyles, loading, refreshKey };\n};\n","import api from './api';\n\nexport interface SeoSettings {\n site_title?: string;\n site_description?: string;\n meta_keywords?: string;\n default_og_image_url?: string;\n twitter_handle?: string;\n canonical_base_url?: string;\n additional_meta?: string;\n enable_indexing?: boolean;\n}\n\nexport async function getSeoSettings(): Promise<SeoSettings> {\n const res = await api.get<SeoSettings>('/admin/seo');\n return res.data || {};\n}\n\nexport async function updateSeoSettings(payload: Partial<SeoSettings>): Promise<{ ok: boolean }> {\n const res = await api.put<{ ok: boolean }>('/admin/seo', payload);\n return res.data;\n}\n","import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { Settings } from '../types';\nimport { api } from '../services/api';\n\nconst fetchSettings = async (): Promise<Settings> => {\n const { data } = await api.get<Settings>('/settings');\n return data;\n};\n\nconst updateSettings = async (settings: Partial<Settings>): Promise<Settings> => {\n const { data } = await api.put<Settings>('/settings', settings);\n return data;\n};\n\nconst defaultSettings: Settings = {\n id: 'default',\n clubId: '',\n clubType: '',\n primaryColor: '#3182ce', // Direct access to primary color\n theme: {\n primaryColor: '#3182ce',\n secondaryColor: '#2b6cb0',\n fontFamily: 'Inter, sans-serif',\n },\n socialLinks: {},\n contactInfo: {\n address: 'Ulice a číslo, Město, PSČ',\n phone: '+420 123 456 789',\n email: 'info@vas-klub.cz',\n website: 'www.vas-klub.cz',\n workingHours: 'Pondělí - Pátek: 9:00 - 17:00',\n },\n features: {\n darkMode: false,\n notifications: true,\n analytics: false,\n },\n updatedAt: new Date().toISOString(),\n createdAt: new Date().toISOString(),\n};\n\nexport const useSettings = () => {\n const queryClient = useQueryClient();\n\n const { data: settings = defaultSettings, isLoading } = useQuery<Settings>({\n queryKey: ['settings'],\n queryFn: fetchSettings,\n staleTime: 1000 * 60 * 5, // 5 minutes\n onError: (error) => {\n console.error('Failed to load settings:', error);\n },\n });\n\n const updateSettingsMutation = useMutation({\n mutationFn: updateSettings,\n onSuccess: (data) => {\n queryClient.setQueryData<Settings>(['settings'], (old) => ({\n ...defaultSettings,\n ...old,\n ...data,\n }));\n },\n });\n\n const updateTheme = (theme: Settings['theme']) => {\n updateSettingsMutation.mutate({\n theme: { ...settings.theme, ...theme },\n });\n };\n\n const updateSocialLinks = (socialLinks: Settings['socialLinks']) => {\n updateSettingsMutation.mutate({\n socialLinks: { ...settings.socialLinks, ...socialLinks },\n });\n };\n\n const updateFeatures = (features: Partial<Settings['features']>) => {\n updateSettingsMutation.mutate({\n features: { ...settings.features, ...features },\n });\n };\n\n return {\n settings,\n isLoading,\n updateTheme,\n updateSocialLinks,\n updateFeatures,\n updateSettings: updateSettingsMutation.mutateAsync,\n isUpdating: updateSettingsMutation.isLoading,\n };\n};\n","import React from 'react';\nimport { Box, HStack, Text, Image } from '@chakra-ui/react';\nimport { ScoreboardState } from '@/services/scoreboard';\n\nexport const ScoreboardPreview: React.FC<{ state: ScoreboardState }> = ({ state }) => {\n const theme = state.theme || 'pill';\n const isFlipped = !!state.sidesFlipped;\n const left = {\n short: (isFlipped ? state.awayShort : state.homeShort) || deriveShortLocal(isFlipped ? state.awayName : state.homeName),\n logo: isFlipped ? state.awayLogo : state.homeLogo,\n color: (isFlipped ? state.secondaryColor : state.primaryColor) || '#1e3a8a',\n score: isFlipped ? state.awayScore : state.homeScore,\n fouls: Math.max(0, Math.min(5, isFlipped ? (state.awayFouls || 0) : (state.homeFouls || 0))),\n name: isFlipped ? state.awayName : state.homeName,\n textColor: (isFlipped ? state.awayTextColor : state.homeTextColor) || '#ffffff',\n };\n const right = {\n short: (!isFlipped ? state.awayShort : state.homeShort) || deriveShortLocal(!isFlipped ? state.awayName : state.homeName),\n logo: !isFlipped ? state.awayLogo : state.homeLogo,\n color: (!isFlipped ? state.secondaryColor : state.primaryColor) || '#2563eb',\n score: !isFlipped ? state.awayScore : state.homeScore,\n fouls: Math.max(0, Math.min(5, !isFlipped ? (state.awayFouls || 0) : (state.homeFouls || 0))),\n name: !isFlipped ? state.awayName : state.homeName,\n textColor: (!isFlipped ? state.awayTextColor : state.homeTextColor) || '#ffffff',\n };\n const timer = state.timer || '00:00';\n\n switch (theme) {\n case 'pill':\n return (\n <Box maxW=\"100%\" overflowX=\"auto\">\n <HStack spacing={2} px={1.5} py={1} borderRadius=\"full\" bg=\"white\" borderWidth=\"1px\" borderColor=\"gray.200\" boxShadow=\"sm\" width=\"max-content\">\n <SegmentScore>{timer}</SegmentScore>\n <SegmentTeam colorA={left.color} textColor={left.textColor} left>\n {left.logo ? <Image src={left.logo} alt=\"home\" boxSize=\"16px\" objectFit=\"contain\" /> : null}\n <Text textTransform=\"uppercase\" fontSize=\"sm\" lineHeight={1}>{left.short}</Text>\n </SegmentTeam>\n <SegmentScore>{left.score} {right.score}</SegmentScore>\n <SegmentTeam colorA={right.color} textColor={right.textColor} right>\n <Text textTransform=\"uppercase\" fontSize=\"sm\" lineHeight={1}>{right.short}</Text>\n {right.logo ? <Image src={right.logo} alt=\"away\" boxSize=\"16px\" objectFit=\"contain\" /> : null}\n </SegmentTeam>\n </HStack>\n <FoulsBar leftCount={left.fouls} rightCount={right.fouls} leftColor={left.color} rightColor={right.color} />\n </Box>\n );\n case 'classic':\n case 'var1':\n return (\n <Box>\n <HStack spacing={3} bgGradient=\"linear(to-b, #c8d4dc, #a8b8c4)\" px={5} py={3} borderRadius=\"lg\" boxShadow=\"md\" width=\"max-content\">\n <Box bg=\"white\" color=\"black\" fontWeight=\"bold\" px={3} py={1} borderRadius=\"md\" fontSize=\"lg\">{timer}</Box>\n <Box bg={left.color} color=\"white\" px={4} py={2} borderRadius=\"md\" fontWeight=\"bold\">{left.short}</Box>\n <Text fontWeight=\"bold\" color=\"black\">{left.score}-{right.score}</Text>\n <Box bg={right.color} color=\"white\" px={4} py={2} borderRadius=\"md\" fontWeight=\"bold\">{right.short}</Box>\n </HStack>\n <FoulsBar leftCount={left.fouls} rightCount={right.fouls} leftColor={left.color} rightColor={right.color} />\n </Box>\n );\n case 'var2':\n return (\n <Box>\n <HStack spacing={0} borderRadius=\"md\" overflow=\"hidden\" boxShadow=\"md\" width=\"max-content\">\n <Box bgGradient=\"linear(135deg, #4a5568, #2d3748)\" color=\"white\" px={3} py={2} fontWeight=\"bold\">{timer}</Box>\n <Box bgGradient=\"linear(135deg, #2c5282, #2a4365)\" color=\"white\" px={4} py={2} fontWeight=\"bold\">{left.short}</Box>\n <Box bgGradient=\"linear(135deg, #2c5282, #2a4365)\" color=\"white\" px={3} py={2} fontWeight=\"bold\">{left.score}-{right.score}</Box>\n <Box bgGradient=\"linear(135deg, #2c5282, #2a4365)\" color=\"white\" px={4} py={2} fontWeight=\"bold\">{right.short}</Box>\n </HStack>\n <FoulsBar leftCount={left.fouls} rightCount={right.fouls} leftColor={left.color} rightColor={right.color} />\n </Box>\n );\n case 'var3':\n return (\n <Box textAlign=\"center\" fontFamily=\"Poppins, Arial, sans-serif\">\n <HStack spacing={0} justify=\"center\">\n <Box w=\"102px\" h=\"38px\" bg=\"#F6F6F6\" lineHeight=\"41px\" position=\"relative\">\n <Box position=\"absolute\" left=\"-8px\" top={0} w=\"6px\" h=\"38px\" bg={left.color} />\n <Text>{left.short}</Text>\n </Box>\n <Box w=\"102px\" h=\"38px\" bg=\"#F6F6F6\" lineHeight=\"41px\" zIndex={2} boxShadow=\"0 3px 10px rgba(0,0,0,0.7)\">\n <Text fontWeight=\"bold\">{left.score}-{right.score}</Text>\n </Box>\n <Box w=\"102px\" h=\"38px\" bg=\"#F6F6F6\" lineHeight=\"41px\" position=\"relative\">\n <Box position=\"absolute\" right=\"-8px\" top={0} w=\"6px\" h=\"38px\" bg={right.color} />\n <Text>{right.short}</Text>\n </Box>\n </HStack>\n <Box mt={2} w=\"306px\" mx=\"auto\" bg=\"#F6F6F6\">\n <Text>{timer}</Text>\n </Box>\n <FoulsBar leftCount={left.fouls} rightCount={right.fouls} leftColor={left.color} rightColor={right.color} />\n </Box>\n );\n case 'var4':\n return (\n <Box>\n <Box w=\"340px\" borderWidth=\"1px\" borderRadius=\"xl\" boxShadow=\"xl\" p={4} bg=\"white\" color=\"gray.900\">\n <HStack>\n <Text fontWeight=\"bold\">{left.name}</Text>\n <Text ml=\"auto\" fontWeight=\"extrabold\">{left.score}</Text>\n </HStack>\n <Box textAlign=\"center\" fontWeight=\"extrabold\" py={1}>VS</Box>\n <HStack>\n <Text fontWeight=\"bold\">{right.name}</Text>\n <Text ml=\"auto\" fontWeight=\"extrabold\">{right.score}</Text>\n </HStack>\n <HStack justify=\"flex-end\" fontSize=\"sm\" opacity={0.8} pt={2}>\n <Text>{timer}</Text>\n </HStack>\n </Box>\n <FoulsBar leftCount={left.fouls} rightCount={right.fouls} leftColor={left.color} rightColor={right.color} />\n </Box>\n );\n default:\n return (\n <Box>\n <HStack spacing={3} bg=\"gray.900\" color=\"white\" px={4} py={3} borderRadius=\"lg\" boxShadow=\"lg\" width=\"max-content\">\n <Text fontWeight=\"bold\">{left.name}</Text>\n <Text fontWeight=\"black\">{left.score} : {right.score}</Text>\n <Text fontWeight=\"bold\">{right.name}</Text>\n </HStack>\n <FoulsBar leftCount={left.fouls} rightCount={right.fouls} leftColor={left.color} rightColor={right.color} />\n </Box>\n );\n }\n};\n\n// Small presentational helpers for the pill theme\nconst SegmentTeam: React.FC<{ colorA?: string; textColor?: string; left?: boolean; right?: boolean; children: React.ReactNode }> = ({ colorA = '#1e3a8a', textColor = '#ffffff', left, right, children }) => {\n return (\n <HStack\n px={2}\n py={0.5}\n borderRadius=\"full\"\n bgGradient={`linear(to-r, ${colorA}, ${shadeColor(colorA, 20)})`}\n color={textColor}\n spacing={1.5}\n minW=\"46px\"\n >\n {children}\n </HStack>\n );\n};\n\nconst SegmentScore: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n return (\n <Box px={2} py={0.5} borderRadius=\"md\" bg=\"gray.50\" borderWidth=\"1px\" borderColor=\"gray.200\" fontWeight=\"800\" minW=\"58px\" textAlign=\"center\" fontSize=\"sm\">\n {children}\n </Box>\n );\n};\n\nconst FoulsBar: React.FC<{ leftCount: number; rightCount: number; leftColor: string; rightColor: string }> = ({ leftCount, rightCount, leftColor, rightColor }) => {\n const Dot: React.FC<{ active: boolean; color: string }> = ({ active, color }) => (\n <Box w=\"8px\" h=\"8px\" borderRadius=\"full\" bg={active ? color : 'gray.200'} borderWidth={active ? 0 : 1} borderColor=\"gray.300\" />\n );\n return (\n <HStack spacing={6} justify=\"center\" mt={2} width=\"100%\">\n <HStack spacing={1}>\n {Array.from({ length: 5 }).map((_, i) => <Dot key={i} active={i < leftCount} color={leftColor} />)}\n </HStack>\n <HStack spacing={1}>\n {Array.from({ length: 5 }).map((_, i) => <Dot key={i} active={i < rightCount} color={rightColor} />)}\n </HStack>\n </HStack>\n );\n};\n\nfunction formatTimer(halfLength: number): string {\n const min = Math.max(0, Math.min(halfLength, 99));\n return `${String(min).padStart(2, '0')}:00`;\n}\n\nfunction deriveShortLocal(name?: string) {\n if (!name) return '---';\n const s = String(name).trim().toUpperCase();\n if (!s) return '---';\n const map: Record<string, string> = {\n 'Á':'A','Ä':'A','Å':'A','Â':'A','À':'A',\n 'Č':'C','Ć':'C','Ç':'C',\n 'Ď':'D',\n 'É':'E','Ě':'E','È':'E','Ë':'E','Ê':'E',\n 'Í':'I','Ì':'I','Ï':'I','Î':'I',\n 'Ň':'N','Ń':'N',\n 'Ó':'O','Ö':'O','Ô':'O','Ò':'O',\n 'Ř':'R',\n 'Š':'S','Ś':'S',\n 'Ť':'T',\n 'Ú':'U','Ů':'U','Ù':'U','Ü':'U','Û':'U',\n 'Ý':'Y',\n 'Ž':'Z',\n };\n let out = '';\n for (const ch of s) {\n const c = map[ch] || ch;\n if (c >= 'A' && c <= 'Z') {\n out += c;\n if (out.length === 3) break;\n }\n }\n while (out.length < 3) out += '-';\n return out;\n}\n\nfunction shadeColor(hex: string, percent: number) {\n // Simple hex shade function\n try {\n const raw = hex.replace('#','');\n let n = raw;\n // Normalize to 6-digit RGB, ignore alpha channel if present\n if (n.length === 3 || n.length === 4) {\n // #RGB or #RGBA -> expand RGB, drop A\n const rgb = n.slice(0,3);\n n = rgb.split('').map((c)=>c+c).join('');\n } else if (n.length === 8) {\n // #RRGGBBAA -> drop AA\n n = n.slice(0,6);\n }\n if (n.length !== 6) return hex;\n const num = parseInt(n, 16);\n let r = (num >> 16) & 0xff;\n let g = (num >> 8) & 0xff;\n let b = num & 0xff;\n r = Math.min(255, Math.max(0, Math.round(r + (percent/100)*255)));\n g = Math.min(255, Math.max(0, Math.round(g + (percent/100)*255)));\n b = Math.min(255, Math.max(0, Math.round(b + (percent/100)*255)));\n return `#${[r,g,b].map(v=>v.toString(16).padStart(2,'0')).join('')}`;\n } catch {\n return hex;\n }\n}\n\nexport default React.memo(ScoreboardPreview);\n","import React, { useState, useEffect } from 'react';\nimport {\n Box,\n Button,\n FormControl,\n FormLabel,\n Input,\n Textarea,\n Select,\n VStack,\n HStack,\n Heading,\n Text,\n useToast,\n Tabs,\n TabList,\n TabPanels,\n Tab,\n TabPanel,\n SimpleGrid,\n Icon,\n Badge,\n} from '@chakra-ui/react';\nimport { FiSave, FiEye, FiCode, FiLayout, FiZap, FiPlus, FiTrash } from 'react-icons/fi';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport RichTextEditor from '../../components/common/RichTextEditor';\nimport AILoadingModal from '../../components/common/AILoadingModal';\nimport api from '../../services/api';\nimport { generateAboutAI } from '../../services/ai';\nimport { usePublicSettings } from '../../hooks/usePublicSettings';\nimport { getCategories, CategoryItem } from '../../services/categories';\nimport AIPromptInput from '../../components/common/AIPromptInput';\nimport { AITextModelId, getDefaultTextModelId } from '../../utils/aiModels';\nimport { processAIContent, cleanAIText } from '../../utils/aiTextProcessing';\n\ntype AboutPageData = {\n id?: number;\n title: string;\n subtitle: string;\n style: 'default' | 'modern' | 'timeline' | 'custom';\n content: string;\n sections: string;\n seo_title: string;\n seo_description: string;\n};\n\nconst AboutAdminPage: React.FC = () => {\n const toast = useToast();\n const { data: settings } = usePublicSettings();\n const [loading, setLoading] = useState(false);\n const [saving, setSaving] = useState(false);\n const [aiGenerating, setAiGenerating] = useState(false);\n const [aiProgress, setAiProgress] = useState<number | undefined>(undefined);\n const [aiStartTime, setAiStartTime] = useState<number | null>(null);\n const [aiPrompt, setAiPrompt] = useState('');\n const [aiAudience, setAiAudience] = useState('Fanoušci klubu');\n const [aiModelId, setAiModelId] = useState<AITextModelId>(getDefaultTextModelId());\n const [categories, setCategories] = useState<CategoryItem[]>([]);\n const [foundationYear, setFoundationYear] = useState<string>('');\n const [timelineEvents, setTimelineEvents] = useState<Array<{ year: string; title: string }>>([\n { year: '', title: '' },\n ]);\n const [data, setData] = useState<AboutPageData>({\n title: '',\n subtitle: '',\n style: 'default',\n content: '',\n sections: '[]',\n seo_title: '',\n seo_description: '',\n });\n\n useEffect(() => {\n loadData();\n loadCategories();\n }, []);\n\n const loadData = async () => {\n setLoading(true);\n try {\n const res = await api.get('/admin/about');\n if (res.data) {\n setData(res.data);\n }\n } catch (e: any) {\n toast({ title: 'Chyba', description: 'Nepodařilo se načíst data', status: 'error' });\n } finally {\n setLoading(false);\n }\n };\n\n const loadCategories = async () => {\n try {\n const cats = await getCategories();\n setCategories(cats || []);\n } catch {}\n };\n\n const handleSave = async () => {\n if (!data.title.trim()) {\n toast({ title: 'Chyba', description: 'Vyplňte název stránky', status: 'warning' });\n return;\n }\n\n setSaving(true);\n try {\n await api.put('/admin/about', data);\n toast({ title: 'Uloženo', description: 'Stránka O klubu byla uložena', status: 'success' });\n await loadData();\n } catch (e: any) {\n toast({\n title: 'Chyba',\n description: e?.response?.data?.error || 'Nepodařilo se uložit',\n status: 'error',\n });\n } finally {\n setSaving(false);\n }\n };\n\n const handleDelete = async () => {\n if (!confirm('Opravdu smazat stránku O klubu?')) return;\n try {\n await api.delete('/admin/about');\n toast({ title: 'Smazáno', description: 'Stránka byla smazána', status: 'info' });\n setData({\n title: '',\n subtitle: '',\n style: 'default',\n content: '',\n sections: '[]',\n seo_title: '',\n seo_description: '',\n });\n } catch (e: any) {\n toast({ title: 'Chyba', description: 'Nepodařilo se smazat', status: 'error' });\n }\n };\n\n const handleGenerateAI = async () => {\n if (!aiPrompt.trim()) {\n toast({ title: 'Chyba', description: 'Zadejte poznámky pro AI', status: 'warning' });\n return;\n }\n\n setAiGenerating(true);\n setAiProgress(0);\n setAiStartTime(Date.now());\n\n // Start progress simulation\n const progressInterval = setInterval(() => {\n setAiProgress((prev) => {\n if (prev === undefined || prev >= 95) return prev;\n return Math.min(prev + Math.random() * 15 + 5, 95);\n });\n }, 2000);\n\n try {\n const clubName = settings?.club_name || '';\n const catsText = categories && categories.length\n ? `Rubriky (kategorie): ${categories.map((c) => `${c.name}${c.description ? ` ${c.description}` : ''}`).join('; ')}`\n : '';\n const styleIntro = `Zvolený styl: ${data.style}.`;\n const timelineDetails = data.style === 'timeline'\n ? `\\nČasová osa dodatečné informace:\\nRok založení: ${foundationYear || 'neuvedeno'}.\\nKlíčové milníky (rok: událost):\\n${timelineEvents\n .filter((e) => e.year.trim() || e.title.trim())\n .map((e) => `- ${e.year.trim() || '????'}: ${e.title.trim() || ''}`)\n .join('\\n')}`\n : '';\n const extraGuidelines = data.style === 'timeline'\n ? 'Piš chronologicky, používej podnadpisy (h3) s rokem, pod nimi krátký odstavec. Kde se hodí, vlož seznamy (ul/li).' \n : 'Rozděl text do sekcí s h2/h3 a odstavci. Kde se hodí, vlož seznamy (ul/li).';\n\n const fullPrompt = `${aiPrompt.trim()}\\n\\nInformace o klubu:\\nNázev klubu: ${clubName || 'Fotbalový klub'}.\\n${catsText}\\n${styleIntro}${timelineDetails}\\n\\nPokyny pro výstup: ${extraGuidelines}`;\n\n const result = await generateAboutAI({\n prompt: fullPrompt,\n audience: aiAudience,\n style: data.style,\n club_name: clubName,\n model: aiModelId,\n });\n \n clearInterval(progressInterval);\n setAiProgress(100);\n \n setData((prev) => ({\n ...prev,\n content: processAIContent(result.html || prev.content, { cleanText: true, preserveHtmlTags: true }),\n title: cleanAIText(result.title || prev.title),\n subtitle: cleanAIText(result.subtitle || prev.subtitle),\n seo_title: cleanAIText(result.seo_title || prev.seo_title),\n seo_description: cleanAIText(result.seo_description || prev.seo_description),\n }));\n toast({\n title: 'Hotovo!',\n description: 'AI úspěšně vygenerovala obsah',\n status: 'success',\n });\n } catch (e: any) {\n clearInterval(progressInterval);\n console.error('AI generation error:', e);\n toast({\n title: 'Chyba AI',\n description: e?.response?.data?.error || 'Nepodařilo se vygenerovat obsah',\n status: 'error',\n });\n } finally {\n clearInterval(progressInterval);\n setTimeout(() => {\n setAiGenerating(false);\n setAiProgress(undefined);\n setAiStartTime(null);\n }, 1000); // Brief moment to show 100% completion\n }\n };\n\n const styleDescriptions: Record<string, { name: string; desc: string }> = {\n default: { name: 'Výchozí', desc: 'Jednoduchý layout s titulkem a obsahem' },\n modern: { name: 'Moderní', desc: 'Vizuálně atraktivní s hero obrázkem a sekcemi' },\n timeline: { name: 'Timeline', desc: 'Historie klubu na časové ose' },\n custom: { name: 'Vlastní HTML', desc: 'Plná kontrola nad obsahem a stylingem' },\n };\n\n return (\n <AdminLayout requireAdmin={false}>\n <Box>\n <HStack justify=\"space-between\" mb={4}>\n <Heading size=\"lg\">Stránka O klubu</Heading>\n <HStack>\n <Button\n leftIcon={<FiSave />}\n colorScheme=\"brand\"\n onClick={handleSave}\n isLoading={saving}\n >\n Uložit\n </Button>\n </HStack>\n </HStack>\n\n <Text color=\"gray.600\" mb={6}>\n Vytvořte nebo upravte stránku O klubu. Dostupná na <strong>/o-klubu</strong>.\n </Text>\n\n <Tabs variant=\"enclosed\" colorScheme=\"brand\">\n <TabList>\n <Tab><Icon as={FiLayout} mr={2} /> Obsah</Tab>\n <Tab><Icon as={FiCode} mr={2} /> Styl</Tab>\n <Tab><Icon as={FiEye} mr={2} /> SEO</Tab>\n </TabList>\n\n <TabPanels>\n {/* Content Tab */}\n <TabPanel>\n <VStack align=\"stretch\" spacing={4}>\n <FormControl isRequired>\n <FormLabel>Název stránky</FormLabel>\n <Input\n value={data.title}\n onChange={(e) => setData((prev) => ({ ...prev, title: e.target.value }))}\n placeholder=\"O naší klubu\"\n />\n </FormControl>\n\n <FormControl>\n <FormLabel>Podtitulek</FormLabel>\n <Input\n value={data.subtitle}\n onChange={(e) => setData((prev) => ({ ...prev, subtitle: e.target.value }))}\n placeholder=\"Naše historie, hodnoty a komunita\"\n />\n </FormControl>\n\n <FormControl>\n <FormLabel>Styl stránky</FormLabel>\n <Select\n value={data.style}\n onChange={(e) =>\n setData((prev) => ({ ...prev, style: e.target.value as any }))\n }\n >\n {Object.entries(styleDescriptions).map(([key, { name }]) => (\n <option key={key} value={key}>\n {name}\n </option>\n ))}\n </Select>\n <Text fontSize=\"sm\" color=\"gray.600\" mt={2}>\n {styleDescriptions[data.style]?.desc}\n </Text>\n </FormControl>\n\n {data.style === 'timeline' && (\n <Box borderWidth=\"1px\" borderRadius=\"md\" p={4} bg=\"gray.50\">\n <Heading size=\"sm\" mb={3}>Časová osa podklady</Heading>\n <VStack align=\"stretch\" spacing={3}>\n <FormControl>\n <FormLabel>Rok založení</FormLabel>\n <Input\n type=\"text\"\n value={foundationYear}\n onChange={(e) => setFoundationYear(e.target.value)}\n placeholder=\"např. 1932\"\n />\n </FormControl>\n <Box>\n <HStack justify=\"space-between\" mb={2}>\n <Text fontWeight=\"semibold\">Klíčové milníky</Text>\n <Button size=\"sm\" leftIcon={<FiPlus />} onClick={() => setTimelineEvents((prev) => [...prev, { year: '', title: '' }])}>Přidat milník</Button>\n </HStack>\n <VStack align=\"stretch\" spacing={2}>\n {timelineEvents.map((ev, idx) => (\n <HStack key={idx} spacing={2} align=\"stretch\">\n <Input\n placeholder=\"Rok\"\n value={ev.year}\n onChange={(e) => setTimelineEvents((prev) => prev.map((it, i) => i === idx ? { ...it, year: e.target.value } : it))}\n maxW=\"120px\"\n />\n <Input\n placeholder=\"Událost / popis\"\n value={ev.title}\n onChange={(e) => setTimelineEvents((prev) => prev.map((it, i) => i === idx ? { ...it, title: e.target.value } : it))}\n />\n <Button aria-label=\"Odebrat\" size=\"sm\" colorScheme=\"red\" variant=\"outline\" onClick={() => setTimelineEvents((prev) => prev.filter((_, i) => i !== idx))}>\n <Icon as={FiTrash} />\n </Button>\n </HStack>\n ))}\n </VStack>\n </Box>\n </VStack>\n </Box>\n )}\n\n {/* Hero image removed: About page uses club logo and name from settings */}\n\n <Box\n borderWidth=\"1px\"\n borderRadius=\"md\"\n p={4}\n bg=\"gray.50\"\n >\n <HStack justify=\"space-between\" mb={3} align=\"flex-start\">\n <Box>\n <Heading size=\"sm\" mb={1}>AI generátor obsahu</Heading>\n <Text fontSize=\"sm\" color=\"gray.600\">\n Napište krátké poznámky (např. historie, úspěchy, hodnoty) a nechte AI připravit návrh stránky.\n </Text>\n </Box>\n <Button\n leftIcon={<FiZap />}\n colorScheme=\"gray\"\n variant=\"solid\"\n onClick={handleGenerateAI}\n isDisabled={aiGenerating}\n >\n Vygenerovat\n </Button>\n </HStack>\n <VStack align=\"stretch\" spacing={3}>\n <FormControl>\n <FormLabel>Poznámky pro AI</FormLabel>\n <AIPromptInput\n value={aiPrompt}\n onChange={setAiPrompt}\n onSubmit={(_, modelId) => {\n setAiModelId(modelId);\n return handleGenerateAI();\n }}\n isSubmitting={aiGenerating}\n placeholder=\"Popište historii klubu, současné cíle, přístup k mládeži...\"\n helperText=\"AI připraví návrh stránky O klubu na základě těchto poznámek.\"\n />\n </FormControl>\n <FormControl>\n <FormLabel>Cílové publikum</FormLabel>\n <Input\n value={aiAudience}\n onChange={(e) => setAiAudience(e.target.value)}\n placeholder=\"Fanoušci klubu\"\n />\n </FormControl>\n </VStack>\n </Box>\n\n <FormControl>\n <FormLabel>Obsah stránky</FormLabel>\n <RichTextEditor\n value={data.content}\n onChange={(value) => setData((prev) => ({ ...prev, content: value }))}\n height=\"400px\"\n toolbar=\"full\"\n showImageResize={true}\n placeholder=\"Zadejte obsah stránky O nás...\"\n />\n </FormControl>\n </VStack>\n </TabPanel>\n\n {/* Style Tab */}\n <TabPanel>\n <VStack align=\"stretch\" spacing={4}>\n <FormControl>\n <FormLabel>Styl stránky</FormLabel>\n <Select\n value={data.style}\n onChange={(e) =>\n setData((prev) => ({ ...prev, style: e.target.value as any }))\n }\n >\n {Object.entries(styleDescriptions).map(([key, { name, desc }]) => (\n <option key={key} value={key}>\n {name}\n </option>\n ))}\n </Select>\n <Text fontSize=\"sm\" color=\"gray.600\" mt={2}>\n {styleDescriptions[data.style]?.desc}\n </Text>\n </FormControl>\n\n <Box\n p={4}\n borderWidth=\"1px\"\n borderRadius=\"md\"\n bg=\"blue.50\"\n borderColor=\"blue.200\"\n >\n <Heading size=\"sm\" mb={2}>Vybraný styl: {styleDescriptions[data.style]?.name}</Heading>\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={3} mb={3}>\n <Box>\n <Badge colorScheme=\"blue\" mb={1}>Výchozí</Badge>\n <Text fontSize=\"sm\">Jednoduchý layout, ideální pro text</Text>\n </Box>\n <Box>\n <Badge colorScheme=\"purple\" mb={1}>Moderní</Badge>\n <Text fontSize=\"sm\">Hero obrázek + sekce karet</Text>\n </Box>\n <Box>\n <Badge colorScheme=\"green\" mb={1}>Timeline</Badge>\n <Text fontSize=\"sm\">Historie klubu chronologicky</Text>\n </Box>\n <Box>\n <Badge colorScheme=\"orange\" mb={1}>Vlastní</Badge>\n <Text fontSize=\"sm\">Plná kontrola přes HTML/CSS</Text>\n </Box>\n </SimpleGrid>\n </Box>\n\n {data.style === 'custom' && (\n <Box\n p={3}\n bg=\"yellow.50\"\n borderWidth=\"1px\"\n borderColor=\"yellow.300\"\n borderRadius=\"md\"\n >\n <Text fontSize=\"sm\" fontWeight=\"semibold\" mb={1}>\n Vlastní HTML režim\n </Text>\n <Text fontSize=\"sm\">\n V editoru můžete použít jakékoliv HTML a CSS. Ujistěte se, že je kód validní.\n </Text>\n </Box>\n )}\n </VStack>\n </TabPanel>\n\n {/* SEO Tab */}\n <TabPanel>\n <VStack align=\"stretch\" spacing={4}>\n <FormControl>\n <FormLabel>SEO Titulek</FormLabel>\n <Input\n value={data.seo_title}\n onChange={(e) => setData((prev) => ({ ...prev, seo_title: e.target.value }))}\n placeholder=\"Pokud prázdné, použije se název stránky\"\n />\n </FormControl>\n\n <FormControl>\n <FormLabel>SEO Popis</FormLabel>\n <Textarea\n value={data.seo_description}\n onChange={(e) =>\n setData((prev) => ({ ...prev, seo_description: e.target.value }))\n }\n placeholder=\"Krátký popis pro vyhledávače (doporučeno 150-160 znaků)\"\n rows={4}\n />\n <Text fontSize=\"sm\" color=\"gray.600\" mt={1}>\n Délka: {data.seo_description.length} znaků\n </Text>\n </FormControl>\n </VStack>\n </TabPanel>\n </TabPanels>\n </Tabs>\n\n <Box mt={6} pt={4} borderTopWidth=\"1px\">\n <HStack justify=\"space-between\">\n <Button colorScheme=\"red\" variant=\"outline\" onClick={handleDelete}>\n Smazat stránku\n </Button>\n <HStack>\n <Button as=\"a\" href=\"/o-klubu\" target=\"_blank\" variant=\"outline\">\n Náhled\n </Button>\n <Button\n leftIcon={<FiSave />}\n colorScheme=\"brand\"\n onClick={handleSave}\n isLoading={saving}\n >\n Uložit změny\n </Button>\n </HStack>\n </HStack>\n </Box>\n </Box>\n \n <AILoadingModal\n isOpen={aiGenerating}\n onClose={() => {}} // Can't close while AI is working\n title=\"AI generuje obsah\"\n message=\"AI pracuje na generování obsahu pro stránku O klubu...\"\n progress={aiProgress}\n estimatedTime={aiStartTime ? 30 : undefined} // 30 seconds estimated\n />\n </AdminLayout>\n );\n};\n\nexport default AboutAdminPage;\n","import { Box, Tabs, TabList, TabPanels, Tab, TabPanel, VStack, HStack, Image, Text, Skeleton, Badge } from '@chakra-ui/react';\nimport { useQuery } from '@tanstack/react-query';\nimport React from 'react';\nimport { facrApi } from '../../services/facr/facrApi';\nimport { usePublicSettings } from '../../hooks/usePublicSettings';\nimport { getCompetitionAliasesPublic, CompetitionAlias } from '../../services/competitionAliases';\nimport { TeamLogo } from '../common/TeamLogo';\nimport { sortCategoriesWithOrder } from '../../utils/categorySort';\nimport { sanitizeClubName } from '../../utils/url';\nimport '../../styles/logos.css';\n\nconst Row: React.FC<{ d: string; h: string; hid?: string; hl?: string; a: string; aid?: string; al?: string; s?: string; clubName?: string; clubId?: string }> = ({ d, h, hid, hl, a, aid, al, s, clubName, clubId }) => (\n <HStack justify=\"space-between\" borderRadius=\"lg\" p={3} bg=\"white\" boxShadow=\"sm\">\n <Text w=\"140px\" fontSize=\"sm\" color=\"gray.600\">{d}</Text>\n <HStack flex={1} justify=\"flex-end\" spacing={4}>\n <HStack minW=\"40%\" justify=\"flex-end\" spacing={2}>\n <Text noOfLines={1} textAlign=\"right\" flex={1}>{sanitizeClubName(h)}</Text>\n <Box className=\"logo-container\" w=\"28px\" h=\"28px\">\n <TeamLogo\n teamId={hid}\n teamName={h}\n facrLogo={hl}\n size=\"custom\"\n boxSize=\"28px\"\n />\n </Box>\n </HStack>\n <HStack minW=\"60px\" justify=\"center\" spacing={2}>\n <Text fontWeight=\"bold\" textAlign=\"center\">{s || '-:-'}</Text>\n {(() => {\n if (!s) return null;\n const m = s.match(/^(\\d+)\\s*[:\\-]\\s*(\\d+)$/);\n if (!m) return null;\n const hG = parseInt(m[1], 10), aG = parseInt(m[2], 10);\n \n // First try ID-based matching (most reliable)\n let ourHome = false;\n let ourAway = false;\n if (clubId && hid && aid) {\n ourHome = hid === clubId;\n ourAway = aid === clubId;\n }\n \n // Fallback to name matching if IDs not available or no match\n if (!ourHome && !ourAway && clubName) {\n const norm = (x: string) => String(x||'').normalize('NFD').replace(/[\\u0300-\\u036f]/g,'').replace(/\\s+/g,' ').trim().toLowerCase();\n const strip = (x: string) => norm(x).replace(/\\b(mestsky|m\\.?f\\.?k\\.?|mfk|tj|sk|sokol|fotbalovy|fotbalový|fotbalovy\\s+klub|fotbalovy\\s+klub)\\b/g,'').replace(/\\s+/g,' ').trim();\n const A = strip(h); \n const B = strip(clubName);\n ourHome = Boolean(A && B && (A===B || A.endsWith(B) || B.endsWith(A)));\n const C = strip(a);\n ourAway = Boolean(C && B && (C===B || C.endsWith(B) || B.endsWith(C)));\n }\n \n if (!ourHome && !ourAway) return null;\n if (hG === aG) return <Badge colorScheme=\"blue\" variant=\"subtle\">Remíza</Badge>;\n const our = ourHome ? hG : aG; const opp = ourHome ? aG : hG;\n return our > opp ? <Badge colorScheme=\"green\" variant=\"subtle\">Výhra</Badge> : <Badge colorScheme=\"red\" variant=\"subtle\">Prohra</Badge>;\n })()}\n </HStack>\n <HStack minW=\"40%\" spacing={2}>\n <Box className=\"logo-container\" w=\"28px\" h=\"28px\">\n <TeamLogo\n teamId={aid}\n teamName={a}\n facrLogo={al}\n size=\"custom\"\n boxSize=\"28px\"\n />\n </Box>\n <Text noOfLines={1} flex={1}>{sanitizeClubName(a)}</Text>\n </HStack>\n </HStack>\n </HStack>\n);\n\nconst CompetitionMatches: React.FC = () => {\n const { data: settings } = usePublicSettings();\n const clubId = settings?.club_id;\n const clubType = settings?.club_type || 'football';\n const { data, isLoading } = useQuery({\n queryKey: ['facr-club', clubId, clubType],\n queryFn: () => facrApi.getClub(clubId!, clubType as any),\n enabled: !!clubId,\n });\n // Load competition aliases\n const [aliases, setAliases] = React.useState<Record<string, { alias: string; original_name?: string; display_order?: number }>>({});\n React.useEffect(() => {\n let mounted = true;\n (async () => {\n try {\n const list: CompetitionAlias[] = await getCompetitionAliasesPublic();\n if (!mounted) return;\n const map: Record<string, { alias: string; original_name?: string; display_order?: number }> = {};\n (list || []).forEach((a) => { if (a?.code && a?.alias) map[a.code] = { alias: a.alias, original_name: a.original_name, display_order: a.display_order }; });\n setAliases(map);\n } catch {}\n })();\n return () => { mounted = false; };\n }, []);\n\n // Precompute sorted competitions safely (must be before any early returns to keep hooks order stable)\n const competitions = data?.competitions ?? [];\n const sortedCompetitions = React.useMemo(() => {\n const arr = Array.isArray(competitions) ? competitions : [];\n return sortCategoriesWithOrder(\n arr.map(c => ({\n ...c,\n name: aliases[c.code]?.alias || aliases[c.id]?.alias || c.name,\n alias: aliases[c.code]?.alias || aliases[c.id]?.alias,\n display_order: (aliases[c.code]?.display_order) ?? (aliases[c.id]?.display_order),\n }))\n );\n }, [competitions, aliases]);\n\n if (isLoading) return <Skeleton height=\"200px\" />;\n \n if (!clubId) {\n return (\n <Box p={4} bg=\"yellow.50\" borderRadius=\"md\" borderWidth=\"1px\" borderColor=\"yellow.200\">\n <Text color=\"gray.700\">\n Pro zobrazení zápasů je potřeba nastavit klub v administraci (Nastavení → Základní údaje).\n </Text>\n </Box>\n );\n }\n \n if (!data || !data.competitions || data.competitions.length === 0) {\n return (\n <Box p={4} bg=\"gray.50\" borderRadius=\"md\" borderWidth=\"1px\" borderColor=\"gray.200\">\n <Text color=\"gray.600\">\n Žádné soutěže ani zápasy nejsou k dispozici pro vybraný klub.\n </Text>\n </Box>\n );\n }\n\n // Sort competitions by age (Muži first, then U19, U17, etc.) and respect custom order (computed above)\n\n return (\n <Box>\n <Tabs variant=\"soft-rounded\" colorScheme=\"blue\" size=\"sm\">\n <TabList px={2} pt={2} overflowX=\"auto\" overflowY=\"hidden\" css={{\n '&::-webkit-scrollbar': { height: '4px' },\n '&::-webkit-scrollbar-track': { background: 'transparent' },\n '&::-webkit-scrollbar-thumb': { background: 'gray.300', borderRadius: '4px' },\n }}>\n {sortedCompetitions.map((c) => {\n const label = c.alias || c.name;\n return (\n <Tab key={c.id} flex=\"0 0 auto\" px={3} py={2} fontSize=\"sm\">\n <Text as=\"span\" noOfLines={1} maxW=\"220px\" title={label}>{label}</Text>\n </Tab>\n );\n })}\n </TabList>\n <TabPanels>\n {sortedCompetitions.map((c) => (\n <TabPanel key={c.id} px={0}>\n <VStack align=\"stretch\" spacing={3}>\n {(c.matches || []).slice(0, 6).map((m, idx) => (\n <Row key={m.match_id || idx} d={m.date_time} h={m.home} hid={m.home_id} hl={m.home_logo_url} a={m.away} aid={m.away_id} al={m.away_logo_url} s={m.score} clubName={data.name} clubId={data.club_internal_id} />\n ))}\n {(c.matches || []).length === 0 && (\n <Text color=\"gray.500\">Žádné zápasy k dispozici.</Text>\n )}\n </VStack>\n </TabPanel>\n ))}\n </TabPanels>\n </Tabs>\n </Box>\n );\n};\n\nexport default CompetitionMatches;\n","import React, { useState, useEffect } from 'react';\nimport {\n Box,\n BoxProps,\n Container,\n Heading,\n Text,\n Skeleton,\n VStack,\n Image,\n HStack,\n Stack,\n Button,\n useColorModeValue,\n} from '@chakra-ui/react';\nimport { Helmet } from 'react-helmet-async';\nimport api from '../services/api';\nimport DOMPurify from 'dompurify';\nimport { usePublicSettings } from '../hooks/usePublicSettings';\nimport { useTranslation } from 'react-i18next';\nimport MainLayout from '../components/layout/MainLayout';\nimport CompetitionMatches from '../components/home/CompetitionMatches';\nimport { getCategories, CategoryItem } from '../services/categories';\nimport { Link as RouterLink } from 'react-router-dom';\nimport SponsorsSection from '../components/common/SponsorsSection';\nimport NewsletterCTA from '../components/common/NewsletterCTA';\nimport { assetUrl } from '../utils/url';\n\ntype AboutPageData = {\n title: string;\n subtitle: string;\n style: 'default' | 'modern' | 'timeline' | 'custom';\n content: string;\n seo_title: string;\n seo_description: string;\n};\n\nconst AboutPage: React.FC = () => {\n const { t } = useTranslation();\n const [loading, setLoading] = useState(true);\n const [data, setData] = useState<AboutPageData | null>(null);\n const [error, setError] = useState<string>('');\n const { data: settings } = usePublicSettings();\n const [categories, setCategories] = useState<CategoryItem[]>([]);\n const cardBg = useColorModeValue('white', 'gray.800');\n const textSecondary = useColorModeValue('gray.600', 'gray.400');\n const borderSubtle = useColorModeValue('gray.100', 'gray.700');\n\n useEffect(() => {\n loadData();\n loadCategories();\n }, []);\n\n const loadData = async () => {\n setLoading(true);\n setError('');\n try {\n const res = await api.get('/about');\n setData(res.data);\n } catch (e: any) {\n if (e?.response?.status === 404) {\n setError('About page has not been created yet.');\n } else {\n setError('Nepodařilo se načíst stránku.');\n }\n } finally {\n setLoading(false);\n }\n };\n\n const loadCategories = async () => {\n try {\n const cats = await getCategories();\n setCategories(cats || []);\n } catch {}\n };\n\n // Make images inside HTML content responsive and lazy\n useEffect(() => {\n try {\n const containers = document.querySelectorAll('.about-content img, .about-timeline img');\n containers.forEach((img) => {\n if (img instanceof HTMLImageElement) {\n img.loading = 'lazy';\n img.decoding = 'async';\n img.style.maxWidth = '100%';\n img.style.height = 'auto';\n img.style.display = 'block';\n }\n });\n } catch {}\n }, [data]);\n\n if (loading) {\n return (\n <MainLayout>\n <Container maxW=\"container.lg\" py={8}>\n <VStack align=\"stretch\" spacing={4}>\n <Skeleton height=\"60px\" />\n <Skeleton height=\"400px\" />\n </VStack>\n </Container>\n </MainLayout>\n );\n }\n\n const renderCategoriesList = (marginTop: BoxProps['mt'] = 2) => {\n if (categories.length === 0) return null;\n return (\n <Box mt={marginTop}>\n <Heading as=\"h2\" size=\"md\" mb={4}>{t('blog.categories')}</Heading>\n <VStack align=\"stretch\" spacing={3}>\n {categories.map((c) => (\n <Stack\n key={c.id}\n direction={{ base: 'column', sm: 'row' }}\n spacing={{ base: 3, sm: 4 }}\n align={{ base: 'flex-start', sm: 'center' }}\n bg={cardBg}\n borderRadius=\"md\"\n p={{ base: 4, md: 5 }}\n boxShadow=\"sm\"\n borderWidth=\"1px\"\n borderColor={borderSubtle}\n w=\"100%\"\n >\n <Box flex=\"1\" minW={0}>\n <Heading as=\"h3\" size=\"sm\" mb={c.description ? 1 : 0}>\n {c.name}\n </Heading>\n {c.description && (\n <Text fontSize=\"sm\" color={textSecondary} noOfLines={{ base: 3, md: 2 }}>\n {c.description}\n </Text>\n )}\n </Box>\n <Button\n as={RouterLink}\n to={`/blog?category=${c.id}`}\n size=\"sm\"\n variant=\"outline\"\n colorScheme=\"blue\"\n fontWeight=\"bold\"\n w={{ base: 'full', sm: 'auto' }}\n >\n {t('action.open')}\n </Button>\n </Stack>\n ))}\n </VStack>\n </Box>\n );\n };\n\n if (error || !data) {\n return (\n <MainLayout>\n <Helmet>\n <title>{settings?.club_name ? `${t('nav.club')} | ${settings.club_name}` : t('nav.club')}</title>\n <meta name=\"description\" content={t('about.meta_description')} />\n {settings?.club_logo_url && <meta property=\"og:image\" content={assetUrl(settings.club_logo_url) || settings.club_logo_url} />}\n </Helmet>\n <Container maxW=\"container.lg\" py={8}>\n <Box textAlign=\"center\" py={6}>\n <Heading size=\"xl\" mb={2}>{t('nav.club')}</Heading>\n <Text color={textSecondary}>{t('about.page_not_setup')}</Text>\n </Box>\n\n {/* Matches slider by competition (FACR) */}\n <Box mt={4} mb={10}>\n <Heading as=\"h2\" size=\"md\" mb={4}>{t('about.matches_by_competition')}</Heading>\n <CompetitionMatches />\n </Box>\n {renderCategoriesList()}\n </Container>\n </MainLayout>\n );\n }\n\n const seoTitle = data.seo_title || data.title;\n const seoDesc = data.seo_description || data.subtitle;\n const clubName = settings?.club_name || data.title;\n const clubLogo = settings?.club_logo_url ? (assetUrl(settings.club_logo_url) || settings.club_logo_url) : undefined;\n const cleanContent = DOMPurify.sanitize(data.content, {\n USE_PROFILES: { html: true },\n ADD_TAGS: ['iframe'],\n ADD_ATTR: ['class', 'style', 'data-bullets', 'data-list', 'target', 'rel', 'allow', 'allowfullscreen'],\n });\n\n const renderContent = () => {\n switch (data.style) {\n case 'modern':\n return (\n <Box>\n {/* Header with club logo and name */}\n <HStack spacing={4} mb={8} align=\"center\">\n {clubLogo && (\n <Image src={clubLogo} alt={clubName} boxSize=\"64px\" objectFit=\"contain\" />\n )}\n <VStack align=\"start\" spacing={1}>\n <Heading size=\"2xl\">{clubName}</Heading>\n {data.subtitle && (\n <Text fontSize=\"xl\" color={textSecondary}>\n {data.subtitle}\n </Text>\n )}\n </VStack>\n </HStack>\n\n {/* Content */}\n <Box\n className=\"about-content\"\n dangerouslySetInnerHTML={{ __html: cleanContent }}\n sx={{\n '& p': { mb: 4, lineHeight: 1.8 },\n '& a': { color: 'blue.600', textDecoration: 'underline', _hover: { color: 'blue.700' } },\n '& blockquote': {\n borderLeft: '4px solid #3182ce',\n paddingLeft: '16px',\n margin: '1em 0',\n color: textSecondary,\n fontStyle: 'italic',\n backgroundColor: 'gray.50',\n padding: '12px 16px',\n borderRadius: '4px',\n },\n '& h1, & h2, & h3': { mt: 8, mb: 4, fontWeight: 'bold' },\n '& h1': { fontSize: '2xl' },\n '& h2': { fontSize: 'xl' },\n '& h3': { fontSize: 'lg' },\n '& img': { maxW: '100%', borderRadius: 'md', my: 6 },\n '& ul, & ol': { pl: 8, mb: 4, listStylePosition: 'outside' },\n '& ul': { listStyleType: 'disc' },\n '& ul[data-bullets=\"disc\"]': { listStyleType: 'disc' },\n '& ul[data-bullets=\"circle\"]': { listStyleType: 'circle' },\n '& ul[data-bullets=\"square\"]': { listStyleType: 'square' },\n '& ul[data-bullets=\"none\"]': { listStyleType: 'none' },\n '& ol': { listStyleType: 'decimal' },\n '& li': { mb: 2 },\n }}\n />\n </Box>\n );\n\n case 'timeline':\n return (\n <Box>\n {/* Header with club logo and name */}\n <HStack spacing={4} mb={8} align=\"center\">\n {clubLogo && (\n <Image src={clubLogo} alt={clubName} boxSize=\"64px\" objectFit=\"contain\" />\n )}\n <VStack align=\"start\" spacing={1}>\n <Heading size=\"2xl\">{clubName}</Heading>\n {data.subtitle && (\n <Text fontSize=\"xl\" color={textSecondary}>\n {data.subtitle}\n </Text>\n )}\n </VStack>\n </HStack>\n\n {/* Timeline Content */}\n <Box\n className=\"about-timeline\"\n dangerouslySetInnerHTML={{ __html: cleanContent }}\n sx={{\n position: 'relative',\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: '20px',\n top: 0,\n bottom: 0,\n width: '2px',\n bg: 'gray.300',\n },\n '& p': { mb: 4, lineHeight: 1.8, pl: 12, position: 'relative' },\n '& h1, & h2, & h3': {\n mt: 8,\n mb: 4,\n fontWeight: 'bold',\n pl: 12,\n position: 'relative',\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: '11px',\n top: '8px',\n width: '20px',\n height: '20px',\n borderRadius: 'full',\n bg: 'brand.500',\n border: '4px solid white',\n boxShadow: 'md',\n },\n },\n '& ul, & ol': { pl: 12, mb: 4, listStylePosition: 'outside' },\n '& ul': { listStyleType: 'disc' },\n '& ul[data-bullets=\"disc\"]': { listStyleType: 'disc' },\n '& ul[data-bullets=\"circle\"]': { listStyleType: 'circle' },\n '& ul[data-bullets=\"square\"]': { listStyleType: 'square' },\n '& ul[data-bullets=\"none\"]': { listStyleType: 'none' },\n '& ol': { listStyleType: 'decimal' },\n '& li': { mb: 2 },\n '& img': { maxW: '100%', borderRadius: 'md', my: 6, ml: 12 },\n }}\n />\n </Box>\n );\n\n case 'custom':\n // Full custom HTML - just render as-is with minimal styling\n return (\n <Box dangerouslySetInnerHTML={{ __html: cleanContent }} />\n );\n\n case 'default':\n default:\n return (\n <Box>\n <HStack spacing={4} mb={8} align=\"center\">\n {clubLogo && (\n <Image src={clubLogo} alt={clubName} boxSize=\"64px\" objectFit=\"contain\" />\n )}\n <VStack align=\"start\" spacing={1}>\n <Heading size=\"2xl\">{clubName}</Heading>\n {data.subtitle && (\n <Text fontSize=\"xl\" color={textSecondary}>\n {data.subtitle}\n </Text>\n )}\n </VStack>\n </HStack>\n\n <Box\n className=\"about-content\"\n dangerouslySetInnerHTML={{ __html: cleanContent }}\n sx={{\n '& p': { mb: 4, lineHeight: 1.8 },\n '& a': { color: 'blue.600', textDecoration: 'underline', _hover: { color: 'blue.700' } },\n '& blockquote': {\n borderLeft: '4px solid #3182ce',\n paddingLeft: '16px',\n margin: '1em 0',\n color: textSecondary,\n fontStyle: 'italic',\n backgroundColor: 'gray.50',\n padding: '12px 16px',\n borderRadius: '4px',\n },\n '& h1, & h2, & h3': { mt: 6, mb: 3, fontWeight: 'bold' },\n '& h1': { fontSize: '2xl' },\n '& h2': { fontSize: 'xl' },\n '& h3': { fontSize: 'lg' },\n '& img': { maxW: '100%', borderRadius: 'md', my: 4 },\n '& ul, & ol': { pl: 8, mb: 4, listStylePosition: 'outside' },\n '& ul': { listStyleType: 'disc' },\n '& ul[data-bullets=\"disc\"]': { listStyleType: 'disc' },\n '& ul[data-bullets=\"circle\"]': { listStyleType: 'circle' },\n '& ul[data-bullets=\"square\"]': { listStyleType: 'square' },\n '& ul[data-bullets=\"none\"]': { listStyleType: 'none' },\n '& ol': { listStyleType: 'decimal' },\n '& li': { mb: 2 },\n }}\n />\n </Box>\n );\n }\n };\n\n return (\n <MainLayout>\n <Helmet>\n <title>{seoTitle || clubName}</title>\n <meta name=\"description\" content={seoDesc || `Informace o našem klubu, soutěžích, nadcházejících zápasech a rubrikách.`} />\n <meta property=\"og:title\" content={seoTitle || clubName} />\n <meta property=\"og:description\" content={seoDesc || `Informace o našem klubu, soutěžích, nadcházejících zápasech a rubrikách.`} />\n {clubLogo && <meta property=\"og:image\" content={clubLogo} />}\n </Helmet>\n <Container maxW=\"container.lg\" py={8}>\n {renderContent()}\n {renderCategoriesList({ base: 10, md: 12 })}\n </Container>\n\n {/* Newsletter CTA */}\n <NewsletterCTA />\n </MainLayout>\n );\n};\n\nexport default AboutPage;\n","import React from 'react';\nimport {\n Modal,\n ModalOverlay,\n ModalContent,\n ModalBody,\n ModalCloseButton,\n Image,\n Box,\n HStack,\n Button,\n Text,\n VStack,\n Link,\n useColorModeValue,\n Icon,\n} from '@chakra-ui/react';\nimport { ExternalLink, X } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\n\ninterface PhotoModalProps {\n isOpen: boolean;\n onClose: () => void;\n photoUrl: string;\n pageUrl: string;\n albumTitle?: string;\n}\n\nconst PhotoModal: React.FC<PhotoModalProps> = ({\n isOpen,\n onClose,\n photoUrl,\n pageUrl,\n albumTitle,\n}) => {\n const { t } = useTranslation();\n const [imageDimensions, setImageDimensions] = React.useState({ width: 0, height: 0 });\n const [imageLoaded, setImageLoaded] = React.useState(false);\n \n // Color mode values\n const controlsBg = useColorModeValue('white', 'gray.800');\n const controlsBorder = useColorModeValue('gray.200', 'gray.600');\n const controlsText = useColorModeValue('gray.700', 'gray.200');\n\n const handleImageLoad = (event: React.SyntheticEvent<HTMLImageElement>) => {\n const img = event.currentTarget;\n setImageDimensions({\n width: img.naturalWidth,\n height: img.naturalHeight,\n });\n setImageLoaded(true);\n };\n\n // Calculate if close button should be inside or outside based on image aspect ratio\n const shouldShowCloseOutside = imageDimensions.width > imageDimensions.height * 1.5;\n\n return (\n <Modal \n isOpen={isOpen} \n onClose={onClose} \n size=\"full\" \n isCentered\n scrollBehavior=\"inside\"\n >\n <ModalOverlay \n bg=\"blackAlpha.900\" \n backdropFilter=\"blur(8px)\"\n />\n \n {!shouldShowCloseOutside && (\n <ModalCloseButton\n color=\"white\"\n bg=\"blackAlpha.600\"\n _hover={{ bg: 'blackAlpha.800' }}\n size=\"lg\"\n top={4}\n right={4}\n zIndex={10}\n borderRadius=\"full\"\n />\n )}\n \n <ModalContent \n bg=\"transparent\" \n boxShadow=\"none\" \n maxW=\"100vw\" \n maxH=\"100vh\"\n position=\"relative\"\n overflow=\"hidden\"\n >\n <ModalBody p={0} m={0}>\n <VStack spacing={0} align=\"stretch\" h=\"100vh\">\n {/* Image Container */}\n <Box\n flex={1}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n position=\"relative\"\n minH=\"60vh\"\n >\n <Image\n src={photoUrl}\n alt={albumTitle || t('gallery.photo_modal_title')}\n maxH=\"85vh\"\n maxW=\"95vw\"\n objectFit=\"contain\"\n loading=\"eager\"\n onLoad={handleImageLoad}\n fallback={\n <Box \n w=\"400px\" \n h=\"300px\" \n bg=\"gray.200\" \n borderRadius=\"lg\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Text color=\"gray.500\">{t('common.loading')}</Text>\n </Box>\n }\n />\n \n {/* Close button for wide images */}\n {shouldShowCloseOutside && imageLoaded && (\n <Button\n position=\"absolute\"\n top={4}\n right={4}\n color=\"white\"\n bg=\"blackAlpha.600\"\n _hover={{ bg: 'blackAlpha.800' }}\n borderRadius=\"full\"\n p={2}\n minW=\"auto\"\n h=\"auto\"\n onClick={onClose}\n zIndex={10}\n >\n <Icon as={X} boxSize={6} />\n </Button>\n )}\n </Box>\n\n {/* Controls */}\n <Box\n bg={controlsBg}\n borderTop=\"1px solid\"\n borderColor={controlsBorder}\n p={4}\n boxShadow=\"0 -4px 6px -1px rgba(0, 0, 0, 0.1)\"\n >\n <VStack spacing={3} align=\"stretch\" maxW=\"800px\" mx=\"auto\">\n {albumTitle && (\n <Text \n fontSize=\"md\" \n fontWeight=\"600\" \n color={controlsText}\n textAlign=\"center\"\n noOfLines={2}\n >\n {albumTitle}\n </Text>\n )}\n \n <HStack spacing={3} justify=\"center\" flexWrap=\"wrap\">\n <Button\n as=\"a\"\n href={pageUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n leftIcon={<ExternalLink size={18} />}\n colorScheme=\"purple\"\n size=\"sm\"\n variant=\"solid\"\n >\n {t('gallery.view_original')}\n </Button>\n \n <Button\n onClick={onClose}\n colorScheme=\"gray\"\n size=\"sm\"\n variant=\"outline\"\n >\n {t('common.close')}\n </Button>\n </HStack>\n </VStack>\n </Box>\n </VStack>\n </ModalBody>\n </ModalContent>\n </Modal>\n );\n};\n\nexport default PhotoModal;\n","import React, { useEffect, useState } from 'react';\nimport { useParams, Link as RouterLink } from 'react-router-dom';\nimport {\n Box,\n Container,\n Heading,\n Text,\n SimpleGrid,\n Image,\n Spinner,\n VStack,\n HStack,\n Button,\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n useDisclosure,\n Badge,\n useColorModeValue,\n} from '@chakra-ui/react';\nimport { ChevronRight, ExternalLink, Calendar, Image as ImageIcon } from 'lucide-react';\nimport MainLayout from '../components/layout/MainLayout';\nimport { API_URL } from '../services/api';\nimport PhotoModal from '../components/gallery/PhotoModal';\nimport CommentsSection from '../components/comments/CommentsSection';\nimport { Helmet } from 'react-helmet-async';\nimport { useTranslation } from 'react-i18next';\n\ninterface Photo {\n id: string;\n page_url: string;\n image_1500: string;\n}\n\ninterface Album {\n id: string;\n title: string;\n url: string;\n date: string;\n photos_count: number;\n views_count?: number;\n photos: Photo[];\n fetched_at?: string;\n}\n\nconst resolveBackendUrl = (path: string) => {\n try {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (path.startsWith('/cache') || path.startsWith('/uploads') || path.startsWith('/api/')) {\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n const abs = new URL(path, origin);\n return abs.toString();\n }\n return path;\n } catch {\n return path;\n }\n};\n\nconst AlbumDetailPage: React.FC = () => {\n const { t } = useTranslation();\n const { id } = useParams<{ id: string }>();\n const [album, setAlbum] = useState<Album | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string>('');\n const [selectedPhoto, setSelectedPhoto] = useState<Photo | null>(null);\n const { isOpen, onOpen, onClose } = useDisclosure();\n \n // Dark mode colors\n const bgColor = useColorModeValue('#f8f9fb', '#0f1115');\n const cardBg = useColorModeValue('white', '#1a1d29');\n const borderColor = useColorModeValue('#e5e7eb', '#2a2e3a');\n const headingColor = useColorModeValue('gray.800', 'gray.100');\n const textSecondary = useColorModeValue('gray.600', 'gray.300');\n const infoBg = useColorModeValue('blue.50', 'blue.900');\n const infoBorder = useColorModeValue('blue.200', 'blue.700');\n const infoText = useColorModeValue('blue.800', 'blue.200');\n\n useEffect(() => {\n const fetchAlbum = async () => {\n if (!id) return;\n \n setLoading(true);\n setError('');\n \n try {\n // Check both sources for the album\n const [profileRes, albumsRes] = await Promise.allSettled([\n fetch(resolveBackendUrl('/cache/prefetch/zonerama_profile.json'), { cache: 'no-cache' }),\n fetch(resolveBackendUrl('/cache/prefetch/zonerama_albums.json'), { cache: 'no-cache' })\n ]);\n \n let foundAlbum: Album | null = null;\n \n // Try profile albums first (newest/main source)\n if (profileRes.status === 'fulfilled' && profileRes.value.ok) {\n const profileData = await profileRes.value.json();\n const albums = profileData.albums || [];\n foundAlbum = albums.find((a: Album) => a.id === id);\n }\n \n // If not found, try blog-related albums\n if (!foundAlbum && albumsRes.status === 'fulfilled' && albumsRes.value.ok) {\n const albumsData = await albumsRes.value.json();\n const blogAlbums = Array.isArray(albumsData) ? albumsData : [];\n foundAlbum = blogAlbums.find((a: Album) => a.id === id);\n }\n\n // Fallback: fetch album directly via zonerama-album API using the numeric ID\n if (!foundAlbum) {\n try {\n const albumUrl = `https://eu.zonerama.com/Album/${id}`;\n const params = new URLSearchParams({\n link: albumUrl,\n photo_limit: '200',\n rendered: 'true',\n });\n const resp = await fetch(`${API_URL}/zonerama-album?${params.toString()}`);\n if (resp.ok) {\n const payload = await resp.json();\n let albumData: any = null;\n let photos: any[] = [];\n\n if (Array.isArray(payload?.albums) && payload.albums.length > 0) {\n albumData = payload.albums[0];\n photos = albumData.photos || [];\n } else if (payload?.album && Array.isArray(payload?.photos)) {\n albumData = payload.album;\n photos = payload.photos;\n }\n\n if (albumData) {\n const mapped: Album = {\n id: String(albumData.id || id),\n title: String(albumData.title || ''),\n url: String(albumData.url || albumUrl),\n date: String(albumData.date || ''),\n photos_count: Array.isArray(photos) ? photos.length : 0,\n views_count: typeof albumData.views_count === 'number' ? albumData.views_count : undefined,\n photos: (photos || []).map((p: any) => ({\n id: String(p.id || ''),\n page_url: String(p.page_url || ''),\n image_1500: String(p.image_1500 || ''),\n })),\n fetched_at: albumData.fetched_at,\n };\n setAlbum(mapped);\n return;\n }\n }\n } catch {\n // ignore and fall through to error handling below\n }\n\n throw new Error('Album nenalezeno');\n }\n \n setAlbum(foundAlbum);\n } catch (err: any) {\n setError(err.message || 'Chyba při načítání alba');\n } finally {\n setLoading(false);\n }\n };\n\n fetchAlbum();\n }, [id]);\n\n const handlePhotoClick = (photo: Photo) => {\n setSelectedPhoto(photo);\n onOpen();\n };\n\n const handleCloseModal = () => {\n onClose();\n setSelectedPhoto(null);\n };\n\n if (loading) {\n return (\n <MainLayout>\n <Container maxW=\"7xl\" py={8}>\n <VStack spacing={4}>\n <Spinner size=\"xl\" color=\"brand.primary\" />\n <Text color={textSecondary}>{t('gallery.loading_album')}</Text>\n </VStack>\n </Container>\n </MainLayout>\n );\n }\n\n if (error || !album) {\n return (\n <MainLayout>\n <Container maxW=\"7xl\" py={8}>\n <VStack spacing={4}>\n <Text color=\"red.500\" fontSize=\"lg\">\n {error || t('gallery.album_not_found')}\n </Text>\n <Button as={RouterLink} to=\"/galerie\" colorScheme=\"blue\">\n {t('gallery.back_to_gallery')}\n </Button>\n </VStack>\n </Container>\n </MainLayout>\n );\n }\n\n return (\n <MainLayout>\n <Helmet>\n <title>{album.title} | {t('gallery.page_title')}</title>\n <meta name=\"description\" content={`${t('gallery.page_title')}: ${album.title}.`} />\n </Helmet>\n <Box bg={bgColor} minH=\"100vh\" py={8}>\n <Container maxW=\"7xl\">\n {/* Breadcrumbs */}\n <Breadcrumb\n spacing={2}\n separator={<ChevronRight size={16} color=\"gray\" />}\n mb={6}\n fontSize=\"sm\"\n >\n <BreadcrumbItem>\n <BreadcrumbLink as={RouterLink} to=\"/\">\n {t('nav.home')}\n </BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbItem>\n <BreadcrumbLink as={RouterLink} to=\"/galerie\">\n {t('nav.gallery')}\n </BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbItem isCurrentPage>\n <BreadcrumbLink>{album.title}</BreadcrumbLink>\n </BreadcrumbItem>\n </Breadcrumb>\n\n {/* Album Header */}\n <VStack align=\"stretch\" spacing={4} mb={8}>\n <HStack justify=\"space-between\" align=\"start\" flexWrap=\"wrap\" gap={4}>\n <VStack align=\"start\" spacing={2} flex={1}>\n <Heading size=\"xl\" color={headingColor}>\n {album.title}\n </Heading>\n <HStack spacing={4} flexWrap=\"wrap\" fontSize=\"sm\" color={textSecondary}>\n {album.date && (\n <HStack spacing={1}>\n <Calendar size={16} />\n <Text>{album.date}</Text>\n </HStack>\n )}\n <HStack spacing={1}>\n <ImageIcon size={16} />\n <Text>\n {album.photos_count === 1 \n ? t('gallery.photos_count_one', { count: album.photos_count })\n : (album.photos_count >= 2 && album.photos_count <= 4)\n ? t('gallery.photos_count_few', { count: album.photos_count })\n : t('gallery.photos_count_many', { count: album.photos_count })\n }\n </Text>\n </HStack>\n {album.views_count !== undefined && album.views_count > 0 && (\n <Badge colorScheme=\"purple\">\n {album.views_count === 1 \n ? t('gallery.views_count_one', { count: album.views_count })\n : (album.views_count >= 2 && album.views_count <= 4)\n ? t('gallery.views_count_few', { count: album.views_count })\n : t('gallery.views_count_many', { count: album.views_count })\n }\n </Badge>\n )}\n </HStack>\n </VStack>\n \n <Button\n as=\"a\"\n href={album.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n rightIcon={<ExternalLink size={18} />}\n colorScheme=\"purple\"\n size=\"md\"\n >\n {t('gallery.view_on_zonerama')}\n </Button>\n </HStack>\n\n {/* Zonerama Attribution */}\n <Box\n bg={infoBg}\n borderWidth=\"1px\"\n borderColor={infoBorder}\n borderRadius=\"md\"\n p={3}\n >\n <Text fontSize=\"sm\" color={infoText}>\n {t('gallery.photos_from_zonerama')}{' '}\n <Text\n as=\"a\"\n href={album.url || 'https://zonerama.com'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n fontWeight=\"600\"\n color=\"blue.600\"\n _hover={{ textDecoration: 'underline' }}\n >\n Zonerama\n </Text>\n </Text>\n </Box>\n </VStack>\n\n {/* Photo Grid */}\n {album.photos && album.photos.length > 0 ? (\n <SimpleGrid columns={{ base: 2, md: 3, lg: 4, xl: 5 }} spacing={4}>\n {album.photos.map((photo) => (\n <Box\n key={photo.id}\n cursor=\"pointer\"\n onClick={() => handlePhotoClick(photo)}\n borderRadius=\"lg\"\n overflow=\"hidden\"\n boxShadow=\"md\"\n borderWidth=\"1px\"\n borderColor={borderColor}\n transition=\"all 0.2s\"\n _hover={{ transform: 'translateY(-4px)', boxShadow: 'xl', borderColor: useColorModeValue('gray.300', 'gray.600') }}\n bg={cardBg}\n >\n <Image\n src={resolveBackendUrl(photo.image_1500)}\n alt={`Fotka ${photo.id}`}\n w=\"100%\"\n h=\"200px\"\n objectFit=\"cover\"\n loading=\"lazy\"\n />\n </Box>\n ))}\n </SimpleGrid>\n ) : (\n <Box\n bg=\"bg.card\"\n borderWidth=\"1px\"\n borderColor=\"border.subtle\"\n borderRadius=\"lg\"\n p={8}\n textAlign=\"center\"\n >\n <Text color=\"gray.500\">\n {t('gallery.no_photos_in_album')}\n </Text>\n </Box>\n )}\n\n {/* Comments */}\n {album.id && (\n <Box mt={6}>\n <CommentsSection targetType=\"gallery_album\" targetId={String(album.id)} />\n </Box>\n )}\n </Container>\n </Box>\n\n {/* Photo Modal */}\n {selectedPhoto && (\n <PhotoModal\n isOpen={isOpen}\n onClose={handleCloseModal}\n photoUrl={resolveBackendUrl(selectedPhoto.image_1500)}\n pageUrl={selectedPhoto.page_url}\n albumTitle={album.title}\n />\n )}\n </MainLayout>\n );\n};\n\nexport default AlbumDetailPage;\n","import React, { useState } from 'react';\nimport {\n Box,\n Container,\n Heading,\n VStack,\n SimpleGrid,\n Spinner,\n Text,\n Alert,\n AlertIcon,\n Tabs,\n TabList,\n TabPanels,\n Tab,\n TabPanel,\n Badge,\n useColorModeValue,\n} from '@chakra-ui/react';\nimport { useQuery } from '@tanstack/react-query';\nimport MainLayout from '../components/layout/MainLayout';\nimport PollCard from '../components/polls/PollCard';\nimport { getPolls, getPoll } from '../services/polls';\n\nconst PollsPage: React.FC = () => {\n const [tabIndex, setTabIndex] = useState(0);\n const bgSection = useColorModeValue('white', 'gray.800');\n\n // Fetch all active polls\n const { data: polls, isLoading } = useQuery({\n queryKey: ['polls'],\n queryFn: () => getPolls(),\n staleTime: 2 * 60 * 1000,\n });\n\n // Get full data for each poll\n const { data: pollsData, isLoading: isLoadingPolls } = useQuery({\n queryKey: ['polls-details', polls?.map((p) => p.id)],\n queryFn: async () => {\n if (!polls || polls.length === 0) return [];\n const promises = polls.map((poll) => getPoll(poll.id));\n return await Promise.all(promises);\n },\n enabled: !!polls && polls.length > 0,\n });\n\n // Filter polls\n const featuredPolls = pollsData?.filter((p) => p.poll.featured) || [];\n const activePolls = pollsData?.filter((p) => p.is_active) || [];\n const allPolls = pollsData || [];\n\n if (isLoading || isLoadingPolls) {\n return (\n <MainLayout>\n <Container maxW=\"7xl\" py={8}>\n <VStack spacing={4}>\n <Spinner size=\"xl\" />\n <Text>Načítání anket...</Text>\n </VStack>\n </Container>\n </MainLayout>\n );\n }\n\n if (!polls || polls.length === 0) {\n return (\n <MainLayout>\n <Container maxW=\"7xl\" py={8}>\n <VStack spacing={6} align=\"stretch\">\n <Heading size=\"xl\">Ankety a hlasování</Heading>\n <Alert status=\"info\">\n <AlertIcon />\n Momentálně nejsou k dispozici žádné ankety. Brzy přidáme nové!\n </Alert>\n </VStack>\n </Container>\n </MainLayout>\n );\n }\n\n return (\n <MainLayout>\n <Box bg={bgSection} minH=\"100vh\">\n <Container maxW=\"7xl\" py={8}>\n <VStack spacing={8} align=\"stretch\">\n <VStack spacing={2} align=\"start\">\n <Heading size=\"xl\">Ankety a hlasování</Heading>\n <Text color=\"gray.600\">\n Hlasujte v anketách a podělte se o svůj názor s ostatními fanoušky!\n </Text>\n </VStack>\n\n <Tabs index={tabIndex} onChange={setTabIndex} colorScheme=\"blue\">\n <TabList>\n <Tab>\n Všechny\n {allPolls.length > 0 && (\n <Badge ml={2} colorScheme=\"blue\">\n {allPolls.length}\n </Badge>\n )}\n </Tab>\n <Tab>\n Aktivní\n {activePolls.length > 0 && (\n <Badge ml={2} colorScheme=\"green\">\n {activePolls.length}\n </Badge>\n )}\n </Tab>\n {featuredPolls.length > 0 && (\n <Tab>\n Zvýrazněné\n <Badge ml={2} colorScheme=\"purple\">\n {featuredPolls.length}\n </Badge>\n </Tab>\n )}\n </TabList>\n\n <TabPanels>\n {/* All Polls */}\n <TabPanel>\n <SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} spacing={6}>\n {allPolls.map((pollResponse) => (\n <PollCard\n key={pollResponse.poll.id}\n poll={pollResponse.poll}\n hasVoted={pollResponse.has_voted}\n isActive={pollResponse.is_active}\n canShowResults={pollResponse.can_show_results}\n />\n ))}\n </SimpleGrid>\n </TabPanel>\n\n {/* Active Polls */}\n <TabPanel>\n {activePolls.length > 0 ? (\n <SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} spacing={6}>\n {activePolls.map((pollResponse) => (\n <PollCard\n key={pollResponse.poll.id}\n poll={pollResponse.poll}\n hasVoted={pollResponse.has_voted}\n isActive={pollResponse.is_active}\n canShowResults={pollResponse.can_show_results}\n />\n ))}\n </SimpleGrid>\n ) : (\n <Alert status=\"info\">\n <AlertIcon />\n Momentálně nejsou k dispozici žádné aktivní ankety.\n </Alert>\n )}\n </TabPanel>\n\n {/* Featured Polls */}\n {featuredPolls.length > 0 && (\n <TabPanel>\n <SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} spacing={6}>\n {featuredPolls.map((pollResponse) => (\n <PollCard\n key={pollResponse.poll.id}\n poll={pollResponse.poll}\n hasVoted={pollResponse.has_voted}\n isActive={pollResponse.is_active}\n canShowResults={pollResponse.can_show_results}\n />\n ))}\n </SimpleGrid>\n </TabPanel>\n )}\n </TabPanels>\n </Tabs>\n </VStack>\n </Container>\n </Box>\n </MainLayout>\n );\n};\n\nexport default PollsPage;\n","import api from './api';\n\nexport type SetupStatus = {\n requires_setup: boolean;\n};\n\nexport type SetupInitializePayload = {\n admin_email: string;\n admin_password: string;\n first_name?: string;\n last_name?: string;\n jwt_secret?: string;\n club_id?: string;\n club_type?: string;\n club_name?: string;\n club_logo_url?: string;\n club_url?: string;\n // deployment bases\n frontend_base_url?: string;\n api_base_url?: string;\n frontpage_style?: 'unified' | 'magazine' | 'pro' | 'edge';\n primary_color?: string;\n secondary_color?: string;\n accent_color?: string;\n background_color?: string;\n text_color?: string;\n font_heading?: string;\n font_body?: string;\n // social & gallery (optional)\n facebook_url?: string;\n instagram_url?: string;\n youtube_url?: string;\n gallery_url?: string;\n gallery_label?: string;\n // location/contact info (optional)\n contact_address?: string;\n contact_city?: string;\n contact_zip?: string;\n contact_country?: string;\n contact_phone?: string;\n contact_email?: string;\n location_latitude?: number;\n location_longitude?: number;\n map_style?: string;\n map_zoom_level?: number;\n smtp?: {\n host?: string;\n port?: number;\n username?: string;\n password?: string;\n from?: string;\n use_tls?: boolean;\n } | null;\n};\n\nexport const getSetupStatus = async (): Promise<SetupStatus> => {\n const res = await api.get('/setup/status');\n return res.data;\n};\n\nexport const initializeSetup = async (payload: SetupInitializePayload): Promise<{ message: string }> => {\n const res = await api.post('/setup/initialize', payload, { timeout: 30000 });\n return res.data;\n};\n\nexport type SMTPValidationPayload = {\n host: string;\n port: number;\n username?: string;\n password?: string;\n from?: string;\n use_tls?: boolean;\n};\n\nexport const validateSMTP = async (payload: SMTPValidationPayload): Promise<{ ok: boolean; message?: string; error?: string }> => {\n const res = await api.post('/setup/validate-smtp', payload, { timeout: 30000 });\n return res.data;\n};\n","import api from './api';\n\nexport type TargetType = 'article' | 'event' | 'gallery_album' | 'youtube_video';\n\nexport type CommentItem = {\n id: number;\n target_type: TargetType;\n target_id: string;\n target_label?: string;\n parent_id?: number | null;\n content: string;\n content_html?: string;\n status?: 'visible' | 'hidden';\n is_edited?: boolean;\n edited_at?: string | null;\n created_at: string;\n updated_at: string;\n reactions?: Record<string, number>;\n my_reaction?: string;\n admin_liked?: boolean;\n user: {\n id: number;\n first_name?: string;\n last_name?: string;\n role?: string;\n username?: string;\n avatar_url?: string;\n };\n};\n\nexport type CommentsResponse = {\n items: CommentItem[];\n total: number;\n page: number;\n page_size: number;\n};\n\nexport async function listComments(params: { target_type: TargetType; target_id: string; page?: number; page_size?: number; }): Promise<CommentsResponse> {\n const res = await api.get('/comments', { params });\n return res.data as CommentsResponse;\n}\n\nexport async function createComment(body: { target_type: TargetType; target_id: string; content: string; parent_id?: number | null; }): Promise<CommentItem> {\n const res = await api.post('/comments', body);\n return res.data as CommentItem;\n}\n\nexport async function updateComment(id: number, body: { content: string; }): Promise<CommentItem> {\n const res = await api.put(`/comments/${id}`, body);\n return res.data as CommentItem;\n}\n\nexport async function deleteComment(id: number): Promise<{ ok: boolean }>{\n const res = await api.delete(`/comments/${id}`);\n return res.data as { ok: boolean };\n}\n\nexport async function reactComment(id: number, type: string): Promise<{ ok: boolean }>{\n const res = await api.post(`/comments/${id}/react`, { type });\n return res.data as { ok: boolean };\n}\n\nexport async function unreactComment(id: number): Promise<{ ok: boolean }>{\n const res = await api.delete(`/comments/${id}/react`);\n return res.data as { ok: boolean };\n}\n\nexport async function requestUnban(message: string): Promise<{ ok: boolean }>{\n const res = await api.post('/comments/unban-request', { message });\n return res.data as { ok: boolean };\n}\n\nexport async function reportComment(id: number, reason?: string): Promise<{ ok: boolean }>{\n const res = await api.post(`/comments/${id}/report`, { reason });\n return res.data as { ok: boolean };\n}\n","// Shared definitions of AI text models and simple env-based toggles\n\nexport type AITextProvider = 'deepseek' | 'mistral' | 'openrouter' | 'grok';\n\n// Stable identifiers for text models selectable in the UI\nexport type AITextModelId =\n | 'deepseek-chat'\n | 'deepseek-reasoner'\n | 'mistral-small-latest'\n | 'ministral-14b-latest'\n | 'openrouter-primary'\n | 'grok-4-1-fast-non-reasoning'\n | 'grok-4-1-fast-reasoning';\n\nexport interface AITextModelOption {\n id: AITextModelId;\n label: string;\n provider: AITextProvider;\n description?: string;\n}\n\nconst ALL_TEXT_MODELS: AITextModelOption[] = [\n {\n id: 'deepseek-chat',\n label: 'DeepSeek Chat',\n provider: 'deepseek',\n description: 'Rychlý univerzální model pro textové úlohy.',\n },\n {\n id: 'deepseek-reasoner',\n label: 'DeepSeek Reasoner',\n provider: 'deepseek',\n description: 'Model zaměřený na hlubší vysvětlování a řetězení úvah.',\n },\n {\n id: 'mistral-small-latest',\n label: 'Mistral Small',\n provider: 'mistral',\n description: 'Lehčí Mistral pro rychlejší odpovědi.',\n },\n {\n id: 'ministral-14b-latest',\n label: 'Ministral 14B',\n provider: 'mistral',\n description: 'Výkonnější Mistral 14B pro kvalitnější text.',\n },\n {\n id: 'openrouter-primary',\n label: 'OpenRouter (výchozí)',\n provider: 'openrouter',\n description: 'Konfigurace OpenRouter dle backendu.',\n },\n {\n id: 'grok-4-1-fast-non-reasoning',\n label: 'Grok 4.1 Fast',\n provider: 'grok',\n description: 'Rychlý model od xAI pro běžné úlohy.',\n },\n {\n id: 'grok-4-1-fast-reasoning',\n label: 'Grok 4.1 Fast Reasoning',\n provider: 'grok',\n description: 'Model s reasoning pro hlubší analýzu (může trvat déle).',\n },\n];\n\nfunction parseBoolEnv(name: string): boolean {\n const raw = (process.env[name] || '').toString().trim().toLowerCase();\n if (!raw) return false;\n return raw === '1' || raw === 'true' || raw === 'yes';\n}\n\n/**\n * Vrátí textové modely povolené pro výběr v UI.\n *\n * Pokud je v prostředí zapnutý OpenRouter mód (REACT_APP_OPENROUTER_ON),\n * zobrazí se pouze OpenRouter model. Jinak jsou dostupné DeepSeek + Mistral + Grok.\n */\nexport function getEnabledTextModels(): AITextModelOption[] {\n try {\n const openrouterOn = parseBoolEnv('REACT_APP_OPENROUTER_ON');\n\n if (openrouterOn) {\n return ALL_TEXT_MODELS.filter((m) => m.provider === 'openrouter');\n }\n\n return ALL_TEXT_MODELS.filter((m) => m.provider !== 'openrouter');\n } catch (error) {\n // Fallback in case of any errors during initialization\n return ALL_TEXT_MODELS.filter((m) => m.provider === 'deepseek' || m.provider === 'mistral');\n }\n}\n\nexport function getDefaultTextModelId(): AITextModelId {\n try {\n const models = getEnabledTextModels();\n return models[0]?.id ?? 'deepseek-chat';\n } catch (error) {\n // Ultimate fallback\n return 'deepseek-chat';\n }\n}\n\nexport function findTextModel(id: AITextModelId): AITextModelOption | undefined {\n return ALL_TEXT_MODELS.find((m) => m.id === id);\n}\n","import api from './api';\nimport { assetUrl } from '../utils/url';\n\nexport interface ImageProcessRequest {\n image_url: string;\n operation?: string;\n width?: number;\n height?: number;\n crop_x?: number;\n crop_y?: number;\n crop_width?: number;\n crop_height?: number;\n rotation?: number;\n flip_h?: boolean;\n flip_v?: boolean;\n brightness?: number;\n contrast?: number;\n saturation?: number;\n blur?: number;\n sharpen?: number;\n grayscale?: boolean;\n quality?: number;\n}\n\nexport interface QuickEditRequest {\n image_url: string;\n width?: number;\n rotation?: number;\n flip_h?: boolean;\n flip_v?: boolean;\n brightness?: number;\n contrast?: number;\n saturation?: number;\n grayscale?: boolean;\n quality?: number;\n}\n\nexport interface ImageProcessResponse {\n url: string;\n format?: string;\n}\n\n/**\n * Process image with various operations (crop, resize, filters, etc.)\n */\nexport const processImage = async (request: ImageProcessRequest): Promise<ImageProcessResponse> => {\n const response = await api.post('/image-processing/process', request);\n const data = response.data || {};\n if (data && typeof data.url === 'string') {\n data.url = assetUrl(data.url) || data.url;\n }\n return data;\n};\n\n/**\n * Quick edit for common operations in one call\n */\nexport const quickEditImage = async (request: QuickEditRequest): Promise<ImageProcessResponse> => {\n const response = await api.post('/image-processing/quick-edit', request);\n const data = response.data || {};\n if (data && typeof data.url === 'string') {\n data.url = assetUrl(data.url) || data.url;\n }\n return data;\n};\n\n/**\n * Crop and upload image file\n */\nexport const cropAndUpload = async (\n file: File,\n cropData?: { x: number; y: number; width: number; height: number },\n quality = 85,\n maxWidth = 1500\n): Promise<ImageProcessResponse> => {\n const formData = new FormData();\n formData.append('image', file);\n \n if (cropData) {\n formData.append('crop_data', JSON.stringify(cropData));\n }\n \n formData.append('quality', quality.toString());\n formData.append('max_width', maxWidth.toString());\n \n const response = await api.post('/image-processing/crop-upload', formData, {\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n });\n const data = response.data || {};\n if (data && typeof data.url === 'string') {\n data.url = assetUrl(data.url) || data.url;\n }\n return data;\n};\n\n/**\n * Resize image to specific width (maintains aspect ratio)\n */\nexport const resizeImage = async (imageUrl: string, width: number, quality = 85): Promise<ImageProcessResponse> => {\n return quickEditImage({\n image_url: imageUrl,\n width,\n quality,\n });\n};\n\n/**\n * Apply filters to image\n */\nexport const applyFilters = async (\n imageUrl: string,\n filters: {\n brightness?: number;\n contrast?: number;\n saturation?: number;\n blur?: number;\n grayscale?: boolean;\n },\n quality = 85\n): Promise<ImageProcessResponse> => {\n return quickEditImage({\n image_url: imageUrl,\n ...filters,\n quality,\n });\n};\n\n/**\n * Rotate image (90, 180, 270 degrees)\n */\nexport const rotateImage = async (imageUrl: string, rotation: number, quality = 85): Promise<ImageProcessResponse> => {\n return quickEditImage({\n image_url: imageUrl,\n rotation,\n quality,\n });\n};\n\n/**\n * Flip image horizontally or vertically\n */\nexport const flipImage = async (\n imageUrl: string,\n flipH: boolean,\n flipV: boolean,\n quality = 85\n): Promise<ImageProcessResponse> => {\n return quickEditImage({\n image_url: imageUrl,\n flip_h: flipH,\n flip_v: flipV,\n quality,\n });\n};\n","import React, { useRef, useCallback, useState, useEffect, useMemo } from 'react';\nimport { \n Box, \n Button, \n HStack, \n Modal, \n ModalOverlay, \n ModalContent, \n ModalHeader, \n ModalCloseButton, \n ModalBody, \n ModalFooter,\n FormControl,\n FormLabel,\n FormHelperText,\n Input,\n Text,\n SimpleGrid,\n useToast,\n VStack,\n ButtonGroup,\n IconButton,\n Tooltip,\n Drawer,\n DrawerOverlay,\n DrawerContent,\n DrawerHeader,\n DrawerCloseButton,\n DrawerBody,\n DrawerFooter,\n Textarea,\n AlertDialog,\n AlertDialogOverlay,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogCloseButton,\n AlertDialogBody,\n AlertDialogFooter,\n Checkbox,\n} from '@chakra-ui/react';\nimport ReactQuill from 'react-quill';\nimport ReactCrop, { Crop } from 'react-image-crop';\nimport DOMPurify from 'dompurify';\nimport 'quill/dist/quill.snow.css';\nimport 'react-image-crop/dist/ReactCrop.css';\nimport '../../styles/custom-editor.css';\nimport { \n Image as ImageIcon, Code, Type, Trash2, AlignLeft, AlignCenter, AlignRight,\n RotateCw, RotateCcw, FlipHorizontal, FlipVertical, Sun, Droplets, Eye,\n Sparkles, Contrast, ZoomIn, ZoomOut, Move, Maximize2, Settings,\n Circle, Square, X, Check, Filter\n} from 'lucide-react';\nimport { Image as ChakraImage } from '@chakra-ui/react';\nimport { cropAndUpload, quickEditImage } from '../../services/imageProcessing';\nimport { assetUrl } from '../../utils/url';\n\ninterface ImageFilters {\n brightness: number;\n contrast: number;\n saturation: number;\n blur: number;\n grayscale: number;\n sepia: number;\n hueRotate: number;\n rotation: number;\n flipH: boolean;\n flipV: boolean;\n}\n\ninterface CustomRichEditorProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n height?: string;\n readOnly?: boolean;\n onImageUpload?: (file: File) => Promise<{ url: string }>;\n showImageResize?: boolean;\n toolbar?: 'full' | 'basic' | 'minimal';\n}\n\nconst CustomRichEditor: React.FC<CustomRichEditorProps> = ({\n value,\n onChange,\n placeholder = 'Začněte psát...',\n height = '400px',\n readOnly = false,\n onImageUpload,\n showImageResize = true,\n toolbar = 'full',\n}) => {\n const toast = useToast();\n const quillRef = useRef<ReactQuill | null>(null);\n const toolbarRef = useRef<HTMLDivElement | null>(null);\n const onChangeRef = useRef(onChange);\n const changeDebounceRef = useRef<number | null>(null);\n const lastContentRef = useRef<string>('');\n const selectedImageIdRef = useRef<string | null>(null);\n const selectImageByIdRef = useRef<(id: string) => void>(() => {});\n const toolbarDragRef = useRef<{ active: boolean; startX: number; startY: number; startLeft: number; startTop: number }>({ active: false, startX: 0, startY: 0, startLeft: 0, startTop: 0 });\n const [isMounted, setIsMounted] = useState(false);\n \n // Ensure component is mounted before rendering Quill\n useEffect(() => {\n setIsMounted(true);\n return () => setIsMounted(false);\n }, []);\n \n // Keep onChange ref up to date\n useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n // Cleanup debounced change handler on unmount\n useEffect(() => {\n return () => {\n if (changeDebounceRef.current !== null) {\n window.clearTimeout(changeDebounceRef.current);\n changeDebounceRef.current = null;\n }\n };\n }, []);\n \n // Crop modal state\n const [cropOpen, setCropOpen] = useState(false);\n const [cropSrc, setCropSrc] = useState<string | null>(null);\n const [cropFile, setCropFile] = useState<File | null>(null);\n const [crop, setCrop] = useState<Crop>({ unit: '%', width: 80, height: 80, x: 10, y: 10 });\n const [cropQuality, setCropQuality] = useState<number>(85);\n const [cropMaxWidth, setCropMaxWidth] = useState<number>(1600);\n const [cropProcessing, setCropProcessing] = useState(false);\n const imgRef = useRef<HTMLImageElement | null>(null);\n\n // Link modal state\n const [isLinkOpen, setIsLinkOpen] = useState(false);\n const [linkText, setLinkText] = useState('');\n const [linkUrl, setLinkUrl] = useState('');\n const linkRangeRef = useRef<{ index: number; length: number } | null>(null);\n\n const [isHtmlEditorOpen, setIsHtmlEditorOpen] = useState(false);\n const [htmlSource, setHtmlSource] = useState('');\n const htmlRangeRef = useRef<{ index: number; length: number } | null>(null);\n const htmlSwitchingRef = useRef(false);\n const [MonacoComponent, setMonacoComponent] = useState<React.ComponentType<any> | null>(null);\n const [htmlEditMode, setHtmlEditMode] = useState<'block' | 'document'>('block');\n const [isFullHtmlConfirmOpen, setIsFullHtmlConfirmOpen] = useState(false);\n const confirmCancelRef = useRef<HTMLButtonElement | null>(null);\n const [confirmDontAsk, setConfirmDontAsk] = useState(false);\n const pendingSanitizedRef = useRef<string>('');\n const pendingRawRef = useRef<string>('');\n\n // Force white mode for better readability in admin\n const borderColor = 'gray.200';\n const bgColor = 'white';\n const hoverBg = 'gray.50';\n const toolbarBg = 'white';\n const toolbarBorder = 'gray.200';\n \n // Image editing state\n const [selectedImageElement, setSelectedImageElement] = useState<HTMLImageElement | null>(null);\n const [imageFilters, setImageFilters] = useState<ImageFilters>({\n brightness: 100,\n contrast: 100,\n saturation: 100,\n blur: 0,\n grayscale: 0,\n sepia: 0,\n hueRotate: 0,\n rotation: 0,\n flipH: false,\n flipV: false,\n });\n const [showImageToolbar, setShowImageToolbar] = useState(false);\n const [toolbarPosition, setToolbarPosition] = useState({ top: 0, left: 0 });\n const [previewImage, setPreviewImage] = useState<string | null>(null);\n const [isPreviewOpen, setIsPreviewOpen] = useState(false);\n const [imageWidth, setImageWidth] = useState<number>(0);\n const [manualWidth, setManualWidth] = useState<string>('');\n const [widthPercent, setWidthPercent] = useState<number>(0);\n\n // Define toolbar configurations\n const toolbarConfigs = {\n full: [\n [{ header: [1, 2, 3, false] }],\n ['bold', 'italic', 'underline', 'strike'],\n [{ color: [] }, { background: [] }],\n [{ list: 'ordered' }, { list: 'bullet' }],\n [{ align: [] }],\n ['link', 'image'],\n ['blockquote'],\n ['clean'],\n ],\n basic: [\n [{ header: [1, 2, 3, false] }],\n ['bold', 'italic', 'underline'],\n [{ list: 'ordered' }, { list: 'bullet' }],\n [{ align: [] }],\n ['link', 'image'],\n ['clean'],\n ],\n minimal: [\n ['bold', 'italic', 'underline'],\n [{ list: 'bullet' }],\n ['link'],\n ['clean'],\n ],\n };\n\n const toolbarConfig = useMemo(() => {\n return toolbarConfigs[toolbar] || toolbarConfigs.full;\n }, [toolbar]);\n\n // Clean transient selection styles before saving HTML\n const cleanEditorHTML = useCallback((html: string): string => {\n try {\n const wrapper = document.createElement('div');\n wrapper.innerHTML = html || '';\n const imgs = wrapper.querySelectorAll('img');\n imgs.forEach((img) => {\n try {\n img.removeAttribute('draggable');\n const style = (img.getAttribute('style') || '').trim();\n if (style) {\n // Remove outline, box-shadow, cursor declarations\n const filtered = style\n .split(';')\n .map((s) => s.trim())\n .filter(Boolean)\n .filter((decl) => {\n const k = decl.split(':')[0]?.trim().toLowerCase();\n return k !== 'outline' && k !== 'box-shadow' && k !== 'cursor';\n })\n .join('; ');\n if (filtered) img.setAttribute('style', filtered);\n else img.removeAttribute('style');\n }\n } catch {}\n });\n return wrapper.innerHTML;\n } catch {\n return html;\n }\n }, []);\n\n const handleChange = useCallback(\n (content: string, _delta: any, source: string) => {\n if (readOnly) return;\n if (source !== 'user') return;\n\n const cleaned = cleanEditorHTML(content || '');\n\n if (cleaned === lastContentRef.current) return;\n lastContentRef.current = cleaned;\n\n if (changeDebounceRef.current !== null) {\n window.clearTimeout(changeDebounceRef.current);\n }\n\n changeDebounceRef.current = window.setTimeout(() => {\n changeDebounceRef.current = null;\n try {\n onChangeRef.current(cleaned);\n } catch (e) {\n console.error('CustomRichEditor onChange error', e);\n }\n }, 150);\n },\n [readOnly, cleanEditorHTML]\n );\n\n // Image upload handler\n const handleImageUpload = useCallback(() => {\n const input = document.createElement('input');\n input.setAttribute('type', 'file');\n input.setAttribute('accept', 'image/*');\n input.onchange = async () => {\n const file = (input.files || [])[0];\n if (!file) return;\n setCropFile(file);\n const reader = new FileReader();\n reader.onload = () => {\n setCropSrc(reader.result as string);\n setCropOpen(true);\n };\n reader.readAsDataURL(file);\n };\n input.click();\n }, []);\n\n // Memoize modules to prevent Quill reinitialization\n const handleLinkToolbar = useCallback(() => {\n const quill = quillRef.current?.getEditor();\n if (!quill) return;\n const range = quill.getSelection();\n const index = range ? range.index : quill.getLength();\n const length = range ? range.length : 0;\n linkRangeRef.current = { index, length };\n const selectedText = length > 0 ? quill.getText(index, length) : '';\n setLinkText(selectedText || '');\n setLinkUrl('');\n setIsLinkOpen(true);\n }, []);\n\n const openHtmlEditor = useCallback((mode: 'block' | 'document' = 'block') => {\n const quill = quillRef.current?.getEditor();\n if (!quill) return;\n const range = quill.getSelection();\n setHtmlEditMode(mode);\n if (mode === 'document') {\n try {\n const currentHTML = (quill.root?.innerHTML as string) || '';\n setHtmlSource(cleanEditorHTML(currentHTML));\n htmlRangeRef.current = { index: 0, length: quill.getLength() };\n } catch {\n setHtmlSource('');\n htmlRangeRef.current = { index: 0, length: 0 };\n }\n } else {\n htmlRangeRef.current = range ? { index: range.index, length: range.length } : { index: quill.getLength(), length: 0 };\n setHtmlSource('');\n }\n setIsHtmlEditorOpen(true);\n }, [cleanEditorHTML]);\n\n const handleInsertHtmlBlock = useCallback(() => {\n const quill = quillRef.current?.getEditor();\n if (!quill) return;\n\n const html = htmlSource.trim();\n\n if (!html) {\n toast({ title: 'Prázdný HTML kód', description: 'Zadejte HTML, které chcete vložit.', status: 'warning', duration: 2000 });\n return;\n }\n\n const sanitized = DOMPurify.sanitize(html, {\n USE_PROFILES: { html: true },\n ADD_TAGS: ['iframe'],\n ADD_ATTR: ['class', 'target', 'rel', 'allow', 'allowfullscreen', 'style', 'data-filters', 'data-img-id', 'data-bullets', 'data-list'],\n });\n\n if (htmlEditMode === 'document') {\n const skip = typeof window !== 'undefined' && window.localStorage.getItem('rte_skip_full_html_confirm') === '1';\n if (!skip) {\n pendingSanitizedRef.current = sanitized;\n pendingRawRef.current = html;\n setConfirmDontAsk(false);\n setIsFullHtmlConfirmOpen(true);\n return;\n }\n const total = quill.getLength();\n quill.focus();\n try { quill.deleteText(0, total, 'api'); } catch {}\n try {\n quill.clipboard.dangerouslyPasteHTML(0, sanitized, 'user');\n } catch {\n const fallback = DOMPurify.sanitize(html, { USE_PROFILES: { html: true } });\n quill.insertText(0, fallback, 'user');\n }\n onChangeRef.current(cleanEditorHTML(quill.root.innerHTML));\n setIsHtmlEditorOpen(false);\n setHtmlSource('');\n toast({ title: 'Obsah aktualizován', status: 'success', duration: 2000 });\n return;\n }\n\n const range = htmlRangeRef.current || quill.getSelection() || { index: quill.getLength(), length: 0 };\n const index = range.index;\n quill.focus();\n try {\n quill.clipboard.dangerouslyPasteHTML(index, sanitized, 'user');\n } catch {\n const fallback = DOMPurify.sanitize(html, { USE_PROFILES: { html: true } });\n quill.insertText(index, fallback, 'user');\n }\n onChangeRef.current(cleanEditorHTML(quill.root.innerHTML));\n setIsHtmlEditorOpen(false);\n setHtmlSource('');\n toast({ title: 'HTML vloženo', status: 'success', duration: 2000 });\n }, [htmlSource, toast, cleanEditorHTML, htmlEditMode]);\n\n const quillModules = useMemo(() => ({\n toolbar: {\n container: toolbarConfig,\n handlers: {\n image: onImageUpload ? handleImageUpload : undefined,\n link: handleLinkToolbar,\n },\n },\n clipboard: {\n matchVisual: false,\n },\n }), [toolbarConfig, onImageUpload, handleImageUpload, handleLinkToolbar]);\n\n useEffect(() => {\n if (!isMounted || readOnly) return;\n const quill = quillRef.current?.getEditor();\n if (!quill) return;\n const onTextChange = (delta: any, _old: any, source: any) => {\n if (source !== 'user' || htmlSwitchingRef.current || isHtmlEditorOpen) return;\n let inserted = '';\n if (Array.isArray(delta?.ops)) {\n delta.ops.forEach((op: any) => {\n if (typeof op.insert === 'string') inserted += op.insert;\n });\n }\n if (!inserted || !(/[<>]/.test(inserted))) return;\n const range = quill.getSelection();\n if (!range) return;\n const ctxStart = Math.max(0, range.index - 200);\n const ctx = quill.getText(ctxStart, range.index - ctxStart);\n const relStart = ctx.lastIndexOf('<');\n if (relStart < 0) return;\n let snippet = ctx.slice(relStart);\n snippet = (snippet || '').trim();\n if (!/^<\\/?[A-Za-z]/.test(snippet)) return;\n const absStart = ctxStart + relStart;\n const len = range.index - absStart;\n if (len <= 0 || len > 200) return;\n htmlSwitchingRef.current = true;\n try { quill.deleteText(absStart, len, 'api'); } catch {}\n try { htmlRangeRef.current = { index: absStart, length: 0 }; } catch {}\n setIsHtmlEditorOpen(true);\n setHtmlSource(snippet);\n setTimeout(() => { htmlSwitchingRef.current = false; }, 120);\n };\n quill.on('text-change', onTextChange);\n return () => {\n try { quill.off('text-change', onTextChange); } catch {}\n };\n }, [isMounted, readOnly, isHtmlEditorOpen]);\n\n useEffect(() => {\n let mounted = true;\n if (isHtmlEditorOpen && !MonacoComponent) {\n import('@monaco-editor/react')\n .then((m) => { if (mounted) setMonacoComponent(() => (m as any).default || (m as any)); })\n .catch(() => {});\n }\n return () => { mounted = false; };\n }, [isHtmlEditorOpen, MonacoComponent]);\n\n const quillFormats = useMemo(\n () => [\n 'header',\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'blockquote',\n 'list',\n 'indent',\n 'align',\n 'link',\n 'image',\n 'color',\n 'background',\n ],\n []\n );\n\n // Localize Quill toolbar tooltips/labels to Czech\n useEffect(() => {\n if (!isMounted) return;\n const editor = quillRef.current?.getEditor();\n if (!editor) return;\n const container = editor.root?.parentElement; // .ql-container\n const toolbarEl = container?.previousElementSibling as HTMLElement | null; // .ql-toolbar\n if (!toolbarEl) return;\n\n const setTitle = (selector: string, title: string) => {\n toolbarEl.querySelectorAll(selector).forEach((el) => {\n (el as HTMLElement).setAttribute('title', title);\n (el as HTMLElement).setAttribute('aria-label', title);\n });\n };\n\n // Basic formatting\n setTitle('button.ql-bold', 'Tučné');\n setTitle('button.ql-italic', 'Kurzíva');\n setTitle('button.ql-underline', 'Podtržení');\n setTitle('button.ql-strike', 'Přeškrtnutí');\n setTitle('button.ql-link', 'Vložit odkaz');\n setTitle('button.ql-image', 'Vložit obrázek');\n setTitle('button.ql-blockquote', 'Citace');\n setTitle('button.ql-clean', 'Vyčistit formátování');\n\n // Lists\n setTitle('button.ql-list[value=\"ordered\"]', 'Číslovaný seznam');\n setTitle('button.ql-list[value=\"bullet\"]', 'Odrážkový seznam');\n\n // Alignment\n setTitle('button.ql-align', 'Zarovnání');\n setTitle('button.ql-align[value=\"\"]', 'Zarovnat vlevo');\n setTitle('button.ql-align[value=\"center\"]', 'Zarovnat na střed');\n setTitle('button.ql-align[value=\"right\"]', 'Zarovnat vpravo');\n setTitle('button.ql-align[value=\"justify\"]', 'Do bloku');\n\n // Colors and background\n setTitle('.ql-color .ql-picker-label', 'Barva textu');\n setTitle('.ql-background .ql-picker-label', 'Barva pozadí');\n\n // Headers\n setTitle('.ql-header .ql-picker-label', 'Nadpis');\n setTitle('.ql-header .ql-picker-item[data-value=\"1\"]', 'Nadpis 1');\n setTitle('.ql-header .ql-picker-item[data-value=\"2\"]', 'Nadpis 2');\n setTitle('.ql-header .ql-picker-item[data-value=\"3\"]', 'Nadpis 3');\n }, [isMounted, toolbar]);\n\n // Get cropped blob\n const getCroppedBlob = (image: HTMLImageElement, cropPixels: { x: number; y: number; width: number; height: number }): Promise<Blob> => {\n const canvas = document.createElement('canvas');\n const scaleX = image.naturalWidth / image.width;\n const scaleY = image.naturalHeight / image.height;\n \n let outputWidth = Math.max(1, Math.round(cropPixels.width * scaleX));\n let outputHeight = Math.max(1, Math.round(cropPixels.height * scaleY));\n \n if (outputWidth > cropMaxWidth) {\n const scale = cropMaxWidth / outputWidth;\n outputWidth = cropMaxWidth;\n outputHeight = Math.round(outputHeight * scale);\n }\n \n canvas.width = outputWidth;\n canvas.height = outputHeight;\n const ctx = canvas.getContext('2d', { alpha: false });\n if (!ctx) throw new Error('Canvas not supported');\n \n ctx.imageSmoothingEnabled = true;\n ctx.imageSmoothingQuality = 'high';\n \n ctx.drawImage(\n image,\n Math.round(cropPixels.x * scaleX),\n Math.round(cropPixels.y * scaleY),\n Math.round(cropPixels.width * scaleX),\n Math.round(cropPixels.height * scaleY),\n 0,\n 0,\n outputWidth,\n outputHeight\n );\n \n return new Promise((resolve) => {\n canvas.toBlob((blob) => resolve(blob as Blob), 'image/jpeg', cropQuality / 100);\n });\n };\n\n // Confirm crop and insert\n const confirmCropAndInsert = async () => {\n try {\n setCropProcessing(true);\n \n if (!cropFile) {\n toast({ title: 'Chyba', description: 'Soubor není načten', status: 'error' });\n return;\n }\n \n if (!imgRef.current) {\n toast({ title: 'Chyba', description: 'Obrázek není načten', status: 'error' });\n return;\n }\n \n // Calculate crop data in natural image pixels (backend expects absolute pixels)\n const img = imgRef.current;\n const displayW = img.width;\n const displayH = img.height;\n const naturalW = img.naturalWidth || displayW;\n const naturalH = img.naturalHeight || displayH;\n const scaleX = naturalW / Math.max(1, displayW);\n const scaleY = naturalH / Math.max(1, displayH);\n const toDisplayPx = (val: number, size: number) => (crop.unit === '%' ? (val / 100) * size : val);\n\n let cropData = undefined;\n if (crop.width && crop.height && crop.width > 0 && crop.height > 0) {\n // Convert selection from displayed coordinates to natural pixel coordinates\n const dispX = Math.max(0, toDisplayPx(crop.x || 0, displayW));\n const dispY = Math.max(0, toDisplayPx(crop.y || 0, displayH));\n const dispW = Math.min(displayW, toDisplayPx(crop.width || displayW, displayW));\n const dispH = Math.min(displayH, toDisplayPx(crop.height || displayH, displayH));\n\n let natX = Math.round(dispX * scaleX);\n let natY = Math.round(dispY * scaleY);\n let natW = Math.round(dispW * scaleX);\n let natH = Math.round(dispH * scaleY);\n\n // Clamp within natural bounds\n if (natX + natW > naturalW) natW = naturalW - natX;\n if (natY + natH > naturalH) natH = naturalH - natY;\n natW = Math.max(1, natW);\n natH = Math.max(1, natH);\n\n cropData = { x: natX, y: natY, width: natW, height: natH };\n }\n \n toast({ title: 'Zpracování obrázku...', status: 'info', duration: 2000 });\n \n // Use backend to crop and upload\n const res = await cropAndUpload(cropFile, cropData, cropQuality, cropMaxWidth);\n \n if (!res.url) {\n throw new Error('Upload failed - no URL returned');\n }\n \n // Insert into editor\n const quill = quillRef.current?.getEditor();\n if (quill) {\n // Ensure editor is focused and ready\n quill.focus();\n \n // Use setTimeout to ensure Quill's internal state is ready\n setTimeout(() => {\n try {\n const range = quill.getSelection();\n const index = range ? range.index : quill.getLength();\n \n const absoluteUrl = assetUrl(res.url) || res.url;\n const img = new Image();\n img.onload = () => {\n try {\n quill.insertEmbed(index, 'image', absoluteUrl, 'api');\n // Set default width to 50% of editor width (for better layout)\n try {\n const anyQuill = quill as any;\n const leafInfo = anyQuill?.getLeaf ? anyQuill.getLeaf(index) : null;\n const leaf = Array.isArray(leafInfo) ? leafInfo[0] : null;\n const editorWidth = quill.root?.clientWidth || 0;\n const px = Math.max(50, Math.round(editorWidth * 0.5));\n let targetImg: HTMLImageElement | null = null;\n if (leaf && leaf.domNode && (leaf.domNode as HTMLElement).tagName === 'IMG') {\n targetImg = leaf.domNode as HTMLImageElement;\n }\n if (!targetImg) {\n targetImg = quill.root.querySelector(`img[src=\"${absoluteUrl}\"]`) as HTMLImageElement | null;\n }\n if (targetImg) {\n targetImg.style.width = `${px}px`;\n targetImg.style.maxWidth = '100%';\n targetImg.style.height = 'auto';\n try { targetImg.setAttribute('width', String(px)); } catch {}\n }\n } catch {}\n // Move cursor after the image\n quill.setSelection(index + 1, 0, 'api');\n // Persist content so default width is saved\n onChangeRef.current(cleanEditorHTML(quill.root.innerHTML));\n toast({ title: 'Obrázek vložen', status: 'success', duration: 2000 });\n } catch (e) {\n console.error('Insert after preload error:', e);\n toast({ title: 'Chyba při vkládání obrázku', description: String(e), status: 'error' });\n }\n };\n img.onerror = () => {\n toast({ title: 'Obrázek nelze načíst', description: absoluteUrl, status: 'error' });\n };\n img.src = absoluteUrl;\n } catch (embedError) {\n console.error('Error inserting image:', embedError);\n toast({ title: 'Chyba při vkládání obrázku', description: String(embedError), status: 'error' });\n }\n }, 50);\n }\n } catch (e: any) {\n console.error('Crop and insert error:', e);\n toast({ title: 'Zpracování obrázku selhalo', description: e?.response?.data?.error || e?.message || 'Chyba', status: 'error' });\n } finally {\n setCropProcessing(false);\n setCropOpen(false);\n setCropSrc(null);\n setCropFile(null);\n setCrop({ unit: '%', width: 80, height: 80, x: 10, y: 10 });\n setCropQuality(85);\n setCropMaxWidth(1600);\n }\n };\n\n // Make images draggable and resizable\n useEffect(() => {\n const editor = quillRef.current?.getEditor();\n if (!editor || readOnly) return;\n const enableDragReposition = true;\n\n let selectedImage: HTMLImageElement | null = null;\n let resizeHandle: HTMLDivElement | null = null;\n let isResizing = false;\n let isDragging = false;\n let startX = 0;\n let startY = 0;\n let startWidth = 0;\n let rafId = 0;\n\n const createResizeHandle = (img: HTMLImageElement) => {\n removeResizeHandle();\n \n // Create container for all resize handles\n const container = document.createElement('div');\n container.className = 'custom-image-resize-container';\n container.style.cssText = `\n position: absolute;\n pointer-events: none;\n z-index: 1000;\n `;\n \n // Position relative to Quill container (parent of .ql-editor)\n const editorContainer = editor.root.parentElement as HTMLElement | null;\n if (!editorContainer) return null;\n const sizeLabel = document.createElement('div');\n sizeLabel.style.cssText = `\n position: absolute;\n top: -26px;\n right: 0;\n background: rgba(26,32,44,0.9);\n color: #fff;\n font-size: 11px;\n line-height: 1;\n padding: 4px 6px;\n border-radius: 4px;\n pointer-events: none;\n box-shadow: 0 2px 6px rgba(0,0,0,0.3);\n `;\n const updateSizeLabel = (w: number) => {\n try {\n const edW = editor.root.clientWidth || w || 1;\n const pct = Math.max(1, Math.min(100, Math.round((w / edW) * 100)));\n const idAttr = img.getAttribute('data-img-id') || '';\n sizeLabel.textContent = `${Math.round(w)} px (${pct}%)${idAttr ? ` • ${idAttr}` : ''}`;\n } catch {\n const idAttr = img.getAttribute('data-img-id') || '';\n sizeLabel.textContent = `${Math.round(w)} px${idAttr ? ` • ${idAttr}` : ''}`;\n }\n };\n \n // Only corner handles (edge dragging disabled)\n const handles = [\n { position: 'bottom-right', cursor: 'nwse-resize', width: '20px', height: '20px', isCorner: true },\n { position: 'bottom-left', cursor: 'nesw-resize', width: '20px', height: '20px', isCorner: true },\n { position: 'top-right', cursor: 'nesw-resize', width: '20px', height: '20px', isCorner: true },\n { position: 'top-left', cursor: 'nwse-resize', width: '20px', height: '20px', isCorner: true },\n ];\n \n const updateHandlePositions = () => {\n const rect = img.getBoundingClientRect();\n const containerRect = editorContainer.getBoundingClientRect();\n const scrollTop = editor.root.scrollTop;\n const scrollLeft = editor.root.scrollLeft;\n \n container.style.left = `${rect.left - containerRect.left + scrollLeft}px`;\n container.style.top = `${rect.top - containerRect.top + scrollTop}px`;\n container.style.width = `${rect.width}px`;\n container.style.height = `${rect.height}px`;\n };\n \n handles.forEach(({ position, cursor, width, height, isCorner }) => {\n const handle = document.createElement('div');\n handle.className = `custom-image-resize-handle custom-resize-${position}`;\n \n let positionStyle = 'position: absolute; pointer-events: auto; transition: all 0.2s;';\n \n if (isCorner) {\n // Corner handle - circular blue dot\n positionStyle += `\n width: ${width};\n height: ${height};\n background: linear-gradient(135deg, #3182ce 0%, #2c5aa0 100%);\n border: 3px solid white;\n border-radius: 50%;\n box-shadow: 0 2px 8px rgba(0,0,0,0.4), 0 0 0 1px rgba(49, 130, 206, 0.3);\n `;\n \n if (position === 'bottom-right') {\n positionStyle += 'right: -8px; bottom: -8px;';\n } else if (position === 'bottom-left') {\n positionStyle += 'left: -8px; bottom: -8px;';\n } else if (position === 'top-right') {\n positionStyle += 'right: -8px; top: -8px;';\n } else if (position === 'top-left') {\n positionStyle += 'left: -8px; top: -8px;';\n }\n } else {\n // Edge handle - thin blue bar\n positionStyle += `\n background: rgba(49, 130, 206, 0.6);\n border: 1px solid rgba(49, 130, 206, 0.8);\n `;\n \n if (position === 'right') {\n positionStyle += `width: ${width}; height: ${height}; right: -4px; top: 50%; transform: translateY(-50%);`;\n } else if (position === 'bottom') {\n positionStyle += `width: ${width}; height: ${height}; bottom: -4px; left: 50%; transform: translateX(-50%);`;\n } else if (position === 'left') {\n positionStyle += `width: ${width}; height: ${height}; left: -4px; top: 50%; transform: translateY(-50%);`;\n } else if (position === 'top') {\n positionStyle += `width: ${width}; height: ${height}; top: -4px; left: 50%; transform: translateX(-50%);`;\n }\n }\n \n positionStyle += `cursor: ${cursor};`;\n handle.style.cssText = positionStyle;\n \n // Hover effect for corners\n if (isCorner) {\n handle.addEventListener('mouseenter', () => {\n handle.style.transform = 'scale(1.3)';\n handle.style.boxShadow = '0 3px 12px rgba(0,0,0,0.5), 0 0 0 2px rgba(49, 130, 206, 0.5)';\n });\n \n handle.addEventListener('mouseleave', () => {\n if (!isResizing) {\n handle.style.transform = 'scale(1)';\n handle.style.boxShadow = '0 2px 8px rgba(0,0,0,0.4), 0 0 0 1px rgba(49, 130, 206, 0.3)';\n }\n });\n } else {\n // Hover effect for edges\n handle.addEventListener('mouseenter', () => {\n handle.style.background = 'rgba(49, 130, 206, 0.9)';\n });\n \n handle.addEventListener('mouseleave', () => {\n if (!isResizing) {\n handle.style.background = 'rgba(49, 130, 206, 0.6)';\n }\n });\n }\n \n handle.addEventListener('pointerdown', (e: PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n isResizing = true;\n startX = e.clientX;\n startY = e.clientY;\n startWidth = img.offsetWidth;\n const startHeight = img.offsetHeight;\n const aspectRatio = startWidth / startHeight;\n const onPointerMove = (ev: PointerEvent) => {\n if (!isResizing) return;\n const deltaX = ev.clientX - startX;\n const deltaY = ev.clientY - startY;\n let newWidth = startWidth;\n if (position.includes('right')) {\n newWidth = startWidth + deltaX;\n } else if (position.includes('left')) {\n newWidth = startWidth - deltaX;\n } else if (position.includes('bottom') || position.includes('top')) {\n newWidth = startWidth + (deltaY * aspectRatio);\n }\n newWidth = Math.max(50, Math.min(newWidth, editor.root.clientWidth - 40));\n img.style.width = `${newWidth}px`;\n img.style.maxWidth = '100%';\n img.style.height = 'auto';\n try { img.setAttribute('width', String(Math.round(newWidth))); } catch {}\n setImageWidth(newWidth);\n setManualWidth(newWidth.toString());\n try {\n const editorWidth = editor.root.clientWidth || newWidth || 1;\n setWidthPercent(Math.max(1, Math.min(100, Math.round((newWidth / editorWidth) * 100))));\n } catch {}\n updateHandlePositions();\n updateSizeLabel(newWidth);\n };\n const onPointerUp = () => {\n isResizing = false;\n document.removeEventListener('pointermove', onPointerMove);\n document.removeEventListener('pointerup', onPointerUp);\n onChangeRef.current(cleanEditorHTML(editor.root.innerHTML));\n const id = selectedImageIdRef.current;\n setTimeout(() => { if (id) { try { selectImageByIdRef.current?.(id); } catch {} } }, 30);\n };\n document.addEventListener('pointermove', onPointerMove);\n document.addEventListener('pointerup', onPointerUp);\n });\n \n container.appendChild(handle);\n });\n \n updateHandlePositions();\n updateSizeLabel(img.offsetWidth || img.width || 0);\n editorContainer.style.position = editorContainer.style.position || 'relative';\n editorContainer.appendChild(container);\n container.appendChild(sizeLabel);\n resizeHandle = container;\n \n return container;\n };\n\n const removeResizeHandle = () => {\n if (resizeHandle && resizeHandle.parentNode) {\n resizeHandle.parentNode.removeChild(resizeHandle);\n resizeHandle = null;\n }\n };\n\n const selectImage = (img: HTMLImageElement) => {\n if (selectedImage) {\n selectedImage.style.outline = '';\n selectedImage.style.cursor = '';\n selectedImage.style.boxShadow = '';\n }\n \n selectedImage = img;\n // Ensure image has a persistent ID for reselection after content updates\n let id = img.getAttribute('data-img-id') || '';\n if (!id) {\n id = 'img-' + Date.now() + '-' + Math.random().toString(36).slice(2);\n try { img.setAttribute('data-img-id', id); } catch {}\n }\n selectedImageIdRef.current = id;\n img.style.outline = '3px solid #3182ce';\n img.style.cursor = 'move';\n img.style.boxShadow = '0 4px 12px rgba(49, 130, 206, 0.3)';\n \n // Prevent default drag behavior to avoid duplication\n img.setAttribute('draggable', enableDragReposition ? 'true' : 'false');\n \n createResizeHandle(img);\n \n // Set selected image state and load filters\n setSelectedImageElement(img);\n \n // Get current width\n const currentWidth = img.offsetWidth || img.width;\n setImageWidth(currentWidth);\n setManualWidth(currentWidth.toString());\n try {\n const editorWidth = editor.root.clientWidth || currentWidth || 1;\n setWidthPercent(Math.max(1, Math.min(100, Math.round((currentWidth / editorWidth) * 100))));\n } catch {}\n \n // Load saved filters\n const filtersData = img.getAttribute('data-filters');\n if (filtersData) {\n try {\n const savedFilters = JSON.parse(filtersData);\n setImageFilters(savedFilters);\n } catch {\n // If parsing fails, reset to defaults\n setImageFilters({\n brightness: 100,\n contrast: 100,\n saturation: 100,\n blur: 0,\n grayscale: 0,\n sepia: 0,\n hueRotate: 0,\n rotation: 0,\n flipH: false,\n flipV: false,\n });\n }\n }\n \n // Show toolbar and position it next to the image\n const rect = img.getBoundingClientRect();\n const editorRect = editor.root.getBoundingClientRect();\n const scrollTop = editor.root.scrollTop;\n const scrollLeft = editor.root.scrollLeft;\n \n // Place toolbar close to the image (top-right corner inside the image area when possible)\n const toolbarWidth = 380;\n const margin = 8;\n let leftPos = rect.left - editorRect.left + scrollLeft + (rect.width > toolbarWidth + margin ? (rect.width - toolbarWidth - margin) : margin);\n leftPos = Math.max(margin, Math.min(leftPos, editorRect.width - toolbarWidth - margin));\n let topPos = rect.top - editorRect.top + scrollTop + margin;\n topPos = Math.max(margin, topPos);\n \n setToolbarPosition({\n top: topPos,\n left: leftPos,\n });\n setShowImageToolbar(true);\n };\n\n // Expose reselection helper bound to current effect scope\n selectImageByIdRef.current = (id: string) => {\n const ed = quillRef.current?.getEditor();\n if (!ed) return;\n const node = ed.root.querySelector(`img[data-img-id=\"${id}\"]`) as HTMLImageElement | null;\n if (node) {\n selectImage(node);\n }\n };\n\n const deselectImage = () => {\n if (selectedImage) {\n selectedImage.style.outline = '';\n selectedImage.style.cursor = '';\n selectedImage.style.boxShadow = '';\n selectedImage = null;\n }\n removeResizeHandle();\n setSelectedImageElement(null);\n setShowImageToolbar(false);\n setImageWidth(0);\n setManualWidth('');\n };\n\n const handleImageClick = (e: Event) => {\n const target = e.target as HTMLElement;\n // Support images wrapped in anchors or other elements (e.g., Zonerama links)\n const imgEl = target.tagName === 'IMG' ? (target as HTMLImageElement) : (target.closest('img') as HTMLImageElement | null);\n if (imgEl) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n \n // In read-only mode, show preview instead of selecting\n if (readOnly) {\n const imgSrc = imgEl.src;\n setPreviewImage(imgSrc);\n setIsPreviewOpen(true);\n return;\n }\n \n selectImage(imgEl);\n return; // Important: return early to prevent further processing\n }\n \n // Don't deselect if clicking on resize handle or toolbar\n if (target.classList.contains('custom-image-resize-handle') || \n target.classList.contains('custom-image-resize-container')) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n if (toolbarRef.current && (toolbarRef.current === target || toolbarRef.current.contains(target))) {\n e.preventDefault();\n e.stopPropagation();\n return; // Don't deselect if clicking inside toolbar\n }\n \n // Only deselect if clicking outside image, toolbar, and handle\n deselectImage();\n };\n\n const handleMouseDown = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (target.tagName === 'IMG' && selectedImage === target) {\n if (enableDragReposition) {\n return;\n }\n // Allow edge-drag fallback resize if overlay handle doesn't catch it\n const rect = target.getBoundingClientRect();\n const nearLeft = e.clientX < rect.left + 16;\n const nearRight = e.clientX > rect.right - 16;\n const nearTop = e.clientY < rect.top + 16;\n const nearBottom = e.clientY > rect.bottom - 16;\n if (false) {\n e.preventDefault();\n e.stopPropagation();\n isResizing = true;\n startX = e.clientX;\n startY = e.clientY;\n startWidth = (target as HTMLImageElement).offsetWidth;\n const startHeight = (target as HTMLImageElement).offsetHeight;\n const aspectRatio = startWidth / Math.max(1, startHeight);\n const edge = nearRight ? 'right' : nearLeft ? 'left' : nearBottom ? 'bottom' : 'top';\n\n const onMouseMove: (ev: MouseEvent) => void = (ev: MouseEvent) => {\n if (!isResizing) return;\n const deltaX = ev.clientX - startX;\n const deltaY = ev.clientY - startY;\n let newWidth = startWidth;\n if (edge === 'right') newWidth = startWidth + deltaX;\n else if (edge === 'left') newWidth = startWidth - deltaX;\n else if (edge === 'bottom') newWidth = startWidth + (deltaY * aspectRatio);\n else if (edge === 'top') newWidth = startWidth - (deltaY * aspectRatio);\n const maxW = (editor?.root?.clientWidth ?? (startWidth || 1200)) - 40;\n newWidth = Math.max(50, Math.min(newWidth, maxW));\n const imgEl = target as HTMLImageElement;\n imgEl.style.width = `${newWidth}px`;\n imgEl.style.maxWidth = '100%';\n imgEl.style.height = 'auto';\n try { imgEl.setAttribute('width', String(Math.round(newWidth))); } catch {}\n setImageWidth(newWidth);\n setManualWidth(String(Math.round(newWidth)));\n try {\n const editorWidth = editor?.root?.clientWidth ?? newWidth ?? 1;\n setWidthPercent(Math.max(1, Math.min(100, Math.round((newWidth / editorWidth) * 100))));\n } catch {}\n handleScroll();\n };\n\n const onMouseUp = () => {\n isResizing = false;\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n if (editor) { onChangeRef.current(cleanEditorHTML(editor.root.innerHTML)); }\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n return;\n }\n \n e.preventDefault();\n e.stopPropagation();\n isDragging = true;\n startX = e.clientX;\n startY = e.clientY;\n \n // Store initial alignment to prevent copying behavior\n const initialMarginLeft = selectedImage.style.marginLeft || '';\n const initialMarginRight = selectedImage.style.marginRight || '';\n let currentAlignment: 'left' | 'center' | 'right' = 'center';\n \n if (initialMarginLeft === '0' || initialMarginLeft === '0px') {\n currentAlignment = 'left';\n } else if (initialMarginRight === '0' || initialMarginRight === '0px') {\n currentAlignment = 'right';\n }\n \n // Already set in selectImage, but ensure it's off\n target.setAttribute('draggable', 'false');\n \n const onMouseMove: (e: MouseEvent) => void = (e: MouseEvent) => {\n if (!isDragging || !selectedImage) return;\n \n const deltaX = e.clientX - startX;\n \n // Require significant movement to trigger alignment change\n if (Math.abs(deltaX) > 50) {\n const newAlignment = deltaX > 0 ? 'right' : 'left';\n \n // Only update if alignment actually changed\n if (newAlignment !== currentAlignment) {\n currentAlignment = newAlignment;\n startX = e.clientX; // Reset start position\n \n selectedImage.style.display = 'block';\n selectedImage.style.float = 'none';\n \n if (newAlignment === 'right') {\n selectedImage.style.marginLeft = 'auto';\n selectedImage.style.marginRight = '0';\n } else {\n selectedImage.style.marginLeft = '0';\n selectedImage.style.marginRight = 'auto';\n }\n }\n }\n };\n \n const onMouseUp: (e: MouseEvent) => void = () => {\n isDragging = false;\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n if (selectedImage) {\n onChangeRef.current(cleanEditorHTML(editor.root.innerHTML));\n }\n };\n \n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n }\n };\n\n // Delete selected image on Delete key\n const handleKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement | null;\n const tag = target?.tagName;\n // Do not act on Delete/Backspace if user is typing in an input, textarea, or contentEditable\n if (tag === 'INPUT' || tag === 'TEXTAREA' || (target && (target as any).isContentEditable)) {\n return;\n }\n if (selectedImage && (e.key === 'Delete' || e.key === 'Backspace')) {\n e.preventDefault();\n selectedImage.remove();\n deselectImage();\n onChangeRef.current(cleanEditorHTML(editor.root.innerHTML));\n toast({ title: 'Obrázek odstraněn', status: 'info', duration: 1500 });\n }\n };\n\n // Handle scroll to update resize handle position\n const handleScroll = () => {\n if (!selectedImage || !resizeHandle) return;\n if (rafId) cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(() => {\n const rect = selectedImage!.getBoundingClientRect();\n const editorContainer = editor.root.parentElement as HTMLElement | null;\n const containerRect = editorContainer ? editorContainer.getBoundingClientRect() : editor.root.getBoundingClientRect();\n const scrollTop = editor.root.scrollTop;\n const scrollLeft = editor.root.scrollLeft;\n resizeHandle!.style.left = `${rect.left - containerRect.left + scrollLeft}px`;\n resizeHandle!.style.top = `${rect.top - containerRect.top + scrollTop}px`;\n resizeHandle!.style.width = `${rect.width}px`;\n resizeHandle!.style.height = `${rect.height}px`;\n });\n };\n\n // Drag & drop repositioning for images inside editor\n let draggedImage: HTMLImageElement | null = null;\n const handleDragStart = (e: DragEvent) => {\n const target = e.target as HTMLElement;\n if (target && target.tagName === 'IMG') {\n draggedImage = target as HTMLImageElement;\n try {\n e.dataTransfer?.setData('text/plain', (target as HTMLImageElement).src || '');\n e.dataTransfer!.effectAllowed = 'move';\n } catch {}\n }\n };\n const handleDragOver = (e: DragEvent) => {\n if (draggedImage) {\n e.preventDefault();\n e.dataTransfer!.dropEffect = 'move';\n }\n };\n const handleDrop = (e: DragEvent) => {\n if (!draggedImage) return;\n e.preventDefault();\n e.stopPropagation();\n const q = quillRef.current?.getEditor();\n if (!q) return;\n // Place caret to drop coordinates\n try {\n const sel = window.getSelection();\n const anyDoc: any = document as any;\n const docWithCaretRange = document as Document & {\n caretRangeFromPoint?: (x: number, y: number) => Range;\n };\n const range = docWithCaretRange.caretRangeFromPoint\n ? docWithCaretRange.caretRangeFromPoint.call(document, e.clientX, e.clientY)\n : typeof anyDoc.caretPositionFromPoint === 'function'\n ? (() => { const pos = anyDoc.caretPositionFromPoint(e.clientX, e.clientY); const r = document.createRange(); r.setStart(pos.offsetNode, pos.offset); r.setEnd(pos.offsetNode, pos.offset); return r; })()\n : null;\n if (range && sel) {\n sel.removeAllRanges();\n sel.addRange(range);\n }\n } catch {}\n const dropRange = q.getSelection(true) || { index: q.getLength(), length: 0 };\n const src = draggedImage.src;\n // Remove original image node\n try { draggedImage.remove(); } catch {}\n // Insert at new location\n q.insertEmbed(dropRange.index, 'image', src, 'user');\n q.setSelection(dropRange.index + 1, 0, 'user');\n onChangeRef.current(cleanEditorHTML(q.root.innerHTML));\n // Reposition overlay if same image was selected\n const id = selectedImageIdRef.current;\n if (id) { setTimeout(() => { try { selectImageByIdRef.current?.(id); } catch {} }, 30); }\n draggedImage = null;\n };\n\n const root = editor.root as HTMLElement;\n root.addEventListener('click', handleImageClick);\n root.addEventListener('scroll', handleScroll);\n if (enableDragReposition) {\n root.addEventListener('dragstart', handleDragStart);\n root.addEventListener('dragover', handleDragOver);\n root.addEventListener('drop', handleDrop);\n }\n document.addEventListener('keydown', handleKeyDown);\n // Also reposition on window resize and any document scroll (capture phase)\n window.addEventListener('resize', handleScroll);\n document.addEventListener('scroll', handleScroll, true);\n\n return () => {\n editor.root.removeEventListener('click', handleImageClick);\n const root = editor.root as HTMLElement;\n root.removeEventListener('scroll', handleScroll);\n if (enableDragReposition) {\n root.removeEventListener('dragstart', handleDragStart);\n root.removeEventListener('dragover', handleDragOver);\n root.removeEventListener('drop', handleDrop);\n }\n document.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('resize', handleScroll);\n document.removeEventListener('scroll', handleScroll, true);\n if (rafId) cancelAnimationFrame(rafId);\n removeResizeHandle();\n deselectImage();\n };\n }, [readOnly, toast, isMounted]);\n\n // Auto-resize very large images (e.g., pasted/Zonerama) to a comfortable width for editing\n useEffect(() => {\n const editor = quillRef.current?.getEditor();\n if (!editor || readOnly) return;\n const root = editor.root as HTMLElement;\n const COMFORTABLE_MAX = 1600; // px\n\n const processImg = async (img: HTMLImageElement) => {\n try {\n if (!img || img.getAttribute('data-auto-resized') === '1') return;\n const doResize = async () => {\n // Skip if we've already processed or if image is already small\n const natW = img.naturalWidth || 0;\n if (natW > COMFORTABLE_MAX) {\n try {\n toast({ title: 'Optimalizace velkého obrázku…', status: 'info', duration: 1500 });\n } catch {}\n try {\n const res = await quickEditImage({ image_url: img.src, width: COMFORTABLE_MAX, quality: 85 });\n if (res?.url) {\n const newUrl = assetUrl(res.url) || res.url;\n img.src = newUrl;\n img.setAttribute('data-auto-resized', '1');\n img.style.maxWidth = '100%';\n img.style.height = 'auto';\n const q = quillRef.current?.getEditor();\n if (q) {\n onChangeRef.current(cleanEditorHTML(q.root.innerHTML));\n // If this image is selected, reselect to reposition overlay\n const id = selectedImageIdRef.current;\n if (id) setTimeout(() => { try { selectImageByIdRef.current?.(id); } catch {} }, 30);\n }\n }\n } catch (e) {\n console.error('Auto-resize failed', e);\n }\n }\n };\n if (img.complete) doResize();\n else img.addEventListener('load', () => doResize(), { once: true });\n } catch {}\n };\n\n // Initial scan\n root.querySelectorAll('img').forEach((n) => processImg(n as HTMLImageElement));\n\n // Observe changes\n const mo = new MutationObserver((mutations) => {\n mutations.forEach((m) => {\n m.addedNodes.forEach((node) => {\n if (node instanceof HTMLImageElement) processImg(node);\n else if (node instanceof HTMLElement) node.querySelectorAll?.('img').forEach((el) => processImg(el as HTMLImageElement));\n });\n });\n });\n mo.observe(root, { childList: true, subtree: true });\n return () => mo.disconnect();\n }, [readOnly, isMounted, toast]);\n\n // Apply filters to selected image\n const applyFiltersToImage = useCallback((img: HTMLImageElement, filters: ImageFilters) => {\n const filterString = `\n brightness(${filters.brightness}%)\n contrast(${filters.contrast}%)\n saturate(${filters.saturation}%)\n blur(${filters.blur}px)\n grayscale(${filters.grayscale}%)\n sepia(${filters.sepia}%)\n hue-rotate(${filters.hueRotate}deg)\n `.trim();\n \n const transform = `\n rotate(${filters.rotation}deg)\n scaleX(${filters.flipH ? -1 : 1})\n scaleY(${filters.flipV ? -1 : 1})\n `.trim();\n \n img.style.filter = filterString;\n img.style.transform = transform;\n img.style.transformOrigin = \"center center\";\n img.setAttribute('data-filters', JSON.stringify(filters));\n }, []);\n\n // Reset filters\n const resetFilters = useCallback(() => {\n const defaultFilters: ImageFilters = {\n brightness: 100,\n contrast: 100,\n saturation: 100,\n blur: 0,\n grayscale: 0,\n sepia: 0,\n hueRotate: 0,\n rotation: 0,\n flipH: false,\n flipV: false,\n };\n setImageFilters(defaultFilters);\n if (selectedImageElement) {\n applyFiltersToImage(selectedImageElement, defaultFilters);\n const editor = quillRef.current?.getEditor();\n if (editor) {\n onChangeRef.current(cleanEditorHTML(editor.root.innerHTML));\n }\n }\n }, [selectedImageElement, applyFiltersToImage]);\n\n // Update filter and apply to image (preview only - client-side)\n const updateFilter = useCallback((key: keyof ImageFilters, value: any) => {\n setImageFilters(prev => {\n const newFilters = { ...prev, [key]: value };\n if (selectedImageElement) {\n applyFiltersToImage(selectedImageElement, newFilters);\n const editor = quillRef.current?.getEditor();\n if (editor) {\n onChangeRef.current(cleanEditorHTML(editor.root.innerHTML));\n try { editor.root.dispatchEvent(new Event('scroll')); } catch {}\n }\n // Keep selection active and overlay positioned after DOM update\n const id = selectedImageIdRef.current;\n if (id) {\n setTimeout(() => { try { selectImageByIdRef.current?.(id); } catch {} }, 30);\n }\n }\n return newFilters;\n });\n }, [selectedImageElement, applyFiltersToImage]);\n\n // Apply filters via backend and replace image\n const [isApplyingFilters, setIsApplyingFilters] = useState(false);\n const applyFiltersToBackend = useCallback(async () => {\n if (!selectedImageElement) return;\n \n try {\n setIsApplyingFilters(true);\n toast({ title: 'Zpracování filtry...', status: 'info', duration: 2000 });\n \n const currentSrc = selectedImageElement.src;\n \n // Prepare filter values for backend (convert from % to -100 to 100 scale)\n const brightness = imageFilters.brightness - 100;\n const contrast = imageFilters.contrast - 100;\n const saturation = imageFilters.saturation - 100;\n \n const res = await quickEditImage({\n image_url: currentSrc,\n width: selectedImageElement.offsetWidth || undefined,\n rotation: imageFilters.rotation,\n flip_h: imageFilters.flipH,\n flip_v: imageFilters.flipV,\n brightness,\n contrast,\n saturation,\n grayscale: imageFilters.grayscale > 0,\n quality: 85,\n });\n \n // Replace image src\n const absoluteUrl = assetUrl(res.url) || res.url;\n selectedImageElement.src = absoluteUrl;\n \n // Reset filters to default since they're now baked into the image\n setImageFilters({\n brightness: 100,\n contrast: 100,\n saturation: 100,\n blur: 0,\n grayscale: 0,\n sepia: 0,\n hueRotate: 0,\n rotation: 0,\n flipH: false,\n flipV: false,\n });\n selectedImageElement.style.filter = '';\n selectedImageElement.style.transform = '';\n selectedImageElement.removeAttribute('data-filters');\n \n // Update editor content\n const editor = quillRef.current?.getEditor();\n if (editor) {\n onChangeRef.current(cleanEditorHTML(editor.root.innerHTML));\n }\n reselectAfterContentUpdate();\n \n toast({ title: 'Filtry aplikovány', status: 'success', duration: 2000 });\n } catch (e: any) {\n console.error('Apply filters error:', e);\n toast({ title: 'Aplikace filtrů selhala', description: e?.response?.data?.error || e?.message, status: 'error' });\n } finally {\n setIsApplyingFilters(false);\n }\n }, [selectedImageElement, imageFilters, toast]);\n\n const deleteSelectedImage = useCallback(() => {\n if (!selectedImageElement) return;\n\n const editor = quillRef.current?.getEditor();\n if (!editor) return;\n\n try {\n // Remove the image element from the DOM\n selectedImageElement.remove();\n } catch {}\n\n try {\n // Remove resize overlay container if present\n const editorContainer = editor.root.parentElement as HTMLElement | null;\n const resizeContainer = editorContainer?.querySelector('.custom-image-resize-container') as HTMLElement | null;\n if (resizeContainer && resizeContainer.parentNode) {\n resizeContainer.parentNode.removeChild(resizeContainer);\n }\n } catch {}\n\n selectedImageIdRef.current = null;\n setSelectedImageElement(null);\n setShowImageToolbar(false);\n setImageWidth(0);\n setManualWidth('');\n setWidthPercent(0);\n\n onChangeRef.current(cleanEditorHTML(editor.root.innerHTML));\n toast({ title: 'Obrázek odstraněn', status: 'info', duration: 1500 });\n }, [selectedImageElement, toast, cleanEditorHTML]);\n\n // Align image\n const alignImage = useCallback((alignment: 'left' | 'center' | 'right') => {\n if (selectedImageElement) {\n selectedImageElement.style.display = 'block';\n selectedImageElement.style.float = 'none';\n \n if (alignment === 'left') {\n selectedImageElement.style.marginLeft = '0';\n selectedImageElement.style.marginRight = 'auto';\n } else if (alignment === 'center') {\n selectedImageElement.style.marginLeft = 'auto';\n selectedImageElement.style.marginRight = 'auto';\n } else if (alignment === 'right') {\n selectedImageElement.style.marginLeft = 'auto';\n selectedImageElement.style.marginRight = '0';\n }\n \n const editor = quillRef.current?.getEditor();\n if (editor) {\n onChangeRef.current(cleanEditorHTML(editor.root.innerHTML));\n // Force overlay reposition\n try { editor.root.dispatchEvent(new Event('scroll')); } catch {}\n }\n reselectAfterContentUpdate();\n toast({ title: `Obrázek zarovnán ${alignment === 'left' ? 'vlevo' : alignment === 'center' ? 'na střed' : 'vpravo'}`, status: 'success', duration: 1500 });\n }\n }, [selectedImageElement, toast]);\n // Reselect helper after content updates (e.g., when value change triggers rerender)\n const reselectAfterContentUpdate = useCallback(() => {\n const id = selectedImageIdRef.current;\n if (!id) return;\n setTimeout(() => {\n try { selectImageByIdRef.current?.(id); } catch {}\n }, 30);\n }, []);\n\n const applyWidthPx = useCallback((px: number, opts?: { silent?: boolean }) => {\n if (!selectedImageElement) return;\n const editor = quillRef.current?.getEditor();\n const maxWidth = editor ? editor.root.clientWidth - 40 : 1200;\n const finalWidth = Math.min(Math.max(50, Math.round(px)), maxWidth);\n selectedImageElement.style.width = `${finalWidth}px`;\n selectedImageElement.style.height = 'auto';\n selectedImageElement.style.maxWidth = '100%';\n selectedImageElement.setAttribute('width', String(finalWidth));\n setImageWidth(finalWidth);\n setManualWidth(finalWidth.toString());\n if (editor) {\n onChangeRef.current(cleanEditorHTML(editor.root.innerHTML));\n try { editor.root.dispatchEvent(new Event('scroll')); } catch {}\n }\n // Keep selection active for subsequent operations (e.g., 50% → 75%)\n reselectAfterContentUpdate();\n if (!opts?.silent) {\n toast({ title: 'Šířka nastavena', description: `${finalWidth}px`, status: 'success', duration: 1500 });\n }\n }, [selectedImageElement, toast]);\n\n const resetWidth = useCallback(() => {\n if (!selectedImageElement) return;\n const editor = quillRef.current?.getEditor();\n selectedImageElement.style.width = '';\n selectedImageElement.style.height = '';\n selectedImageElement.style.maxWidth = '100%';\n selectedImageElement.removeAttribute('width');\n const currentWidth = selectedImageElement.offsetWidth || selectedImageElement.width || 0;\n setImageWidth(currentWidth);\n setManualWidth('');\n if (editor) {\n onChangeRef.current(cleanEditorHTML(editor.root.innerHTML));\n }\n reselectAfterContentUpdate();\n toast({ title: 'Šířka resetována', status: 'info', duration: 1200 });\n }, [selectedImageElement, toast]);\n\n const applyPercent = useCallback((percent: number, opts?: { silent?: boolean }) => {\n const clamped = Math.max(5, Math.min(100, Math.round(percent)));\n setWidthPercent(clamped);\n const editor = quillRef.current?.getEditor();\n if (editor && selectedImageElement) {\n const px = (editor.root.clientWidth * clamped) / 100;\n applyWidthPx(px, opts);\n }\n }, [applyWidthPx, selectedImageElement]);\n\n // Set manual width\n const applyManualWidth = useCallback(() => {\n if (selectedImageElement && manualWidth) {\n const raw = manualWidth.trim();\n if (raw.endsWith('%')) {\n const percent = parseFloat(raw.slice(0, -1));\n const editor = quillRef.current?.getEditor();\n if (editor && !isNaN(percent) && percent > 0) {\n const px = (editor.root.clientWidth * percent) / 100;\n applyWidthPx(px);\n return;\n }\n }\n const width = parseInt(raw, 10);\n if (!isNaN(width) && width > 0) {\n applyWidthPx(width);\n } else {\n toast({ title: 'Neplatná šířka', description: 'Zadejte kladné číslo nebo procenta (např. 50%)', status: 'warning', duration: 1500 });\n }\n }\n }, [selectedImageElement, manualWidth, toast, applyWidthPx]);\n\n // Apply bullet style (disc | circle | square | none) to the current list\n const applyBulletStyle = useCallback((style: 'disc' | 'circle' | 'square' | 'none') => {\n const quill = quillRef.current?.getEditor();\n if (!quill) return;\n const range = quill.getSelection();\n if (!range) return;\n const [line] = quill.getLine(range.index);\n const node = (line as any)?.domNode as HTMLElement | null;\n if (!node) return;\n // find nearest UL and set custom data attribute for CSS-based bullet override (Quill v2)\n let el: HTMLElement | null = node;\n while (el && el.tagName !== 'UL' && el !== quill.root) {\n el = el.parentElement;\n }\n if (el && el.tagName === 'UL') {\n (el as HTMLElement).setAttribute('data-bullets', style);\n try {\n // Also set inline style for public rendering where Quill CSS is not present\n (el as HTMLElement).style.listStyleType = style === 'none' ? 'none' : style;\n } catch {}\n onChangeRef.current(cleanEditorHTML(quill.root.innerHTML));\n }\n }, [onChangeRef, cleanEditorHTML]);\n\n const insertOrUpdateLink = useCallback(() => {\n const quill = quillRef.current?.getEditor();\n if (!quill) return;\n\n const range = linkRangeRef.current || quill.getSelection();\n if (!range) return;\n\n const text = linkText?.trim() || linkUrl?.trim();\n const url = linkUrl?.trim();\n if (!url) {\n toast({ title: 'Zadejte URL', status: 'warning', duration: 1500 });\n return;\n }\n\n quill.focus();\n if (range.length > 0) {\n // Replace selected text with provided text and link\n quill.deleteText(range.index, range.length, 'user');\n quill.insertText(range.index, text || url, 'link', url, 'user');\n quill.setSelection(range.index + (text || url).length, 0, 'user');\n } else {\n quill.insertText(range.index, text || url, 'link', url, 'user');\n quill.setSelection(range.index + (text || url).length, 0, 'user');\n }\n onChangeRef.current(cleanEditorHTML(quill.root.innerHTML));\n setIsLinkOpen(false);\n setLinkText('');\n setLinkUrl('');\n }, [linkText, linkUrl, toast, cleanEditorHTML]);\n\n // Enhance toolbar: add color/background reset buttons next to pickers\n useEffect(() => {\n if (!isMounted) return;\n const editor = quillRef.current?.getEditor();\n if (!editor) return;\n const container = editor.root?.parentElement; // .ql-container\n const toolbarEl = container?.previousElementSibling as HTMLElement | null; // .ql-toolbar\n if (!toolbarEl) return;\n\n // Add reset buttons next to color/background pickers\n const addResetButton = (selector: string, className: string, formatName: 'color' | 'background') => {\n const picker = toolbarEl.querySelector(selector) as HTMLElement | null;\n if (picker && !toolbarEl.querySelector(`button.${className}`)) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = className;\n btn.setAttribute('title', formatName === 'color' ? 'Reset barvy textu' : 'Reset barvy pozadí');\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n const q = quillRef.current?.getEditor();\n if (!q) return;\n q.format(formatName, false, 'user');\n onChangeRef.current(cleanEditorHTML(q.root.innerHTML));\n });\n (picker.parentElement as HTMLElement)?.insertBefore(btn, picker.nextSibling);\n }\n };\n\n addResetButton('.ql-color .ql-picker-label', 'ql-color-reset', 'color');\n addResetButton('.ql-background .ql-picker-label', 'ql-background-reset', 'background');\n }, [isMounted, cleanEditorHTML]);\n\n return (\n <Box>\n {/* Editor Controls */}\n {!readOnly && (\n <VStack align=\"stretch\" spacing={1} mb={2}>\n <HStack spacing={2} justify=\"flex-start\" flexWrap=\"wrap\">\n {onImageUpload && (\n <>\n <Button\n size=\"sm\"\n leftIcon={<ImageIcon size={16} />}\n colorScheme=\"purple\"\n onClick={handleImageUpload}\n >\n Vložit obrázek\n </Button>\n <Text fontSize=\"xs\" color=\"gray.500\">\n nebo použijte tlačítko obrázku v nástrojové liště\n </Text>\n </>\n )}\n <Button\n size=\"sm\"\n leftIcon={<Code size={16} />}\n colorScheme=\"blue\"\n variant=\"outline\"\n onClick={() => openHtmlEditor('document')}\n >\n Otevřít v HTML\n </Button>\n </HStack>\n </VStack>\n )}\n\n <Box \n position=\"relative\"\n borderWidth=\"1px\" \n borderColor={borderColor}\n borderRadius=\"md\" \n overflow=\"visible\"\n bg={bgColor}\n sx={{\n '.ql-toolbar': {\n borderBottom: '1px solid',\n borderColor: borderColor,\n bg: hoverBg,\n display: 'flex',\n flexWrap: 'wrap',\n gap: '4px',\n padding: '12px',\n '& button': {\n color: 'gray.700 !important',\n width: '32px !important',\n height: '32px !important',\n borderRadius: '6px',\n transition: 'all 0.2s',\n '&:hover': {\n background: 'rgba(49, 130, 206, 0.1) !important',\n transform: 'scale(1.05)',\n },\n '&.ql-active': {\n background: 'rgba(49, 130, 206, 0.2) !important',\n color: '#3182ce !important',\n },\n },\n '& .ql-stroke': {\n stroke: 'gray.700 !important',\n },\n '& .ql-fill': {\n fill: 'gray.700 !important',\n },\n '& .ql-active .ql-stroke': {\n stroke: '#3182ce !important',\n },\n '& .ql-active .ql-fill': {\n fill: '#3182ce !important',\n },\n '& .ql-picker': {\n color: 'gray.700 !important',\n },\n '& .ql-picker-label': {\n borderRadius: '6px',\n padding: '4px 8px',\n transition: 'all 0.2s',\n '&:hover': {\n background: 'rgba(49, 130, 206, 0.1) !important',\n },\n },\n '& .ql-picker-options': {\n background: 'white',\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\n padding: '8px',\n },\n },\n '.ql-container': {\n fontSize: '16px',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial, sans-serif',\n bg: 'white',\n },\n '.ql-editor': {\n minHeight: height,\n maxHeight: '70vh',\n overflowY: 'auto',\n bg: 'white !important',\n color: '#1a202c',\n padding: '16px',\n lineHeight: '1.6',\n '&::-webkit-scrollbar': {\n width: '8px',\n },\n '&::-webkit-scrollbar-track': {\n bg: 'gray.100',\n },\n '&::-webkit-scrollbar-thumb': {\n bg: 'gray.400',\n borderRadius: '4px',\n },\n 'h1, h2, h3, h4, h5, h6': {},\n 'h1': {\n fontSize: '2em !important',\n fontWeight: 'bold !important',\n marginTop: '0.67em !important',\n marginBottom: '0.67em !important',\n lineHeight: '1.2 !important',\n },\n 'h2': {\n fontSize: '1.5em !important',\n fontWeight: 'bold !important',\n marginTop: '0.83em !important',\n marginBottom: '0.83em !important',\n lineHeight: '1.3 !important',\n },\n 'h3': {\n fontSize: '1.17em !important',\n fontWeight: 'bold !important',\n marginTop: '1em !important',\n marginBottom: '1em !important',\n lineHeight: '1.4 !important',\n },\n 'p, li, span, div': {},\n 'strong, b': { fontWeight: 'bold' },\n 'a': { textDecoration: 'underline' },\n 'blockquote': {\n borderLeft: '4px solid #3182ce',\n paddingLeft: '16px',\n margin: '1em 0',\n color: '#4a5568 !important',\n fontStyle: 'italic',\n backgroundColor: '#f7fafc',\n padding: '12px 16px',\n borderRadius: '4px',\n },\n 'code': {\n backgroundColor: '#f7fafc',\n padding: '2px 6px',\n borderRadius: '3px',\n color: '#e53e3e !important',\n fontFamily: 'monospace',\n },\n 'pre': {\n backgroundColor: '#2d3748',\n color: '#f7fafc !important',\n padding: '16px',\n borderRadius: '6px',\n overflow: 'auto',\n },\n 'ul, ol': {\n paddingLeft: '1.5em',\n margin: '0.5em 0',\n },\n img: {\n cursor: 'pointer',\n maxWidth: '100%',\n height: 'auto',\n display: 'block',\n margin: '12px 0',\n transition: 'all 0.2s ease',\n borderRadius: '4px',\n userSelect: 'none',\n pointerEvents: 'auto',\n '&:hover': {\n opacity: 0.95,\n transform: 'scale(1.01)',\n },\n },\n },\n '.ql-editor.ql-blank::before': {\n color: '#a0aec0 !important',\n fontStyle: 'italic',\n },\n // Allow user-chosen colors to show. White-on-white is handled during paste/sanitize only.\n }}\n >\n {isMounted && (\n <ReactQuill\n theme=\"snow\"\n value={value}\n onChange={handleChange}\n readOnly={readOnly}\n placeholder={placeholder}\n ref={quillRef}\n modules={quillModules}\n formats={quillFormats}\n />\n )}\n </Box>\n\n {!readOnly && (\n <Text fontSize=\"xs\" color=\"gray.500\" mt={2}>\n 💡 <strong>Tip:</strong> Klikněte na obrázek pro výběr. Poté můžete: • Přetáhnout pro zarovnání • Změnit velikost tažením modrého bodu • Upravit filtry a transformace • Stisknout Delete pro smazání\n </Text>\n )}\n\n {/* Floating Image Editing Toolbar */}\n {showImageToolbar && selectedImageElement && !readOnly && (\n <Box\n ref={toolbarRef}\n position=\"absolute\"\n top={`${toolbarPosition.top}px`}\n left={`${toolbarPosition.left}px`}\n bg={toolbarBg}\n borderWidth=\"2px\"\n borderColor=\"blue.400\"\n borderRadius=\"lg\"\n boxShadow=\"2xl\"\n p={3}\n zIndex={9999}\n minW=\"320px\"\n maxW=\"380px\"\n maxH=\"80vh\"\n overflowY=\"auto\"\n pointerEvents=\"auto\"\n onClick={(e) => { e.stopPropagation(); }}\n onMouseDown={(e) => { e.stopPropagation(); }}\n css={{\n '&::-webkit-scrollbar': {\n width: '6px',\n },\n '&::-webkit-scrollbar-track': {\n background: '#f1f1f1',\n },\n '&::-webkit-scrollbar-thumb': {\n background: '#888',\n borderRadius: '3px',\n },\n '&::-webkit-scrollbar-thumb:hover': {\n background: '#555',\n },\n }}\n >\n <VStack align=\"stretch\" spacing={3}>\n {/* Toolbar Header */}\n <HStack\n justify=\"space-between\"\n onMouseDown={(e) => {\n if (e.button !== 0) return;\n e.preventDefault();\n e.stopPropagation();\n toolbarDragRef.current.active = true;\n toolbarDragRef.current.startX = e.clientX;\n toolbarDragRef.current.startY = e.clientY;\n toolbarDragRef.current.startLeft = toolbarPosition.left;\n toolbarDragRef.current.startTop = toolbarPosition.top;\n const onMove = (ev: MouseEvent) => {\n if (!toolbarDragRef.current.active) return;\n const dx = ev.clientX - toolbarDragRef.current.startX;\n const dy = ev.clientY - toolbarDragRef.current.startY;\n setToolbarPosition((pos) => ({ top: Math.max(0, toolbarDragRef.current.startTop + dy), left: Math.max(0, toolbarDragRef.current.startLeft + dx) }));\n };\n const onUp = () => {\n toolbarDragRef.current.active = false;\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n };\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n }}\n cursor=\"move\"\n >\n <HStack spacing={2}>\n <Settings size={16} />\n <Text fontWeight=\"bold\" fontSize=\"sm\">Úprava obrázku</Text>\n </HStack>\n <IconButton\n aria-label=\"Close\"\n icon={<X size={16} />}\n size=\"xs\"\n onClick={() => setShowImageToolbar(false)}\n variant=\"ghost\"\n />\n </HStack>\n\n {/* Alignment Buttons */}\n <VStack align=\"stretch\" spacing={2}>\n <Text fontSize=\"xs\" fontWeight=\"semibold\" color=\"gray.600\">Zarovnání</Text>\n <HStack spacing={2} justify=\"stretch\">\n <Tooltip label=\"Zarovnat vlevo\">\n <IconButton\n aria-label=\"Align left\"\n icon={<AlignLeft size={16} />}\n size=\"sm\"\n onClick={() => alignImage('left')}\n colorScheme=\"teal\"\n variant=\"outline\"\n flex={1}\n />\n </Tooltip>\n <Tooltip label=\"Zarovnat na střed\">\n <IconButton\n aria-label=\"Align center\"\n icon={<AlignCenter size={16} />}\n size=\"sm\"\n onClick={() => alignImage('center')}\n colorScheme=\"teal\"\n variant=\"outline\"\n flex={1}\n />\n </Tooltip>\n <Tooltip label=\"Zarovnat vpravo\">\n <IconButton\n aria-label=\"Align right\"\n icon={<AlignRight size={16} />}\n size=\"sm\"\n onClick={() => alignImage('right')}\n colorScheme=\"teal\"\n variant=\"outline\"\n flex={1}\n />\n </Tooltip>\n </HStack>\n </VStack>\n\n {/* Width Control */\n }\n <VStack align=\"stretch\" spacing={2}>\n <Text fontSize=\"xs\" fontWeight=\"semibold\" color=\"gray.600\">Šířka obrázku</Text>\n <HStack spacing={2}>\n <Input\n size=\"sm\"\n type=\"number\"\n value={manualWidth}\n onChange={(e) => setManualWidth(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.stopPropagation(); applyManualWidth(); } }}\n placeholder=\"Šířka v px\"\n min={50}\n />\n <Button\n size=\"sm\"\n colorScheme=\"blue\"\n onClick={applyManualWidth}\n minW=\"80px\"\n >\n Nastavit\n </Button>\n </HStack>\n <Text fontSize=\"xs\" color=\"gray.500\">Aktuální: {imageWidth}px ({widthPercent || 0}%)</Text>\n <HStack spacing={2}>\n <Button size=\"xs\" variant=\"outline\" onClick={() => applyPercent(25, { silent: true })}>25%</Button>\n <Button size=\"xs\" variant=\"outline\" onClick={() => applyPercent(50, { silent: true })}>50%</Button>\n <Button size=\"xs\" variant=\"outline\" onClick={() => applyPercent(75, { silent: true })}>75%</Button>\n <Button size=\"xs\" variant=\"outline\" onClick={() => applyPercent(100, { silent: true })}>100%</Button>\n <Button size=\"xs\" colorScheme=\"gray\" variant=\"ghost\" onClick={resetWidth}>Reset</Button>\n </HStack>\n <FormControl>\n <HStack justify=\"space-between\">\n <FormLabel fontSize=\"xs\" mb={0}>Šířka (%)</FormLabel>\n <Text fontSize=\"xs\" color=\"gray.500\">{widthPercent || 0}%</Text>\n </HStack>\n <input\n type=\"range\"\n min=\"5\"\n max=\"100\"\n value={widthPercent || 0}\n onChange={(e) => applyPercent(Number(e.target.value), { silent: true })}\n style={{ width: '100%' }}\n />\n </FormControl>\n </VStack>\n\n {/* Transform Buttons */}\n <VStack align=\"stretch\" spacing={2}>\n <Text fontSize=\"xs\" fontWeight=\"semibold\" color=\"gray.600\">Transformace</Text>\n <HStack spacing={2} flexWrap=\"wrap\">\n <Tooltip label=\"Otočit doleva\">\n <IconButton\n aria-label=\"Rotate left\"\n icon={<RotateCcw size={16} />}\n size=\"sm\"\n onClick={() => updateFilter('rotation', (imageFilters.rotation - 90) % 360)}\n colorScheme=\"blue\"\n variant=\"outline\"\n />\n </Tooltip>\n <Tooltip label=\"Otočit doprava\">\n <IconButton\n aria-label=\"Rotate right\"\n icon={<RotateCw size={16} />}\n size=\"sm\"\n onClick={() => updateFilter('rotation', (imageFilters.rotation + 90) % 360)}\n colorScheme=\"blue\"\n variant=\"outline\"\n />\n </Tooltip>\n <Tooltip label=\"Převrátit horizontálně\">\n <IconButton\n aria-label=\"Flip horizontal\"\n icon={<FlipHorizontal size={16} />}\n size=\"sm\"\n onClick={() => updateFilter('flipH', !imageFilters.flipH)}\n colorScheme=\"blue\"\n variant={imageFilters.flipH ? 'solid' : 'outline'}\n />\n </Tooltip>\n <Tooltip label=\"Převrátit vertikálně\">\n <IconButton\n aria-label=\"Flip vertical\"\n icon={<FlipVertical size={16} />}\n size=\"sm\"\n onClick={() => updateFilter('flipV', !imageFilters.flipV)}\n colorScheme=\"blue\"\n variant={imageFilters.flipV ? 'solid' : 'outline'}\n />\n </Tooltip>\n <Tooltip label=\"Smazat obrázek\">\n <IconButton\n aria-label=\"Delete image\"\n icon={<Trash2 size={16} />}\n size=\"sm\"\n onClick={deleteSelectedImage}\n colorScheme=\"red\"\n variant=\"outline\"\n />\n </Tooltip>\n <Tooltip label=\"Resetovat filtry\">\n <IconButton\n aria-label=\"Reset filters\"\n icon={<RotateCcw size={16} />}\n size=\"sm\"\n onClick={resetFilters}\n colorScheme=\"gray\"\n variant=\"outline\"\n />\n </Tooltip>\n </HStack>\n </VStack>\n\n {/* Filter Sliders */}\n <VStack align=\"stretch\" spacing={2}>\n <FormControl>\n <HStack justify=\"space-between\">\n <HStack spacing={1}>\n <Sun size={14} />\n <FormLabel fontSize=\"xs\" mb={0}>Jas</FormLabel>\n </HStack>\n <Text fontSize=\"xs\" color=\"gray.500\">{imageFilters.brightness}%</Text>\n </HStack>\n <input\n type=\"range\"\n min=\"0\"\n max=\"200\"\n value={imageFilters.brightness}\n onChange={(e) => updateFilter('brightness', Number(e.target.value))}\n style={{ width: '100%' }}\n />\n </FormControl>\n\n <FormControl>\n <HStack justify=\"space-between\">\n <HStack spacing={1}>\n <Contrast size={14} />\n <FormLabel fontSize=\"xs\" mb={0}>Kontrast</FormLabel>\n </HStack>\n <Text fontSize=\"xs\" color=\"gray.500\">{imageFilters.contrast}%</Text>\n </HStack>\n <input\n type=\"range\"\n min=\"0\"\n max=\"200\"\n value={imageFilters.contrast}\n onChange={(e) => updateFilter('contrast', Number(e.target.value))}\n style={{ width: '100%' }}\n />\n </FormControl>\n\n <FormControl>\n <HStack justify=\"space-between\">\n <HStack spacing={1}>\n <Droplets size={14} />\n <FormLabel fontSize=\"xs\" mb={0}>Sytost</FormLabel>\n </HStack>\n <Text fontSize=\"xs\" color=\"gray.500\">{imageFilters.saturation}%</Text>\n </HStack>\n <input\n type=\"range\"\n min=\"0\"\n max=\"200\"\n value={imageFilters.saturation}\n onChange={(e) => updateFilter('saturation', Number(e.target.value))}\n style={{ width: '100%' }}\n />\n </FormControl>\n\n <FormControl>\n <HStack justify=\"space-between\">\n <HStack spacing={1}>\n <Eye size={14} />\n <FormLabel fontSize=\"xs\" mb={0}>Rozostření</FormLabel>\n </HStack>\n <Text fontSize=\"xs\" color=\"gray.500\">{imageFilters.blur}px</Text>\n </HStack>\n <input\n type=\"range\"\n min=\"0\"\n max=\"10\"\n step=\"0.5\"\n value={imageFilters.blur}\n onChange={(e) => updateFilter('blur', Number(e.target.value))}\n style={{ width: '100%' }}\n />\n </FormControl>\n </VStack>\n\n {/* Quick Filters */}\n <HStack spacing={2} flexWrap=\"wrap\">\n <Button\n size=\"xs\"\n onClick={() => {\n updateFilter('grayscale', imageFilters.grayscale === 100 ? 0 : 100);\n }}\n colorScheme={imageFilters.grayscale === 100 ? 'purple' : 'gray'}\n variant={imageFilters.grayscale === 100 ? 'solid' : 'outline'}\n leftIcon={<Filter size={12} />}\n >\n Černobílá\n </Button>\n <Button\n size=\"xs\"\n onClick={() => {\n updateFilter('sepia', imageFilters.sepia === 100 ? 0 : 100);\n }}\n colorScheme={imageFilters.sepia === 100 ? 'orange' : 'gray'}\n variant={imageFilters.sepia === 100 ? 'solid' : 'outline'}\n leftIcon={<Sparkles size={12} />}\n >\n Sepia\n </Button>\n </HStack>\n\n {/* Apply All Changes Button */}\n <Button\n colorScheme=\"green\"\n size=\"md\"\n width=\"full\"\n onClick={applyFiltersToBackend}\n isLoading={isApplyingFilters}\n loadingText=\"Zpracování...\"\n leftIcon={<Check size={16} />}\n >\n Aplikovat všechny změny\n </Button>\n <Text fontSize=\"xs\" color=\"gray.500\" textAlign=\"center\">\n 💡 Filtry jsou pouze náhled. Klikněte pro trvalou aplikaci.\n </Text>\n </VStack>\n </Box>\n )}\n\n {/* Crop Modal */}\n {/* Link Modal */}\n <Modal isOpen={isLinkOpen} onClose={() => setIsLinkOpen(false)} isCentered>\n <ModalOverlay />\n <ModalContent maxW=\"lg\">\n <ModalHeader>Vložit odkaz</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack align=\"stretch\" spacing={3}>\n <FormControl>\n <FormLabel>Text odkazu</FormLabel>\n <Input\n value={linkText}\n onChange={(e) => setLinkText(e.target.value)}\n placeholder=\"Zobrazovaný text (nepovinné)\"\n />\n </FormControl>\n <FormControl isRequired>\n <FormLabel>URL</FormLabel>\n <Input\n value={linkUrl}\n onChange={(e) => setLinkUrl(e.target.value)}\n placeholder=\"https://... nebo /cesta\"\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); insertOrUpdateLink(); } }}\n />\n <FormHelperText>Zadejte plný nebo relativní odkaz</FormHelperText>\n </FormControl>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" mr={3} onClick={() => setIsLinkOpen(false)}>Zrušit</Button>\n <Button colorScheme=\"blue\" onClick={insertOrUpdateLink}>Vložit</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n <Drawer isOpen={isHtmlEditorOpen} placement=\"right\" size=\"lg\" onClose={() => setIsHtmlEditorOpen(false)}>\n <DrawerOverlay />\n <DrawerContent>\n <DrawerCloseButton />\n <DrawerHeader>{htmlEditMode === 'document' ? 'Upravit HTML (celý obsah)' : 'Vložit vlastní HTML'}</DrawerHeader>\n <DrawerBody>\n <VStack align=\"stretch\" spacing={4}>\n <FormControl>\n <FormLabel>HTML kód</FormLabel>\n {MonacoComponent ? (\n <MonacoComponent\n height=\"60vh\"\n defaultLanguage=\"html\"\n language=\"html\"\n theme=\"vs-light\"\n value={htmlSource}\n onChange={(v: string | undefined) => setHtmlSource(v || '')}\n options={{\n automaticLayout: true,\n wordWrap: 'on',\n minimap: { enabled: false },\n tabSize: 2,\n insertSpaces: true,\n formatOnPaste: true,\n formatOnType: true,\n suggestOnTriggerCharacters: true,\n }}\n />\n ) : (\n <Textarea\n value={htmlSource}\n onChange={(e) => setHtmlSource(e.target.value)}\n minH=\"200px\"\n fontFamily=\"monospace\"\n fontSize=\"sm\"\n />\n )}\n <FormHelperText>\n {htmlEditMode === 'document'\n ? 'Upravujete celý obsah. Po potvrzení se současný obsah editoru nahradí vaším HTML.'\n : 'Vložte libovolný HTML kód (např. <h1>Nadpis</h1>, <p>odstavec</p>, <ul>...</ul>). Po vložení se převede na plně funkční formátování v editoru.'}\n </FormHelperText>\n </FormControl>\n </VStack>\n </DrawerBody>\n <DrawerFooter>\n <Button variant=\"ghost\" mr={3} onClick={() => setIsHtmlEditorOpen(false)}>\n Zrušit\n </Button>\n <Button colorScheme=\"blue\" onClick={handleInsertHtmlBlock}>\n {htmlEditMode === 'document' ? 'Použít HTML' : 'Vložit do textu'}\n </Button>\n </DrawerFooter>\n </DrawerContent>\n </Drawer>\n\n <AlertDialog isOpen={isFullHtmlConfirmOpen} leastDestructiveRef={confirmCancelRef as any} onClose={() => setIsFullHtmlConfirmOpen(false)} isCentered>\n <AlertDialogOverlay />\n <AlertDialogContent>\n <AlertDialogHeader>Nahradit celý obsah HTML?</AlertDialogHeader>\n <AlertDialogCloseButton />\n <AlertDialogBody>\n Tato akce nahradí aktuální obsah editoru vaším HTML. Chcete pokračovat?\n <Box mt={3}>\n <Checkbox isChecked={confirmDontAsk} onChange={(e) => setConfirmDontAsk(e.target.checked)}>\n Neptat se příště\n </Checkbox>\n </Box>\n </AlertDialogBody>\n <AlertDialogFooter>\n <Button ref={confirmCancelRef as any} onClick={() => setIsFullHtmlConfirmOpen(false)} mr={3}>Zrušit</Button>\n <Button colorScheme=\"blue\" onClick={() => {\n try { if (confirmDontAsk) window.localStorage.setItem('rte_skip_full_html_confirm', '1'); } catch {}\n const quill = quillRef.current?.getEditor();\n if (!quill) { setIsFullHtmlConfirmOpen(false); return; }\n const sanitized = pendingSanitizedRef.current;\n const raw = pendingRawRef.current;\n const total = quill.getLength();\n quill.focus();\n try { quill.deleteText(0, total, 'api'); } catch {}\n try { quill.clipboard.dangerouslyPasteHTML(0, sanitized, 'user'); } catch { const fb = DOMPurify.sanitize(raw, { USE_PROFILES: { html: true } }); quill.insertText(0, fb, 'user'); }\n onChangeRef.current(cleanEditorHTML(quill.root.innerHTML));\n setIsHtmlEditorOpen(false);\n setHtmlSource('');\n setIsFullHtmlConfirmOpen(false);\n toast({ title: 'Obsah aktualizován', status: 'success', duration: 2000 });\n }}>Použít HTML</Button>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n\n {/* Crop Modal */}\n {/* Image Preview Modal */}\n <Modal isOpen={isPreviewOpen} onClose={() => setIsPreviewOpen(false)} size=\"6xl\" isCentered>\n <ModalOverlay bg=\"blackAlpha.800\" backdropFilter=\"blur(4px)\" />\n <ModalContent maxW=\"90vw\" maxH=\"90vh\" bg=\"transparent\" boxShadow=\"none\">\n <ModalCloseButton color=\"white\" bg=\"blackAlpha.600\" _hover={{ bg: 'blackAlpha.700' }} />\n <ModalBody display=\"flex\" alignItems=\"center\" justifyContent=\"center\" p={0}>\n {previewImage && (\n <ChakraImage\n src={previewImage}\n alt=\"Preview\"\n maxW=\"100%\"\n maxH=\"90vh\"\n objectFit=\"contain\"\n borderRadius=\"md\"\n boxShadow=\"2xl\"\n />\n )}\n </ModalBody>\n </ModalContent>\n </Modal>\n\n {/* Crop Modal */}\n <Modal isOpen={cropOpen} onClose={() => { setCropOpen(false); setCropSrc(null); }} size=\"6xl\">\n <ModalOverlay bg=\"blackAlpha.700\" backdropFilter=\"blur(4px)\" />\n <ModalContent maxW=\"90vw\" maxH=\"90vh\">\n <ModalHeader>Oříznout a upravit obrázek</ModalHeader>\n <ModalCloseButton />\n <ModalBody maxH=\"calc(90vh - 140px)\" overflowY=\"auto\" overflowX=\"hidden\">\n <VStack align=\"stretch\" spacing={4}>\n {cropSrc && (\n <Box \n display=\"flex\" \n justifyContent=\"center\" \n alignItems=\"center\" \n p={4}\n bg=\"gray.50\"\n borderRadius=\"md\"\n >\n <ReactCrop \n crop={crop} \n onChange={(c: Crop) => setCrop(c)}\n minWidth={50}\n minHeight={50}\n keepSelection\n >\n <img \n ref={imgRef as any} \n src={cropSrc || ''} \n alt=\"Crop preview\" \n style={{ \n maxWidth: '100%', \n maxHeight: '60vh',\n display: 'block',\n margin: 'auto'\n }} \n />\n </ReactCrop>\n </Box>\n )}\n \n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={4}>\n <FormControl>\n <FormLabel fontSize=\"sm\">Max. šířka (px)</FormLabel>\n <HStack>\n <Input \n type=\"number\" \n value={cropMaxWidth} \n onChange={(e) => setCropMaxWidth(Math.max(100, Math.min(3000, Number(e.target.value))))}\n min={100}\n max={3000}\n step={100}\n size=\"sm\"\n />\n <Text fontSize=\"sm\" color=\"gray.600\" whiteSpace=\"nowrap\">px</Text>\n </HStack>\n <FormHelperText fontSize=\"xs\">\n Větší obrázky budou zmenšeny (optimalizace výkonu)\n </FormHelperText>\n </FormControl>\n \n <FormControl>\n <FormLabel fontSize=\"sm\">Kvalita JPEG</FormLabel>\n <HStack>\n <Input \n type=\"number\" \n value={cropQuality} \n onChange={(e) => setCropQuality(Math.max(1, Math.min(100, Number(e.target.value))))}\n min={1}\n max={100}\n step={5}\n size=\"sm\"\n />\n <Text fontSize=\"sm\" color=\"gray.600\" whiteSpace=\"nowrap\">%</Text>\n </HStack>\n <FormHelperText fontSize=\"xs\">\n 85% je doporučená hodnota (menší velikost souboru)\n </FormHelperText>\n </FormControl>\n </SimpleGrid>\n \n <Text fontSize=\"sm\" color=\"gray.600\">\n 💡 Přetáhněte rohy a hrany modré oblasti pro výběr části obrázku k oříznutí.\n </Text>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" mr={3} onClick={() => { setCropOpen(false); setCropSrc(null); setCropFile(null); }} isDisabled={cropProcessing}>\n Zrušit\n </Button>\n <Button colorScheme=\"blue\" onClick={confirmCropAndInsert} isLoading={cropProcessing} loadingText=\"Zpracování...\">\n Oříznout a vložit\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </Box>\n );\n};\n\nexport default CustomRichEditor;\n","import React from 'react';\nimport CustomRichEditor from './CustomRichEditor';\nimport { uploadFile } from '../../services/articles';\nimport { assetUrl } from '../../utils/url';\n\ninterface RichTextEditorProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n height?: string;\n readOnly?: boolean;\n onImageUpload?: (file: File) => Promise<{ url: string }>;\n showImageResize?: boolean;\n toolbar?: 'full' | 'basic' | 'minimal' | string;\n}\n\nconst RichTextEditor: React.FC<RichTextEditorProps> = ({\n value,\n onChange,\n placeholder = 'Začněte psát...',\n height = '400px',\n readOnly = false,\n onImageUpload = uploadFile,\n showImageResize = true,\n toolbar = 'full',\n}) => {\n // Wrapper function to handle URL transformation\n const handleImageUpload = async (file: File) => {\n const res = await onImageUpload(file);\n // Transform URL if needed\n const url = assetUrl(res.url) || res.url;\n return { url };\n };\n\n return (\n <CustomRichEditor\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n height={height}\n readOnly={readOnly}\n onImageUpload={handleImageUpload}\n showImageResize={showImageResize}\n toolbar={toolbar as 'full' | 'basic' | 'minimal'}\n />\n );\n};\n\nexport default RichTextEditor;\n","import api, { API_URL } from './api';\n\nexport type YouTubeVideo = {\n video_id: string;\n title: string;\n thumbnail_url: string;\n views_text?: string;\n views?: number;\n published_text?: string;\n published_date?: string; // YYYY-MM-DD\n};\n\nexport type YouTubeChannelPayload = {\n channel: string;\n channel_url: string;\n subscribers_text?: string;\n subscribers?: number;\n videos: YouTubeVideo[];\n};\n\n// Simple in-memory cache for YouTube payload (per-session)\nlet ytMemCache: { payload: YouTubeChannelPayload | null; fetchedAt: number } | null = null;\nconst YT_CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour\n\nexport const getCachedYouTube = async (): Promise<YouTubeChannelPayload | null> => {\n const now = Date.now();\n if (ytMemCache && now - ytMemCache.fetchedAt < YT_CACHE_TTL_MS) {\n return sortByPublishedDate(ytMemCache.payload) as YouTubeChannelPayload | null;\n }\n try {\n const res = await api.get('/youtube/videos');\n const primary = res?.data as YouTubeChannelPayload | undefined;\n const hasVideos = Array.isArray(primary?.videos) && (primary!.videos.length > 0);\n // If backend responded with 204 or empty payload, fall back to the static cached JSON\n let out: YouTubeChannelPayload | null = null;\n if (res.status === 204 || !primary || !hasVideos) {\n out = await fetchStaticYouTubeCache();\n } else {\n out = primary || null;\n }\n if (out) {\n ytMemCache = { payload: out, fetchedAt: now };\n }\n return sortByPublishedDate(out) as YouTubeChannelPayload | null;\n } catch {\n // Fallback: fetch static cached JSON directly from backend /cache path to avoid stressing external API\n const out = await fetchStaticYouTubeCache();\n if (out) {\n ytMemCache = { payload: out, fetchedAt: now };\n }\n return out;\n }\n};\n\n// Helper: fetch static cached JSON from /cache/prefetch\nconst fetchStaticYouTubeCache = async (): Promise<YouTubeChannelPayload | null> => {\n try {\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n const url = `${origin}/cache/prefetch/youtube_channel.json`;\n const resp = await fetch(url, { cache: 'force-cache' });\n if (!resp.ok) return null;\n const data = (await resp.json()) as YouTubeChannelPayload;\n return sortByPublishedDate(data);\n } catch {\n return null;\n }\n};\n\n// Helper: ensure videos are sorted by most recent published_date\nconst sortByPublishedDate = (payload: YouTubeChannelPayload | null | undefined): YouTubeChannelPayload | null => {\n if (!payload || !Array.isArray(payload.videos)) return payload ?? null;\n const copy: YouTubeChannelPayload = { ...payload, videos: [...payload.videos] };\n copy.videos.sort((a, b) => {\n const ta = Date.parse(a.published_date || '') || 0;\n const tb = Date.parse(b.published_date || '') || 0;\n return tb - ta; // newest first\n });\n return copy;\n};\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Center, Spinner, useColorModeValue } from '@chakra-ui/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { getPublicScoreboard, getQr, listSponsorsPublic } from '@/services/scoreboard';\n\nconst css = `\nhtml, body { margin: 0; padding: 0; background: transparent; height: 100%; overflow: hidden; }\n.bar { position: fixed; left: 0; right: 0; bottom: 0; height: 80px; background: #000000; display: flex; align-items: center; padding: 0; box-sizing: border-box; overflow: hidden; }\n.scroller { position: relative; width: 100%; height: 100%; overflow: hidden; background: #ffffff; }\n.track { display: inline-flex; align-items: center; gap: 48px; height: 100%; white-space: nowrap; will-change: transform; animation: scroll linear infinite; animation-duration: var(--scroll-duration, 40s); }\n.item { height: 60px; width: auto; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }\n.item img { height: 30%; width: auto; max-width: 280px; min-width: 60px; object-fit: contain; display: block; filter: none; image-rendering: -webkit-optimize-contrast; image-rendering: crisp-edges; -webkit-backface-visibility: hidden; backface-visibility: hidden; transform: translateZ(0); }\n@keyframes scroll { from { transform: translateX(0); } to { transform: translateX(var(--scroll-distance, -50%)); } }\n.qr-float { position: fixed; right: 16px; bottom: 100px; width: 160px; height: 160px; background: #ffffff; border: 1px solid #e5e7eb; border-radius: 12px; box-shadow: 0 10px 30px rgba(0,0,0,0.22); display: grid; place-items: center; opacity: 0; visibility: hidden; transform: translateY(10px) scale(0.96); transition: opacity .35s ease, transform .35s ease, visibility 0s linear .35s; z-index: 9999; }\n.qr-float.show { opacity: 1; visibility: visible; transform: translateY(0) scale(1); transition: opacity .35s ease, transform .35s ease, visibility 0s; }\n.qr-float img { max-width: 88%; max-height: 88%; object-fit: contain; display: block; }\n`;\n\nconst OverlaySponsorsPage: React.FC = () => {\n const bg = useColorModeValue('transparent', 'transparent');\n const { data: sponsors, isLoading } = useQuery<string[]>({\n queryKey: ['public-sponsors-list'],\n queryFn: listSponsorsPublic,\n refetchInterval: 60000,\n staleTime: 30000,\n });\n\n const list = useMemo(() => Array.isArray(sponsors) ? sponsors.slice(0, 80) : [], [sponsors]);\n const trackRef = useRef<HTMLDivElement | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [duration, setDuration] = useState<number>(40);\n const [repeatCount, setRepeatCount] = useState<number>(2);\n const [scrollDistance, setScrollDistance] = useState<number>(0);\n const [qrUrl, setQrUrl] = useState<string>('');\n const [qrVisible, setQrVisible] = useState<boolean>(false);\n const scheduleRef = useRef<{ intId?: any } | null>(null);\n\n useEffect(() => {\n if (!trackRef.current) return;\n // After images load, compute single-copy width, repeat count, distance and duration\n const imgs = Array.from(trackRef.current.querySelectorAll('img')) as HTMLImageElement[];\n if (imgs.length === 0) {\n setDuration(40);\n setRepeatCount(2);\n setScrollDistance(0);\n return;\n }\n let completed = 0;\n const finalize = () => {\n try {\n const children = Array.from(trackRef.current!.children) as HTMLElement[];\n const copyLen = list.length;\n let singleWidth = 0; const gap = 48;\n for (let i = 0; i < Math.min(copyLen, children.length); i++) {\n const el = children[i];\n if (el && (el as HTMLElement).style.display !== 'none') singleWidth += el.getBoundingClientRect().width;\n }\n const used = Math.min(copyLen, children.length);\n if (used > 0) singleWidth += (used - 1) * gap;\n const contW = containerRef.current ? containerRef.current.getBoundingClientRect().width : 0;\n const repeat = singleWidth > 0 && contW > 0 ? Math.max(2, Math.min(10, Math.ceil((contW * 2) / singleWidth) + 1)) : 2;\n setRepeatCount(repeat);\n setScrollDistance(Math.max(0, Math.round(singleWidth)));\n const pps = 60; // pixels per second\n const d = singleWidth > 0 ? Math.max(15, singleWidth / pps) : 40;\n setDuration(Math.round(d));\n } catch {\n // defaults\n setRepeatCount(2);\n setScrollDistance(0);\n setDuration(40);\n }\n };\n const check = () => {\n completed++;\n if (completed >= imgs.length) finalize();\n };\n imgs.forEach((img) => {\n if (img.complete && img.naturalWidth > 0) check();\n else {\n img.addEventListener('load', check, { once: true });\n img.addEventListener('error', () => {\n const parent = img.parentElement as HTMLElement | null;\n if (parent) parent.style.display = 'none';\n check();\n }, { once: true });\n }\n });\n return () => {\n imgs.forEach((img) => { img.onload = null; img.onerror = null; });\n };\n }, [list]);\n\n useEffect(() => {\n let mounted = true;\n (async () => {\n try {\n const qr = await getQr();\n if (mounted && qr) setQrUrl(qr);\n } catch {}\n try {\n const st = await getPublicScoreboard();\n const everyMin = Math.max(1, Number(st.qrEvery || st.qrEvery === 0 ? st.qrEvery : (st as any).QRShowEveryMinutes || 5));\n const durSec = Math.max(5, Number(st.qrDuration || st.qrDuration === 0 ? st.qrDuration : (st as any).QRShowDurationSeconds || 60));\n // First show shortly after load, then on schedule\n const show = () => {\n setQrVisible(true);\n window.setTimeout(() => setQrVisible(false), durSec * 1000);\n };\n window.setTimeout(show, 2500);\n scheduleRef.current = { intId: window.setInterval(show, everyMin * 60 * 1000) };\n } catch {}\n })();\n return () => {\n mounted = false;\n if (scheduleRef.current?.intId) window.clearInterval(scheduleRef.current.intId);\n };\n }, []);\n\n return (\n <Box minH=\"100vh\" bg={bg}>\n <style>{css}</style>\n {isLoading ? (\n <Center minH=\"100vh\"><Spinner /></Center>\n ) : (\n <>\n <div className=\"bar\" ref={containerRef}>\n <div className=\"scroller\">\n <div className=\"track\" ref={trackRef} style={{ ['--scroll-duration' as any]: `${duration}s`, ['--scroll-distance' as any]: scrollDistance ? `-${scrollDistance}px` : undefined }}>\n {/* duplicate content multiple times for seamless loop */}\n {Array.from({ length: Math.max(2, repeatCount) }).flatMap((_, rIdx) => list.map((src, i) => (\n <div className=\"item\" key={`${src}-${rIdx}-${i}`}>\n <img src={src} alt=\"\" loading=\"eager\" decoding=\"async\" onError={(e)=>{ (e.currentTarget.parentElement as HTMLElement).style.display='none'; }} />\n </div>\n )))}\n </div>\n </div>\n </div>\n {qrUrl ? (\n <div className={`qr-float${qrVisible ? ' show' : ''}`} aria-hidden={!qrVisible}>\n <img src={qrUrl} alt=\"QR\" />\n </div>\n ) : null}\n </>\n )}\n </Box>\n );\n};\n\nexport default OverlaySponsorsPage;\n","import React from 'react';\nimport {\n Box,\n VStack,\n Heading,\n Spinner,\n Text,\n useColorModeValue,\n SimpleGrid,\n} from '@chakra-ui/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { getPolls, getPoll } from '../../services/polls';\nimport PollCard from './PollCard';\n\ninterface EmbeddedPollProps {\n articleId?: number;\n eventId?: number;\n videoUrl?: string;\n title?: string;\n showTitle?: boolean;\n maxPolls?: number;\n // When true, render without outer background/padding so parent wrapper controls layout\n unstyled?: boolean;\n}\n\n/**\n * EmbeddedPoll component - displays polls related to specific content\n * Use in article pages, event pages, or video pages\n */\nconst EmbeddedPoll: React.FC<EmbeddedPollProps> = ({\n articleId,\n eventId,\n videoUrl,\n title = 'Hlasování',\n showTitle = true,\n maxPolls,\n unstyled = false,\n}) => {\n const bgSection = useColorModeValue('gray.50', 'gray.900');\n\n // Build query params based on what's provided\n const queryParams: any = {};\n if (articleId) queryParams.article_id = articleId;\n if (eventId) queryParams.event_id = eventId;\n if (videoUrl) queryParams.video_url = videoUrl;\n\n // Fetch polls related to this content\n const { data: polls, isLoading } = useQuery({\n queryKey: ['embedded-polls', queryParams],\n queryFn: () => getPolls(queryParams),\n enabled: !!(articleId || eventId || videoUrl), // Only fetch if at least one param is provided\n staleTime: 2 * 60 * 1000,\n });\n\n // Get full poll data for each (all linked polls)\n const pollsToDisplay = polls || [];\n\n const preSortedLimited = React.useMemo(() => {\n const sorted = [...pollsToDisplay].sort((a, b) => {\n const aRating = a.type === 'rating' ? 1 : 0;\n const bRating = b.type === 'rating' ? 1 : 0;\n if (aRating !== bRating) return bRating - aRating;\n const aFeat = a.featured ? 1 : 0;\n const bFeat = b.featured ? 1 : 0;\n if (aFeat !== bFeat) return bFeat - aFeat;\n const aDate = new Date(a.created_at).getTime();\n const bDate = new Date(b.created_at).getTime();\n return bDate - aDate;\n });\n return typeof maxPolls === 'number' ? sorted.slice(0, maxPolls) : sorted;\n }, [pollsToDisplay, maxPolls]);\n\n const { data: pollsData, isLoading: isLoadingPolls } = useQuery({\n queryKey: ['embedded-polls-details', preSortedLimited.map((p) => p.id)],\n queryFn: async () => {\n const promises = preSortedLimited.map((poll) => getPoll(poll.id));\n return await Promise.all(promises);\n },\n enabled: preSortedLimited.length > 0,\n });\n\n // Don't render anything if no content identifier provided\n if (!articleId && !eventId && !videoUrl) {\n return null;\n }\n\n // Don't render if loading initially\n if (isLoading) {\n return (\n <Box py={4}>\n <VStack spacing={2}>\n <Spinner size=\"sm\" />\n <Text fontSize=\"sm\" color=\"gray.500\">\n Načítání hlasování...\n </Text>\n </VStack>\n </Box>\n );\n }\n\n // Don't render if no polls found\n if (!polls || polls.length === 0 || !pollsData || pollsData.length === 0) {\n return null;\n }\n\n // Wrapper styling: allow transparent/compact when unstyled\n const wrapperProps = unstyled\n ? { bg: 'transparent', py: 0, px: 0, borderRadius: 'none' as any, my: 0 }\n : { bg: bgSection, py: 8, px: 4, borderRadius: 'xl' as any, my: 8 };\n\n return (\n <Box {...wrapperProps}>\n <VStack spacing={6} maxW=\"6xl\" mx=\"auto\">\n {showTitle && (\n <Heading size=\"md\" textAlign=\"center\">\n {title}\n </Heading>\n )}\n\n {isLoadingPolls ? (\n <VStack py={8}>\n <Spinner />\n <Text>Načítání...</Text>\n </VStack>\n ) : (\n (() => {\n // Sort: rating first, then featured, then newest\n const sorted = [...(pollsData || [])].sort((a, b) => {\n const aRating = a.poll.type === 'rating' ? 1 : 0;\n const bRating = b.poll.type === 'rating' ? 1 : 0;\n if (aRating !== bRating) return bRating - aRating;\n const aFeat = a.poll.featured ? 1 : 0;\n const bFeat = b.poll.featured ? 1 : 0;\n if (aFeat !== bFeat) return bFeat - aFeat;\n const aDate = new Date(a.poll.created_at).getTime();\n const bDate = new Date(b.poll.created_at).getTime();\n return bDate - aDate;\n });\n const limited = typeof maxPolls === 'number' ? sorted.slice(0, maxPolls) : sorted;\n const count = limited.length;\n if (count === 1) {\n const pollResponse = limited[0];\n return (\n <Box w=\"full\">\n <PollCard\n poll={pollResponse.poll}\n hasVoted={pollResponse.has_voted}\n isActive={pollResponse.is_active}\n canShowResults={pollResponse.can_show_results}\n flat={unstyled}\n />\n </Box>\n );\n }\n if (count === 2) {\n return (\n <SimpleGrid w=\"full\" columns={{ base: 1, md: 2 }} spacing={4}>\n {limited.map((pollResponse) => (\n <Box key={pollResponse.poll.id}>\n <PollCard\n poll={pollResponse.poll}\n hasVoted={pollResponse.has_voted}\n isActive={pollResponse.is_active}\n canShowResults={pollResponse.can_show_results}\n flat={unstyled}\n />\n </Box>\n ))}\n </SimpleGrid>\n );\n }\n return (\n <SimpleGrid w=\"full\" columns={{ base: 1, sm: 2, lg: 3 }} spacing={4}>\n {limited.map((pollResponse) => (\n <Box key={pollResponse.poll.id}>\n <PollCard\n poll={pollResponse.poll}\n hasVoted={pollResponse.has_voted}\n isActive={pollResponse.is_active}\n canShowResults={pollResponse.can_show_results}\n flat={unstyled}\n />\n </Box>\n ))}\n </SimpleGrid>\n );\n })()\n )}\n </VStack>\n </Box>\n );\n};\n\nexport default EmbeddedPoll;\n\n","import { API_URL } from '../services/api';\n\n// Prefer explicit asset base when provided (e.g., http://127.0.0.1:8080)\nconst ASSET_BASE = process.env.REACT_APP_ASSET_BASE_URL;\nconst API_BASE = process.env.REACT_APP_API_BASE_URL;\n\n// Compute backend origin from API_URL (works with absolute or relative '/api/v1').\nexport function getBackendOrigin(): string {\n try {\n const winOrigin = typeof window !== 'undefined' ? window.location.origin : 'http://localhost';\n const winPort = typeof window !== 'undefined' ? window.location.port : '';\n // Derive from API base or API_URL (works with absolute or relative '/api/v1')\n const src = (API_BASE && API_BASE.trim() !== '') ? API_BASE : API_URL;\n const base = new URL(src, winOrigin);\n if ((/^(localhost|127\\.0\\.0\\.1)$/i.test(base.hostname)) && winPort === '3000') {\n return `${base.protocol}//${base.hostname}:8080`;\n }\n return base.origin;\n } catch {\n try {\n if (ASSET_BASE && ASSET_BASE.trim() !== '') {\n const u = new URL(ASSET_BASE, typeof window !== 'undefined' ? window.location.origin : 'http://localhost');\n return u.origin;\n }\n } catch {}\n return typeof window !== 'undefined' ? window.location.origin : '';\n }\n}\n\n// Utility to resolve asset URLs robustly.\n// - For '/uploads' and '/dist' paths, always prefix with backend origin\n// - For absolute URLs pointing to localhost/127.0.0.1, rewrite origin to backend origin if the path is '/uploads' or '/dist'\n// - For data: URIs, return as-is\nexport function assetUrl(pathOrUrl?: string | null): string | undefined {\n if (!pathOrUrl) return undefined;\n try {\n const val = String(pathOrUrl);\n const backendOrigin = getBackendOrigin();\n // data URI\n if (/^data:/i.test(val)) return val;\n\n // Absolute URL\n if (/^(?:https?:)?\\/\\//i.test(val)) {\n const u = new URL(val, window.location.origin);\n const isLocalHost = /^(localhost|127\\.0\\.0\\.1)(:\\d+)?$/i.test(u.host);\n const isBackendAsset = u.pathname.startsWith('/uploads') || u.pathname.startsWith('/dist');\n const isSameAsFrontend = typeof window !== 'undefined' ? (u.origin === window.location.origin) : false;\n if ((isLocalHost || isSameAsFrontend) && isBackendAsset) {\n return new URL(u.pathname + u.search + u.hash, backendOrigin + '/').toString();\n }\n return u.toString();\n }\n\n // Relative URL\n if (val.startsWith('/uploads') || val.startsWith('/dist')) {\n return new URL(val, backendOrigin + '/').toString();\n }\n // Otherwise leave as-is (component may resolve relative to current origin)\n return val;\n } catch {\n return pathOrUrl || undefined;\n }\n}\n\nexport function isUploadPath(pathOrUrl?: string | null): boolean {\n return !!pathOrUrl && /^\\/uploads\\//.test(pathOrUrl);\n}\n\n/**\n * Sanitizes club names by removing common suffixes and abbreviating long formal names\n * Examples:\n * - \"Tělovýchovná jednota Valašské Meziříčí, spolek\" -> \"TJ Valašské Meziříčí\"\n * - \"MFK Slavoj Bruntál, z. s.\" -> \"MFK Slavoj Bruntál\"\n */\nexport function sanitizeClubName(name?: string | null): string {\n if (!name) return '';\n \n let sanitized = name.trim();\n \n // Replace full form \"Tělovýchovná jednota\" with \"TJ\"\n sanitized = sanitized.replace(/^Tělovýchovná jednota\\s+/i, 'TJ ');\n \n // Replace full form \"Sportovní klub\" with \"SK\"\n sanitized = sanitized.replace(/^Sportovní klub\\s+/i, 'SK ');\n \n // Replace full form \"Fotbalový klub\" with \"FK\"\n sanitized = sanitized.replace(/^Fotbalový klub\\s+/i, 'FK ');\n \n // Replace full form \"Fotbal klub\" with \"FK\"\n sanitized = sanitized.replace(/^Fotbal klub\\s+/i, 'FK ');\n \n // Replace full form \"Sokol\" abbreviation\n sanitized = sanitized.replace(/^Sokol\\s+/i, 'SK ');\n \n // Remove common legal suffixes at the end\n sanitized = sanitized.replace(/,\\s*(spolek|z\\.\\s*s\\.|o\\.\\s*s\\.|z\\s*s|o\\s*s|spolková\\s+organizace|spolek\\s+registrovaný|z\\.s\\.|o\\.s\\.)$/i, '');\n \n return sanitized.trim();\n}\n","import React, { useState, useEffect } from 'react';\nimport {\n Box,\n Container,\n Heading,\n SimpleGrid,\n Stat,\n StatLabel,\n StatNumber,\n StatHelpText,\n Card,\n CardHeader,\n CardBody,\n Select,\n Tabs,\n TabList,\n TabPanels,\n Tab,\n TabPanel,\n Table,\n Thead,\n Tbody,\n Tr,\n Th,\n Td,\n Spinner,\n Text,\n useColorModeValue,\n VStack,\n HStack,\n Badge,\n Divider,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalBody,\n ModalCloseButton,\n useDisclosure,\n Button,\n Flex,\n Progress,\n Tooltip,\n Icon,\n} from '@chakra-ui/react';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport api from '../../services/api';\nimport { Bar } from 'react-chartjs-2';\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip as ChartTooltip,\n Legend,\n} from 'chart.js';\nimport { \n FiEye, \n FiUsers, \n FiActivity, \n FiPercent, \n FiClock,\n FiFile,\n FiLink,\n FiMonitor,\n FiCpu,\n FiGlobe,\n FiSmartphone,\n FiZap,\n FiTrendingUp,\n FiCalendar,\n FiSearch,\n FiInfo\n} from 'react-icons/fi';\n\n// Register ChartJS components\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n ChartTooltip,\n Legend\n);\n\ninterface Stats {\n pageviews?: { value: number };\n visitors?: { value: number };\n visits?: { value: number };\n bounces?: { value: number };\n totaltime?: { value: number };\n}\n\ninterface MetricItem {\n x: string;\n y: number;\n}\n\ninterface PageviewsData {\n date: string;\n value: number;\n}\n\n// Event translation and description mapping\nconst getEventTranslation = (eventName: string): { name: string; source: string; description: string } => {\n const eventMap: Record<string, { name: string; source: string; description: string }> = {\n 'Contact Form Submit': {\n name: 'Odeslání kontaktního formuláře',\n source: 'Kontaktní stránka',\n description: 'Uživatel odeslal kontaktní formulář na stránce Kontakt'\n },\n 'Contact Form': {\n name: 'Zobrazení kontaktního formuláře',\n source: 'Kontaktní stránka',\n description: 'Uživatel zobrazil kontaktní formulář'\n },\n 'Form Submit': {\n name: 'Odeslání formuláře',\n source: 'Různé stránky',\n description: 'Obecné odeslání formuláře na webu'\n },\n 'Newsletter Subscribe': {\n name: 'Odběr newsletteru',\n source: 'Newsletter formulář',\n description: 'Uživatel se přihlásil k odběru newsletteru'\n },\n 'Newsletter Submit': {\n name: 'Potvrzení newsletteru',\n source: 'Newsletter formulář',\n description: 'Uživatel potvrdil přihlášení k newsletteru'\n },\n 'Newsletter Unsubscribe': {\n name: 'Odhlášení z newsletteru',\n source: 'Nastavení newsletteru',\n description: 'Uživatel se odhlásil z odběru newsletteru'\n },\n 'Newsletter Preferences Saved': {\n name: 'Uložení předvoleb newsletteru',\n source: 'Nastavení newsletteru',\n description: 'Uživatel uložil své předvolby pro newsletter'\n },\n 'Unsubscribe': {\n name: 'Odhlášení z odběru',\n source: 'Nastavení',\n description: 'Uživatel se odhlásil z odběru'\n },\n 'Save Preferences': {\n name: 'Uložení předvoleb',\n source: 'Nastavení',\n description: 'Uživatel uložil své předvolby (souhlas s cookies apod.)'\n },\n 'Refresh Preferences': {\n name: 'Obnovení předvoleb',\n source: 'Nastavení',\n description: 'Uživatel obnovil nebo změnil své předvolby'\n },\n 'Article View': {\n name: 'Zobrazení článku',\n source: 'Blog',\n description: 'Uživatel si zobrazil článek na blogu'\n },\n 'Match View': {\n name: 'Zobrazení zápasu',\n source: 'Stránka zápasů',\n description: 'Uživatel si zobrazil detail zápasu'\n },\n 'Gallery View': {\n name: 'Zobrazení galerie',\n source: 'Galerie',\n description: 'Uživatel si otevřel galerii fotografií'\n },\n 'Video Play': {\n name: 'Přehrání videa',\n source: 'Video sekce',\n description: 'Uživatel spustil přehrávání videa'\n },\n 'Social Share': {\n name: 'Sdílení na sociálních sítích',\n source: 'Sdílecí tlačítka',\n description: 'Uživatel sdílel obsah na sociální síť'\n },\n 'Download': {\n name: 'Stažení souboru',\n source: 'Různé stránky',\n description: 'Uživatel stáhl soubor'\n },\n 'External Link Click': {\n name: 'Kliknutí na externí odkaz',\n source: 'Různé stránky',\n description: 'Uživatel klikl na odkaz vedoucí mimo web'\n },\n 'Poll Vote': {\n name: 'Hlasování v anketě',\n source: 'Ankety',\n description: 'Uživatel hlasoval v anketě'\n },\n 'Button Click': {\n name: 'Kliknutí na tlačítko',\n source: 'Různé stránky',\n description: 'Uživatel klikl na tlačítko'\n },\n 'Navigation': {\n name: 'Navigace',\n source: 'Menu / odkazy',\n description: 'Uživatel přešel na jinou stránku'\n },\n 'Search': {\n name: 'Vyhledávání',\n source: 'Vyhledávání',\n description: 'Uživatel vyhledával na webu'\n },\n 'Email Open': {\n name: 'Otevření emailu',\n source: 'Email',\n description: 'Příjemce otevřel email'\n },\n 'Email Click': {\n name: 'Kliknutí v emailu',\n source: 'Email',\n description: 'Příjemce klikl na odkaz v emailu'\n },\n 'Email Spam': {\n name: 'Označeno jako spam',\n source: 'Email',\n description: 'Příjemce označil zprávu jako spam'\n },\n 'Email Unsubscribe': {\n name: 'Odhlášení z emailu',\n source: 'Email',\n description: 'Příjemce se odhlásil z odběru'\n },\n 'ShortLink Click': {\n name: 'Kliknutí na zkrácený odkaz',\n source: 'Zkrácené odkazy',\n description: 'Uživatel klikl na zkrácený odkaz'\n },\n 'Link Redirect': {\n name: 'Přesměrování odkazu',\n source: 'Sledování odkazů',\n description: 'Zaznamenané přesměrování sledovaného odkazu'\n }\n };\n\n return eventMap[eventName] || {\n name: eventName,\n source: 'Neznámý zdroj',\n description: `Událost: ${eventName}`\n };\n};\n\nconst AnalyticsAdminPage: React.FC = () => {\n const [stats, setStats] = useState<Stats | null>(null);\n const [pageMetrics, setPageMetrics] = useState<MetricItem[]>([]);\n const [referrerMetrics, setReferrerMetrics] = useState<MetricItem[]>([]);\n const [browserMetrics, setBrowserMetrics] = useState<MetricItem[]>([]);\n const [osMetrics, setOsMetrics] = useState<MetricItem[]>([]);\n const [countryMetrics, setCountryMetrics] = useState<MetricItem[]>([]);\n const [deviceMetrics, setDeviceMetrics] = useState<MetricItem[]>([]);\n const [eventMetrics, setEventMetrics] = useState<MetricItem[]>([]);\n const [queryMetrics, setQueryMetrics] = useState<MetricItem[]>([]);\n const [pageviewsData, setPageviewsData] = useState<PageviewsData[]>([]);\n const [loading, setLoading] = useState(true);\n const [timeRange, setTimeRange] = useState('0'); // Default to \"today\"\n const [hasData, setHasData] = useState(false);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [noDataInfo, setNoDataInfo] = useState<string | null>(null);\n const [selectedCountry, setSelectedCountry] = useState<{\n code: string;\n name: string;\n value: number;\n } | null>(null);\n const [countryDetails, setCountryDetails] = useState<any>(null);\n const [loadingCountryDetails, setLoadingCountryDetails] = useState(false);\n const [umamiConfig, setUmamiConfig] = useState<any>(null);\n const [showDiagnostics, setShowDiagnostics] = useState(false);\n const { isOpen, onOpen, onClose } = useDisclosure();\n\n const bgColor = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n\n const fetchAnalytics = async (days: string) => {\n setLoading(true);\n setErrorMessage(null);\n setNoDataInfo(null);\n try {\n const daysNum = parseInt(days);\n \n // Fetch stats with calculated time range\n const statsResponse = await api.get(`/admin/insights/summary?days=${days}`);\n setStats(statsResponse.data);\n \n // Check if we have any data\n const hasAnyStats = statsResponse.data && (\n (statsResponse.data.pageviews?.value && statsResponse.data.pageviews.value > 0) ||\n (statsResponse.data.visitors?.value && statsResponse.data.visitors.value > 0)\n );\n\n // Fetch metrics\n const [pages, browsers, os, countries, devices, events, queries, pageviews] = await Promise.all([\n api.get(`/admin/insights/breakdown/url?days=${days}`),\n api.get(`/admin/insights/breakdown/browser?days=${days}`),\n api.get(`/admin/insights/breakdown/os?days=${days}`),\n api.get(`/admin/insights/breakdown/country?days=${days}`),\n api.get(`/admin/insights/breakdown/device?days=${days}`),\n api.get(`/admin/insights/breakdown/event?days=${days}`),\n api.get(`/admin/insights/breakdown/query?days=${days}`).catch(() => ({ data: [] })),\n api.get(`/admin/insights/pageviews?days=${days}`),\n ]);\n\n setPageMetrics(pages.data || []);\n setReferrerMetrics([]); // Removed - no longer fetching referrers\n setBrowserMetrics(browsers.data || []);\n setOsMetrics(os.data || []);\n setCountryMetrics(countries.data || []);\n setDeviceMetrics(devices.data || []);\n setEventMetrics(events.data || []);\n setQueryMetrics(queries.data || []);\n\n // Process real pageviews data from Umami\n const pageviewsDataArray: PageviewsData[] = [];\n const pageviewsResponse = pageviews.data || [];\n \n if (pageviewsResponse.length > 0) {\n for (const item of pageviewsResponse) {\n let label = '';\n const timestamp = item.t || item.time || item.date;\n \n if (daysNum === 0 || daysNum === 1) {\n // Hourly data - format as \"HH:00\"\n const date = new Date(timestamp);\n label = `${date.getHours().toString().padStart(2, '0')}:00`;\n } else {\n // Daily data - format as \"d. M.\"\n const date = new Date(timestamp);\n label = `${date.getDate()}. ${date.getMonth() + 1}.`;\n }\n \n pageviewsDataArray.push({\n date: label,\n value: item.y || item.value || 0\n });\n }\n }\n \n setPageviewsData(pageviewsDataArray);\n \n const hasPageviews = pageviewsDataArray.length > 0 && pageviewsDataArray.some(d => d.value > 0);\n const hasMetrics = pages.data?.length > 0 || countries.data?.length > 0;\n setHasData(hasAnyStats || hasPageviews || hasMetrics);\n \n const noData = !hasAnyStats && !hasPageviews && !hasMetrics;\n if (noData) {\n if (daysNum <= 1) {\n setNoDataInfo('Pro vybrané denní období zatím nebyla zaznamenána žádná návštěvnost. Zkuste později nebo zvolte delší období.');\n } else {\n setErrorMessage('Umami není správně nakonfigurováno nebo ještě nebyly zaznamenány žádné návštěvy. Zkontrolujte UMAMI_WEBSITE_ID v .env souboru.');\n }\n } else {\n setNoDataInfo(null);\n }\n } catch (error) {\n console.error('Failed to fetch analytics:', error);\n setErrorMessage('Chyba při načítání analytiky. Zkontrolujte připojení k Umami.');\n setHasData(false);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n fetchAnalytics(timeRange);\n fetchUmamiConfig();\n }, [timeRange]);\n\n const fetchUmamiConfig = async () => {\n try {\n const response = await api.get('/insights/config');\n setUmamiConfig(response.data);\n } catch (error) {\n console.error('Failed to fetch Umami config:', error);\n }\n };\n\n const handleCountryClick = async (countryCode: string, countryName: string, value: number) => {\n setSelectedCountry({ code: countryCode, name: countryName, value });\n setLoadingCountryDetails(true);\n onOpen();\n \n try {\n // Fetch detailed analytics for the selected country\n const [pages, browsers, os, devices, events] = await Promise.all([\n api.get(`/admin/insights/breakdown/url?days=${timeRange}&country=${countryCode}`),\n api.get(`/admin/insights/breakdown/browser?days=${timeRange}&country=${countryCode}`),\n api.get(`/admin/insights/breakdown/os?days=${timeRange}&country=${countryCode}`),\n api.get(`/admin/insights/breakdown/device?days=${timeRange}&country=${countryCode}`),\n api.get(`/admin/insights/breakdown/event?days=${timeRange}&country=${countryCode}`),\n ]);\n\n setCountryDetails({\n pages: pages.data || [],\n browsers: browsers.data || [],\n os: os.data || [],\n devices: devices.data || [],\n events: events.data || [],\n });\n } catch (error) {\n console.error('Failed to fetch country details:', error);\n setCountryDetails(null);\n } finally {\n setLoadingCountryDetails(false);\n }\n };\n\n const handleModalClose = () => {\n onClose();\n setSelectedCountry(null);\n setCountryDetails(null);\n };\n\n const formatNumber = (num: number | undefined) => {\n if (!num) return '0';\n return new Intl.NumberFormat('cs-CZ').format(num);\n };\n\n const formatDuration = (ms: number | undefined) => {\n if (!ms || ms === 0) return '0s';\n \n // Handle both milliseconds and seconds (Umami might return either)\n let totalSeconds = ms > 10000 ? Math.floor(ms / 1000) : Math.floor(ms);\n \n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n \n if (hours > 0) {\n return `${hours}h ${minutes}m ${seconds}s`;\n } else if (minutes > 0) {\n return `${minutes}m ${seconds}s`;\n }\n return `${seconds}s`;\n };\n\n const renderMetricTable = (metrics: MetricItem[], title: string, isEventMetrics: boolean = false) => (\n <Card bg={bgColor} borderColor={borderColor}>\n <CardHeader>\n <Heading size=\"sm\">{title}</Heading>\n </CardHeader>\n <CardBody>\n <Table variant=\"simple\" size=\"sm\">\n <Thead>\n <Tr>\n <Th>Název</Th>\n <Th isNumeric>Návštěvy</Th>\n </Tr>\n </Thead>\n <Tbody>\n {metrics.slice(0, 10).map((item, index) => {\n const eventInfo = isEventMetrics ? getEventTranslation(item.x) : null;\n return (\n <Tr key={index}>\n <Td>\n {isEventMetrics && eventInfo ? (\n <Tooltip label={eventInfo.description} placement=\"top\" hasArrow>\n <Box>\n <Text noOfLines={1} maxW=\"300px\" fontWeight=\"medium\">\n {eventInfo.name}\n </Text>\n <Text fontSize=\"xs\" color=\"gray.500\">\n {eventInfo.source}\n </Text>\n </Box>\n </Tooltip>\n ) : (\n <Text noOfLines={1} maxW=\"300px\">\n {item.x || '(prázdné)'}\n </Text>\n )}\n </Td>\n <Td isNumeric>\n <Badge colorScheme=\"blue\">{formatNumber(item.y)}</Badge>\n </Td>\n </Tr>\n );\n })}\n {metrics.length === 0 && (\n <Tr>\n <Td colSpan={2} textAlign=\"center\">\n <Text color=\"gray.500\">Žádná data</Text>\n </Td>\n </Tr>\n )}\n </Tbody>\n </Table>\n </CardBody>\n </Card>\n );\n\n if (loading && !stats) {\n return (\n <AdminLayout>\n <Container maxW=\"container.xl\" py={8}>\n <VStack spacing={4}>\n <Spinner size=\"xl\" />\n <Text>Načítání analytiky...</Text>\n </VStack>\n </Container>\n </AdminLayout>\n );\n }\n\n return (\n <AdminLayout>\n <Container maxW=\"container.xl\" py={8}>\n <VStack spacing={6} align=\"stretch\">\n {/* Header */}\n <HStack justify=\"space-between\" align=\"center\">\n <HStack spacing={3}>\n <Icon as={FiCalendar} color=\"blue.500\" boxSize={6} />\n <Heading size=\"lg\">Analytika webu</Heading>\n </HStack>\n <HStack>\n <Icon as={FiCalendar} color=\"gray.500\" boxSize={4} />\n <Select\n value={timeRange}\n onChange={(e) => setTimeRange(e.target.value)}\n maxW=\"200px\"\n >\n <option value=\"0\">Dnes (dnešní den)</option>\n <option value=\"1\">Včera</option>\n <option value=\"7\">Posledních 7 dní</option>\n <option value=\"30\">Posledních 30 dní</option>\n <option value=\"90\">Posledních 90 dní</option>\n <option value=\"365\">Poslední rok</option>\n </Select>\n </HStack>\n </HStack>\n\n {/* No data info for daily view */}\n {noDataInfo && (\n <Card bg=\"yellow.50\" borderColor=\"yellow.300\" borderWidth={2}>\n <CardBody>\n <HStack spacing={3} align=\"start\">\n <Icon as={FiInfo} color=\"yellow.600\" boxSize={6} mt={1} />\n <VStack align=\"start\" spacing={1}>\n <Text fontWeight=\"bold\" color=\"yellow.800\">Zatím žádná data</Text>\n <Text fontSize=\"sm\" color=\"yellow.700\">{noDataInfo}</Text>\n </VStack>\n </HStack>\n </CardBody>\n </Card>\n )}\n\n {/* Stats Overview */}\n <SimpleGrid columns={{ base: 1, md: 2, lg: 5 }} spacing={4}>\n <Card bg={bgColor} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <HStack spacing={2} mb={2}>\n <Icon as={FiEye} color=\"blue.500\" boxSize={5} />\n <StatLabel>Zobrazení stránek</StatLabel>\n </HStack>\n <StatNumber>{formatNumber(stats?.pageviews?.value)}</StatNumber>\n <StatHelpText>Celkový počet zobrazení</StatHelpText>\n </Stat>\n </CardBody>\n </Card>\n\n <Card bg={bgColor} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <HStack spacing={2} mb={2}>\n <Icon as={FiUsers} color=\"green.500\" boxSize={5} />\n <StatLabel>Návštěvníci</StatLabel>\n </HStack>\n <StatNumber>{formatNumber(stats?.visitors?.value)}</StatNumber>\n <StatHelpText>Unikátní návštěvníci</StatHelpText>\n </Stat>\n </CardBody>\n </Card>\n\n <Card bg={bgColor} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <HStack spacing={2} mb={2}>\n <Icon as={FiActivity} color=\"purple.500\" boxSize={5} />\n <StatLabel>Návštěvy</StatLabel>\n </HStack>\n <StatNumber>{formatNumber(stats?.visits?.value)}</StatNumber>\n <StatHelpText>Celkový počet relací</StatHelpText>\n </Stat>\n </CardBody>\n </Card>\n\n <Card bg={bgColor} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <HStack spacing={2} mb={2}>\n <Icon as={FiPercent} color=\"orange.500\" boxSize={5} />\n <StatLabel>Míra opuštění</StatLabel>\n </HStack>\n <StatNumber>\n {stats?.bounces?.value && stats?.visits?.value\n ? `${Math.round((stats.bounces.value / stats.visits.value) * 100)}%`\n : '0%'}\n </StatNumber>\n <StatHelpText>Odchody po 1 stránce</StatHelpText>\n </Stat>\n </CardBody>\n </Card>\n\n <Card bg={bgColor} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <HStack spacing={2} mb={2}>\n <Icon as={FiClock} color=\"teal.500\" boxSize={5} />\n <StatLabel>Průměrný čas</StatLabel>\n </HStack>\n <StatNumber>\n {formatDuration(\n stats?.totaltime?.value && stats?.visits?.value\n ? stats.totaltime.value / stats.visits.value\n : 0\n )}\n </StatNumber>\n <StatHelpText>Průměrná délka návštěvy</StatHelpText>\n </Stat>\n </CardBody>\n </Card>\n </SimpleGrid>\n\n {/* Diagnostics Panel */}\n {(!hasData || showDiagnostics) && (\n <Card bg=\"blue.50\" borderColor=\"blue.300\" borderWidth={2}>\n <CardBody>\n <HStack spacing={3} align=\"start\">\n <Icon as={FiActivity} color=\"blue.500\" boxSize={6} mt={1} />\n <VStack align=\"start\" spacing={3} flex={1}>\n <HStack justify=\"space-between\" w=\"full\">\n <Text fontWeight=\"bold\" color=\"blue.800\" fontSize=\"lg\">Diagnostika analytiky</Text>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n onClick={() => setShowDiagnostics(!showDiagnostics)}\n >\n {showDiagnostics ? 'Skrýt' : 'Zobrazit detaily'}\n </Button>\n </HStack>\n\n {/* Umami Connection Status */}\n <Box w=\"full\">\n <HStack spacing={2} mb={2}>\n <Badge colorScheme={umamiConfig?.enabled ? 'green' : 'red'}>\n {umamiConfig?.enabled ? 'Připojeno' : 'Nepřipojeno'}\n </Badge>\n <Text fontSize=\"sm\" fontWeight=\"semibold\" color=\"blue.800\">\n Stav Umami\n </Text>\n </HStack>\n {umamiConfig && (\n <VStack align=\"start\" spacing={1} pl={4}>\n <Text fontSize=\"xs\" color=\"blue.700\">\n <strong>Aktivováno:</strong> {umamiConfig.enabled ? 'Ano' : 'Ne'}\n </Text>\n {umamiConfig.website_id && (\n <Text fontSize=\"xs\" color=\"blue.700\">\n <strong>Website ID:</strong> {umamiConfig.website_id}\n </Text>\n )}\n {umamiConfig.reason && (\n <Text fontSize=\"xs\" color=\"red.600\">\n <strong>Důvod:</strong> {umamiConfig.reason}\n </Text>\n )}\n </VStack>\n )}\n </Box>\n\n <Divider borderColor=\"blue.200\" />\n\n {/* Why No Data */}\n {!hasData && (\n <>\n <Text fontSize=\"sm\" color=\"blue.800\" fontWeight=\"semibold\">\n Proč nejsou k dispozici žádná data?\n </Text>\n <VStack align=\"start\" spacing={1} pl={4}>\n <Text fontSize=\"xs\" color=\"blue.700\">\n • Umami tracking ještě nezaznamenal žádné návštěvy\n </Text>\n <Text fontSize=\"xs\" color=\"blue.700\">\n • Tracking script se načítá pouze na veřejných stránkách (ne na /admin)\n </Text>\n <Text fontSize=\"xs\" color=\"blue.700\">\n • Data se aktualizují v reálném čase po návštěvě veřejných stránek\n </Text>\n </VStack>\n\n <Divider borderColor=\"blue.200\" />\n\n <Text fontSize=\"sm\" color=\"blue.800\" fontWeight=\"semibold\">\n Jak vygenerovat testovací data:\n </Text>\n <VStack align=\"start\" spacing={1} pl={4}>\n <Text fontSize=\"xs\" color=\"blue.700\">\n 1. Otevřete hlavní stránku webu v novém okně inkognito\n </Text>\n <Text fontSize=\"xs\" color=\"blue.700\">\n 2. Procházejte několik veřejných stránek (Blog, O klubu, Kontakt...)\n </Text>\n <Text fontSize=\"xs\" color=\"blue.700\">\n 3. Počkejte 1-2 minuty a obnovte tuto stránku analytiky\n </Text>\n </VStack>\n\n <HStack spacing={2} mt={2}>\n <Button\n size=\"sm\"\n colorScheme=\"blue\"\n leftIcon={<Icon as={FiGlobe} />}\n onClick={() => window.open('/', '_blank')}\n >\n Otevřít hlavní stránku\n </Button>\n <Button\n size=\"sm\"\n colorScheme=\"blue\"\n variant=\"outline\"\n leftIcon={<Icon as={FiZap} />}\n onClick={() => window.location.reload()}\n >\n Obnovit analytiku\n </Button>\n </HStack>\n </>\n )}\n </VStack>\n </HStack>\n </CardBody>\n </Card>\n )}\n\n {/* Error Message */}\n {errorMessage && (\n <Card bg=\"orange.50\" borderColor=\"orange.300\" borderWidth={2}>\n <CardBody>\n <HStack spacing={3} align=\"start\">\n <Icon as={FiZap} color=\"orange.500\" boxSize={6} mt={1} />\n <VStack align=\"start\" spacing={2} flex={1}>\n <Text fontWeight=\"bold\" color=\"orange.800\" fontSize=\"lg\">Analytika není k dispozici</Text>\n <Text fontSize=\"sm\" color=\"orange.700\">{errorMessage}</Text>\n <Divider borderColor=\"orange.200\" />\n <Text fontSize=\"sm\" color=\"orange.800\" fontWeight=\"semibold\">Možné příčiny:</Text>\n <VStack align=\"start\" spacing={1} pl={4}>\n <Text fontSize=\"xs\" color=\"orange.700\">• Umami není spuštěno nebo není dostupné</Text>\n <Text fontSize=\"xs\" color=\"orange.700\">• V Umami instanci neexistuje žádný web</Text>\n <Text fontSize=\"xs\" color=\"orange.700\">• Nebyly ještě zaznamenány žádné návštěvy</Text>\n <Text fontSize=\"xs\" color=\"orange.700\">• Chybné přihlašovací údaje v .env souboru</Text>\n </VStack>\n <Divider borderColor=\"orange.200\" />\n <Text fontSize=\"sm\" color=\"orange.800\" fontWeight=\"semibold\">Řešení:</Text>\n <VStack align=\"start\" spacing={1} pl={4}>\n <Text fontSize=\"xs\" color=\"orange.700\">\n 1. Zkontrolujte, že Umami běží na <strong>{process.env.REACT_APP_UMAMI_URL || 'nakonfigurované URL'}</strong>\n </Text>\n <Text fontSize=\"xs\" color=\"orange.700\">\n 2. Přihlaste se do Umami a vytvořte nový web, pokud žádný neexistuje\n </Text>\n <Text fontSize=\"xs\" color=\"orange.700\">\n 3. Restartujte backend server pro opětovné připojení\n </Text>\n <Text fontSize=\"xs\" color=\"orange.700\">\n 4. Zkontrolujte backend logy pro detailní chybové zprávy\n </Text>\n </VStack>\n <Button\n size=\"sm\"\n colorScheme=\"orange\"\n variant=\"outline\"\n leftIcon={<Icon as={FiZap} />}\n onClick={() => window.location.reload()}\n mt={2}\n >\n Znovu načíst stránku\n </Button>\n </VStack>\n </HStack>\n </CardBody>\n </Card>\n )}\n\n <Divider />\n\n {/* Country Flags Section */}\n <Card bg={bgColor} borderColor={borderColor}>\n <CardHeader>\n <HStack spacing={2}>\n <Icon as={FiGlobe} color=\"green.500\" boxSize={5} />\n <Heading size=\"md\">Návštěvníci podle zemí</Heading>\n </HStack>\n </CardHeader>\n <CardBody>\n {loading && countryMetrics.length === 0 ? (\n <Flex justify=\"center\" py={8}>\n <Spinner size=\"lg\" />\n </Flex>\n ) : countryMetrics.length === 0 ? (\n <Text textAlign=\"center\" color=\"gray.500\" py={8}>\n Žádná data o zemích\n </Text>\n ) : (\n <SimpleGrid columns={{ base: 1, sm: 2, md: 3, lg: 4 }} spacing={4}>\n {countryMetrics.slice(0, 12).map((country, index) => {\n const countryCode = country.x?.toUpperCase() || '';\n const countryName = new Intl.DisplayNames(['cs', 'en'], { type: 'region' }).of(countryCode) || countryCode;\n const flagEmoji = countryCode.length === 2 \n ? String.fromCodePoint(...[...countryCode].map(c => 0x1F1E6 - 65 + c.charCodeAt(0)))\n : '🏳️';\n \n return (\n <Card \n key={index}\n variant=\"outline\"\n cursor=\"pointer\"\n transition=\"all 0.2s\"\n _hover={{ \n transform: 'translateY(-2px)', \n boxShadow: 'md',\n borderColor: 'blue.400'\n }}\n onClick={() => handleCountryClick(countryCode, countryName, country.y)}\n >\n <CardBody p={4}>\n <VStack spacing={2}>\n <Text fontSize=\"4xl\">{flagEmoji}</Text>\n <Text fontWeight=\"semibold\" fontSize=\"sm\" noOfLines={1}>\n {countryName}\n </Text>\n <Badge colorScheme=\"blue\" fontSize=\"sm\">\n {formatNumber(country.y)} návštěv\n </Badge>\n </VStack>\n </CardBody>\n </Card>\n );\n })}\n </SimpleGrid>\n )}\n </CardBody>\n </Card>\n\n {/* Detailed Metrics */}\n <Tabs colorScheme=\"blue\">\n <TabList flexWrap=\"wrap\">\n <Tab><HStack spacing={2}><Icon as={FiFile} /><Text>Stránky</Text></HStack></Tab>\n <Tab><HStack spacing={2}><Icon as={FiMonitor} /><Text>Prohlížeče</Text></HStack></Tab>\n <Tab><HStack spacing={2}><Icon as={FiCpu} /><Text>Operační systémy</Text></HStack></Tab>\n <Tab><HStack spacing={2}><Icon as={FiGlobe} /><Text>Země</Text></HStack></Tab>\n <Tab><HStack spacing={2}><Icon as={FiSmartphone} /><Text>Zařízení</Text></HStack></Tab>\n <Tab><HStack spacing={2}><Icon as={FiZap} /><Text>Události</Text></HStack></Tab>\n <Tab><HStack spacing={2}><Icon as={FiSearch} /><Text>Query parametry</Text></HStack></Tab>\n </TabList>\n\n <TabPanels>\n <TabPanel>\n {renderMetricTable(pageMetrics, 'Nejnavštěvovanější stránky')}\n </TabPanel>\n\n <TabPanel>\n {renderMetricTable(browserMetrics, 'Používané prohlížeče')}\n </TabPanel>\n\n <TabPanel>{renderMetricTable(osMetrics, 'Operační systémy')}</TabPanel>\n\n <TabPanel>{renderMetricTable(countryMetrics, 'Země návštěvníků')}</TabPanel>\n\n <TabPanel>{renderMetricTable(deviceMetrics, 'Typy zařízení')}</TabPanel>\n\n <TabPanel>\n {renderMetricTable(eventMetrics, 'Události uživatelů', true)}\n </TabPanel>\n\n <TabPanel>\n {renderMetricTable(queryMetrics, 'Query parametry URL')}\n </TabPanel>\n </TabPanels>\n </Tabs>\n </VStack>\n </Container>\n\n {/* Country Details Modal */}\n <Modal isOpen={isOpen} onClose={handleModalClose} size=\"6xl\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>\n <Flex align=\"center\" gap={3}>\n <Text>Analytika pro zemi: {selectedCountry?.name}</Text>\n <Badge colorScheme=\"blue\" fontSize=\"sm\">\n {formatNumber(selectedCountry?.value)} návštěv\n </Badge>\n </Flex>\n </ModalHeader>\n <ModalCloseButton />\n <ModalBody pb={6}>\n {loadingCountryDetails ? (\n <Flex justify=\"center\" align=\"center\" py={8}>\n <Spinner size=\"lg\" />\n <Text ml={3}>Načítání detailů...</Text>\n </Flex>\n ) : countryDetails ? (\n <Tabs colorScheme=\"blue\">\n <TabList>\n <Tab>Stránky</Tab>\n <Tab>Prohlížeče</Tab>\n <Tab>Operační systémy</Tab>\n <Tab>Zařízení</Tab>\n <Tab>Události</Tab>\n </TabList>\n\n <TabPanels>\n <TabPanel>\n {renderMetricTable(countryDetails.pages, `Nejnavštěvovanější stránky v ${selectedCountry?.name}`)}\n </TabPanel>\n\n <TabPanel>\n {renderMetricTable(countryDetails.browsers, `Používané prohlížeče v ${selectedCountry?.name}`)}\n </TabPanel>\n\n <TabPanel>\n {renderMetricTable(countryDetails.os, `Operační systémy v ${selectedCountry?.name}`)}\n </TabPanel>\n\n <TabPanel>\n {renderMetricTable(countryDetails.devices, `Typy zařízení v ${selectedCountry?.name}`)}\n </TabPanel>\n\n <TabPanel>\n {renderMetricTable(countryDetails.events, `Události uživatelů z ${selectedCountry?.name}`, true)}\n </TabPanel>\n </TabPanels>\n </Tabs>\n ) : (\n <Box textAlign=\"center\" py={8}>\n <Text color=\"gray.500\">\n Pro vybranou zemi nejsou k dispozici detailní data.\n </Text>\n </Box>\n )}\n </ModalBody>\n </ModalContent>\n </Modal>\n </AdminLayout>\n );\n};\n\nexport default AnalyticsAdminPage;\n","import React from 'react';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport {\n Box,\n Heading,\n HStack,\n VStack,\n Button,\n Input,\n Select,\n Table,\n Thead,\n Tbody,\n Tr,\n Th,\n Td,\n Text,\n Badge,\n IconButton,\n useToast,\n Switch,\n NumberInput,\n NumberInputField,\n Image,\n Divider,\n Avatar,\n Progress,\n useColorModeValue,\n FormControl,\n FormLabel,\n FormHelperText,\n useDisclosure,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalBody,\n ModalFooter,\n ModalCloseButton,\n Checkbox,\n CheckboxGroup,\n Wrap,\n WrapItem,\n} from '@chakra-ui/react';\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport {\n adminListRewards,\n adminCreateReward,\n adminUpdateReward,\n adminDeleteReward,\n adminListRedemptions,\n adminUpdateRedemptionStatus,\n adminGetLeaderboard,\n adminListTransactions,\n adminAdjustPoints,\n AdminRewardItem,\n AdminRedemption,\n adminListUsers,\n type AdminUserListItem,\n} from '../../services/admin/engagement';\nimport { FiTrash2, FiEdit2, FiCopy } from 'react-icons/fi';\nimport api from '../../services/api';\nimport { assetUrl } from '../../utils/url';\nimport { PasswordHelpTooltip, HelpTooltipCard } from '../../components/common/HelpTooltipCard';\nimport UploadPanel from '../../components/common/UploadPanel';\n\n// Quick presets for sizes and colors\nconst SIZE_OPTIONS = ['XS','S','M','L','XL','XXL','XXXL','UNI'];\nconst COLOR_OPTIONS = ['Černá','Bílá','Modrá','Červená','Zelená','Žlutá','Oranžová','Fialová','Šedá','Růžová','Hnědá','Navy','Béžová','Tyrkysová','Vínová'];\n\nconst EngagementAdminPage: React.FC = () => {\n const toast = useToast();\n const qc = useQueryClient();\n const cardBg = useColorModeValue('white', 'gray.800');\n const border = useColorModeValue('gray.200', 'gray.700');\n\n const [rewardFilter, setRewardFilter] = React.useState<'all'|'active'|'inactive'>('all');\n const rewardsQ = useQuery({\n queryKey: ['admin-engagement-rewards', rewardFilter],\n queryFn: () => rewardFilter === 'all' ? adminListRewards() : adminListRewards({ active: rewardFilter === 'active' }),\n });\n const redemptionsQ = useQuery({\n queryKey: ['admin-engagement-redemptions'],\n queryFn: () => adminListRedemptions(),\n });\n\n const [form, setForm] = React.useState({\n name: '',\n type: 'merch_digital',\n cost_points: 50,\n image_url: '',\n stock: -1,\n active: true,\n });\n\n // Create form helpers\n const [validUnlimited, setValidUnlimited] = React.useState<boolean>(true);\n const [sizeList, setSizeList] = React.useState<string[]>([]);\n const [colorList, setColorList] = React.useState<string[]>([]);\n const [sizeCustom, setSizeCustom] = React.useState<string>('');\n const [colorCustom, setColorCustom] = React.useState<string>('');\n\n const [editItem, setEditItem] = React.useState<AdminRewardItem | null>(null);\n const editModal = useDisclosure();\n const [editForm, setEditForm] = React.useState<Partial<AdminRewardItem>>({});\n // Remove raw JSON editing, keep structured metadata only\n\n // Structured metadata state (used for merch types, coupons, etc.)\n const [meta, setMeta] = React.useState<Record<string, any>>({});\n const [editMeta, setEditMeta] = React.useState<Record<string, any>>({});\n\n // Users list for dropdowns and labels\n const usersQ = useQuery({\n queryKey: ['admin-users'],\n queryFn: adminListUsers,\n staleTime: 30000,\n });\n const usersById = React.useMemo(() => {\n const m = new Map<number, AdminUserListItem>();\n (usersQ.data || []).forEach((u) => m.set(u.id, u));\n return m;\n }, [usersQ.data]);\n\n // Removed reward templates UI\n\n const setMetaField = (k: string, v: string) => {\n const next = { ...meta, [k]: v };\n setMeta(next);\n };\n const setEditMetaField = (k: string, v: string) => {\n const next = { ...editMeta, [k]: v };\n setEditMeta(next);\n };\n\n const createMut = useMutation({\n mutationFn: async () => {\n // Build metadata including structured helpers\n const md: Record<string, any> = { ...(Object.keys(meta).length ? meta : {}) };\n if (validUnlimited) { delete md.valid_from; delete md.valid_to; }\n if (sizeList.length) md.size = sizeList.join(',');\n if (colorList.length) md.color = colorList.join(',');\n const metadata = Object.keys(md).length ? md : undefined;\n return adminCreateReward({ ...form, metadata });\n },\n onSuccess: async () => {\n setForm({ name: '', type: 'merch_digital', cost_points: 50, image_url: '', stock: -1, active: true });\n setValidUnlimited(true);\n setSizeList([]); setColorList([]); setSizeCustom(''); setColorCustom(''); setMeta({});\n await qc.invalidateQueries({ queryKey: ['admin-engagement-rewards'] });\n toast({ status: 'success', title: 'Odměna vytvořena' });\n },\n onError: (e: any) => toast({ status: 'error', title: e?.message || e?.response?.data?.error || 'Chyba při vytváření odměny' }),\n });\n\n const updateMut = useMutation({\n mutationFn: (args: { id: number; body: Partial<AdminRewardItem> }) => adminUpdateReward(args.id, args.body as any),\n onSuccess: async () => { await qc.invalidateQueries({ queryKey: ['admin-engagement-rewards'] }); toast({ status: 'success', title: 'Aktualizováno' }); },\n });\n\n const deleteMut = useMutation({\n mutationFn: (id: number) => adminDeleteReward(id),\n onSuccess: async () => { await qc.invalidateQueries({ queryKey: ['admin-engagement-rewards'] }); toast({ status: 'success', title: 'Smazáno' }); },\n });\n\n const redStatusMut = useMutation({\n mutationFn: (args: { id: number; action: 'approve'|'reject'|'fulfill' }) => adminUpdateRedemptionStatus(args.id, args.action),\n onSuccess: async () => { await qc.invalidateQueries({ queryKey: ['admin-engagement-redemptions'] }); toast({ status: 'success', title: 'Status aktualizován' }); },\n });\n\n \n\n const rewards = rewardsQ.data || [];\n const redemptions = redemptionsQ.data || [];\n const [metric, setMetric] = React.useState<'points'|'level'|'xp'>('points');\n const [leaders, setLeaders] = React.useState<any[]>([]);\n const [loadingLb, setLoadingLb] = React.useState(false);\n\n const rewardById = React.useMemo(() => {\n const m = new Map<number, AdminRewardItem>();\n for (const r of rewards) m.set(r.id as any, r);\n return m;\n }, [rewards]);\n\n React.useEffect(() => {\n let mounted = true;\n (async () => {\n try {\n setLoadingLb(true);\n const res = await adminGetLeaderboard(metric, 50);\n if (mounted) setLeaders(res.items || []);\n } catch {\n if (mounted) setLeaders([]);\n } finally {\n if (mounted) setLoadingLb(false);\n }\n })();\n return () => { mounted = false; };\n }, [metric]);\n\n return (\n <AdminLayout>\n <Box>\n <Heading size=\"md\" mb={4}>Odměny & Úspěchy</Heading>\n <VStack align=\"stretch\" spacing={4}>\n <Box>\n <Heading size=\"sm\" mb={2}>Žebříčky</Heading>\n <HStack justify=\"space-between\" mb={2}>\n <Text fontSize=\"sm\" color=\"gray.500\">Top uživatelé podle zvoleného metrického ukazatele</Text>\n <Select size=\"sm\" value={metric} onChange={(e)=>setMetric(e.target.value as any)} maxW=\"180px\">\n <option value=\"points\">Body</option>\n <option value=\"level\">Úroveň</option>\n <option value=\"xp\">XP</option>\n </Select>\n </HStack>\n <Box borderWidth=\"1px\" borderRadius=\"md\" borderColor={border} bg={cardBg} p={3}>\n <VStack align=\"stretch\" spacing={2}>\n {loadingLb && <Text>Načítám…</Text>}\n {!loadingLb && leaders.length === 0 && <Text>Žádná data k zobrazení.</Text>}\n {!loadingLb && leaders.map((it: any) => {\n const value = metric === 'points' ? it.points : (metric === 'level' ? it.level : it.xp);\n const max = Math.max(...leaders.map((l: any) => metric === 'points' ? l.points : (metric === 'level' ? l.level : l.xp)), 1);\n const pct = Math.max(2, Math.floor((Number(value) / Number(max)) * 100));\n const name = `${it.first_name || ''} ${it.last_name || ''}`.trim() || it.email || `#${it.user_id}`;\n return (\n <HStack key={`lb-${metric}-${it.user_id}`} spacing={3}>\n <Badge colorScheme=\"blue\">{it.rank}</Badge>\n <Avatar size=\"sm\" name={name} src={it.animated_avatar_url || it.avatar_url || undefined} />\n <Box flex={1}>\n <HStack justify=\"space-between\">\n <Text fontWeight=\"600\" noOfLines={1}>{name}</Text>\n <Text fontSize=\"sm\">{value}</Text>\n </HStack>\n <Progress value={pct} size=\"sm\" colorScheme=\"blue\" borderRadius=\"full\" mt={1} />\n </Box>\n </HStack>\n );\n })}\n </VStack>\n </Box>\n </Box>\n <Box>\n <HStack justify=\"space-between\" align=\"center\" mb={2}>\n <Heading size=\"sm\">Vytvořit novou odměnu</Heading>\n <HelpTooltipCard\n label=\"Jak nastavit odměnu\"\n title=\"Vytvoření odměny pro věrnostní systém\"\n items={[\n 'Každá odměna má typ (digitální, kupon, fyzický merch, vlastní), který určuje, jaké informace je potřeba vyplnit a co se stane po uplatnění.',\n 'Pole Množství/Sklad používá hodnotu -1 pro neomezený počet kusů a 0 pro vyprodáno; u povinných avatarových odměn je sklad vždy neomezený.',\n 'Cenu v bodech volte konzistentně s ostatními odměnami, aby měly fanoušci jasnou představu o „hodnotě“ bodů.',\n ]}\n />\n </HStack>\n <VStack align=\"stretch\" spacing={3} borderWidth=\"1px\" borderRadius=\"md\" p={3}>\n {/* Šablony odměn odstraněny */}\n <HStack align=\"start\" spacing={4}>\n <VStack align=\"stretch\" spacing={3} flex={1}>\n <FormControl>\n <FormLabel>Název</FormLabel>\n <Input placeholder=\"Např. Modrý avatar #1\" value={form.name} onChange={(e) => setForm({ ...form, name: e.target.value })} />\n </FormControl>\n <FormControl>\n <FormLabel>Typ odměny</FormLabel>\n <Select value={form.type} onChange={(e) => setForm({ ...form, type: e.target.value })}>\n <option value=\"merch_digital\">Digitální odměna</option>\n <option value=\"merch_coupon\">Merch kupon</option>\n <option value=\"merch_physical\">Merch (fyzický)</option>\n <option value=\"custom\">Vlastní</option>\n </Select>\n <FormHelperText>Ovlivňuje chování po uplatnění (např. nastavení avataru).</FormHelperText>\n </FormControl>\n <HStack>\n <FormControl>\n <FormLabel>Body</FormLabel>\n <NumberInput value={form.cost_points} min={0} onChange={(_v, n) => setForm({ ...form, cost_points: Number.isFinite(n) ? n : 0 })}>\n <NumberInputField placeholder=\"Počet bodů\" />\n </NumberInput>\n <FormHelperText>~ {Math.round(Number(form.cost_points || 0) * 0.1)} Kč</FormHelperText>\n </FormControl>\n <FormControl>\n <FormLabel>Množství/Sklad</FormLabel>\n <HStack>\n <NumberInput value={form.stock} min={-1} isDisabled={form.stock === -1} onChange={(_v, n) => setForm({ ...form, stock: Number.isFinite(n) ? n : -1 })}>\n <NumberInputField placeholder=\"Ks (-1 = neomezeně, 0 = vyprodáno)\" />\n </NumberInput>\n <HStack>\n <Text fontSize=\"sm\">Neomezeně</Text>\n <Switch\n isChecked={form.stock === -1}\n onChange={(e)=> setForm(prev => ({\n ...prev,\n stock: e.target.checked ? -1 : Math.max(0, Number(prev.stock) === -1 ? 0 : Number(prev.stock)||0),\n }))}\n />\n </HStack>\n </HStack>\n </FormControl>\n </HStack>\n <VStack align=\"stretch\" spacing={2} mt={2}>\n <HStack>\n <Text>Neomezená platnost</Text>\n <Switch\n isChecked={validUnlimited}\n onChange={(e)=>{\n const on = e.target.checked;\n setValidUnlimited(on);\n if (on) { setMetaField('valid_from', ''); setMetaField('valid_to', ''); }\n }}\n />\n </HStack>\n <FormControl isDisabled={validUnlimited}>\n <FormLabel>Platnost od</FormLabel>\n <Input type=\"datetime-local\" value={meta.valid_from || ''} onChange={(e)=>setMetaField('valid_from', e.target.value)} />\n </FormControl>\n <FormControl isDisabled={validUnlimited}>\n <FormLabel>Platnost do</FormLabel>\n <Input type=\"datetime-local\" value={meta.valid_to || ''} onChange={(e)=>setMetaField('valid_to', e.target.value)} />\n <FormHelperText>Když je zapnuto „Neomezená platnost“, datumy se nevyžadují a ignorují.</FormHelperText>\n </FormControl>\n </VStack>\n {/* Metadata helpers */}\n {form.type === 'merch_coupon' && (\n <VStack align=\"stretch\" spacing={2}>\n <FormControl>\n <FormLabel>Kód kuponu</FormLabel>\n <Input value={meta.coupon_code || ''} onChange={(e)=>setMetaField('coupon_code', e.target.value)} />\n </FormControl>\n <FormControl>\n <FormLabel>Poznámka</FormLabel>\n <Input value={meta.note || ''} onChange={(e)=>setMetaField('note', e.target.value)} />\n </FormControl>\n </VStack>\n )}\n {form.type === 'merch_physical' && (\n <VStack align=\"stretch\" spacing={2}>\n <FormControl>\n <FormLabel>Velikosti</FormLabel>\n <CheckboxGroup value={sizeList} onChange={(vals)=>setSizeList(vals as string[])}>\n <Wrap spacing={3}>\n {SIZE_OPTIONS.map((s)=> (\n <WrapItem key={s}><Checkbox value={s}>{s}</Checkbox></WrapItem>\n ))}\n </Wrap>\n </CheckboxGroup>\n <HStack mt={1} spacing={2}>\n <Input placeholder=\"Vlastní velikosti, oddělte čárkami\" value={sizeCustom} onChange={(e)=>setSizeCustom(e.target.value)} />\n <Button size=\"sm\" onClick={()=>{\n const parts = (sizeCustom || '').split(',').map(s=>s.trim()).filter(Boolean);\n if (!parts.length) return;\n setSizeList(prev => Array.from(new Set([...prev, ...parts])));\n setSizeCustom('');\n }}>Přidat</Button>\n </HStack>\n <FormHelperText>Vyberte z nabídky nebo zadejte vlastní hodnoty, oddělené čárkami (např. 122, 128).</FormHelperText>\n </FormControl>\n <FormControl>\n <FormLabel>Barvy</FormLabel>\n <CheckboxGroup value={colorList} onChange={(vals)=>setColorList(vals as string[])}>\n <Wrap spacing={3}>\n {COLOR_OPTIONS.map((c)=> (\n <WrapItem key={c}><Checkbox value={c}>{c}</Checkbox></WrapItem>\n ))}\n </Wrap>\n </CheckboxGroup>\n <HStack mt={1} spacing={2}>\n <Input placeholder=\"Vlastní barvy, oddělte čárkami\" value={colorCustom} onChange={(e)=>setColorCustom(e.target.value)} />\n <Button size=\"sm\" onClick={()=>{\n const parts = (colorCustom || '').split(',').map(s=>s.trim()).filter(Boolean);\n if (!parts.length) return;\n setColorList(prev => Array.from(new Set([...prev, ...parts])));\n setColorCustom('');\n }}>Přidat</Button>\n </HStack>\n <FormHelperText>Vyberte více možností nebo přidejte vlastní barvy (oddělené čárkami).</FormHelperText>\n </FormControl>\n <FormControl>\n <FormLabel>Poznámka</FormLabel>\n <Input value={meta.note || ''} onChange={(e)=>setMetaField('note', e.target.value)} />\n </FormControl>\n </VStack>\n )}\n {form.type === 'merch_digital' && (\n <VStack align=\"stretch\" spacing={2}>\n <FormControl><FormLabel>Licenční klíč</FormLabel><Input value={meta.license_key || ''} onChange={(e)=>setMetaField('license_key', e.target.value)} /></FormControl>\n <FormControl><FormLabel>Stažení (URL)</FormLabel><Input value={meta.download_url || ''} onChange={(e)=>setMetaField('download_url', e.target.value)} /></FormControl>\n <FormControl><FormLabel>Poznámka</FormLabel><Input value={meta.note || ''} onChange={(e)=>setMetaField('note', e.target.value)} /></FormControl>\n </VStack>\n )}\n {form.type === 'custom' && (\n <VStack align=\"stretch\" spacing={2}>\n <HStack>\n <Input placeholder=\"klíč\" id=\"kv-key\" />\n <Input placeholder=\"hodnota\" id=\"kv-value\" />\n <Button size=\"sm\" onClick={()=>{\n const k = (document.getElementById('kv-key') as HTMLInputElement)?.value?.trim();\n const v = (document.getElementById('kv-value') as HTMLInputElement)?.value?.trim();\n if (!k) return;\n setMetaField(k, v || '');\n }}>Přidat</Button>\n </HStack>\n </VStack>\n )}\n {/* Odstraněno: ruční JSON metadata. Metadata se vyplňují automaticky z polí výše. */}\n <HStack>\n <Text>Aktivní</Text>\n <Switch isChecked={form.active} onChange={(e) => setForm({ ...form, active: e.target.checked })} />\n <Button colorScheme=\"blue\" onClick={() => createMut.mutate()} isLoading={createMut.isPending} isDisabled={!form.name.trim()}>Vytvořit</Button>\n </HStack>\n </VStack>\n <Box>\n <Text fontSize=\"sm\" mb={2} color=\"gray.500\">Náhled</Text>\n <Box borderWidth=\"1px\" borderRadius=\"md\" p={2}>\n {form.image_url ? (\n <Image src={assetUrl(form.image_url)} alt={form.name} boxSize=\"96px\" objectFit=\"cover\" borderRadius=\"md\" />\n ) : (\n <Box boxSize=\"96px\" borderWidth=\"1px\" borderRadius=\"md\" display=\"flex\" alignItems=\"center\" justifyContent=\"center\" color=\"gray.400\">Bez obrázku</Box>\n )}\n </Box>\n </Box>\n </HStack>\n </VStack>\n </Box>\n\n <Divider />\n\n <Box>\n <Heading size=\"sm\" mb={2}>Odměny</Heading>\n <HStack mb={2}>\n <Text fontSize=\"sm\" color=\"gray.500\">Filtrovat:</Text>\n <Select size=\"sm\" value={rewardFilter} onChange={(e)=>setRewardFilter(e.target.value as any)} maxW=\"200px\">\n <option value=\"all\">Vše</option>\n <option value=\"active\">Pouze aktivní</option>\n <option value=\"inactive\">Pouze neaktivní</option>\n </Select>\n </HStack>\n <Box borderWidth=\"1px\" borderRadius=\"md\" overflowX=\"auto\">\n <Table size=\"sm\">\n <Thead>\n <Tr>\n <Th>ID</Th>\n <Th>Název</Th>\n <Th>Typ</Th>\n <Th>Body</Th>\n <Th>Množství/Sklad</Th>\n <Th>Obrázek</Th>\n <Th>Platnost</Th>\n <Th>Aktivní</Th>\n <Th>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {rewards.map((r: AdminRewardItem) => (\n <Tr key={r.id}>\n <Td>#{r.id}</Td>\n <Td>\n <VStack align=\"start\" spacing={0}>\n <Text>{r.name}</Text>\n {r.type === 'merch_physical' && (r.metadata as any)?.sku ? (\n <HStack spacing={1}>\n <Text fontSize=\"xs\" color=\"gray.500\">SKU: {(r.metadata as any).sku}</Text>\n <IconButton aria-label=\"Kopírovat SKU\" size=\"xs\" variant=\"ghost\" icon={<FiCopy />} onClick={()=> navigator.clipboard?.writeText(String((r.metadata as any).sku || ''))} />\n </HStack>\n ) : null}\n </VStack>\n </Td>\n <Td><Badge>{r.type}</Badge></Td>\n <Td>\n <NumberInput size=\"sm\" value={r.cost_points} min={0} maxW=\"120px\" isDisabled={!!r.type && r.type.startsWith('avatar_')} onChange={(_v, n) => updateMut.mutate({ id: r.id, body: { cost_points: Number.isFinite(n) ? n : 0 } })}>\n <NumberInputField />\n </NumberInput>\n </Td>\n <Td>\n <NumberInput\n size=\"sm\"\n value={r.stock ?? 0}\n min={-1}\n maxW=\"100px\"\n isDisabled={!!r.type && r.type.startsWith('avatar_')}\n onChange={(_v, n) => updateMut.mutate({ id: r.id, body: { stock: Number.isFinite(n) ? n : 0 } })}\n >\n <NumberInputField />\n </NumberInput>\n </Td>\n <Td>{r.image_url ? <Image src={assetUrl(r.image_url)} alt={r.name} boxSize=\"40px\" objectFit=\"cover\" borderRadius=\"md\" /> : '-'}</Td>\n <Td>\n {(() => {\n const m = (r.metadata || {}) as any;\n const vf = m.valid_from ? new Date(m.valid_from) : null;\n const vt = m.valid_to ? new Date(m.valid_to) : null;\n if (!vf && !vt) return <Text color=\"gray.500\">-</Text>;\n return (\n <VStack align=\"start\" spacing={0}>\n {vf && <Text fontSize=\"xs\">od {vf.toLocaleString()}</Text>}\n {vt && <Text fontSize=\"xs\">do {vt.toLocaleString()}</Text>}\n </VStack>\n );\n })()}\n </Td>\n <Td>\n <Switch\n isChecked={!!r.active}\n isDisabled={!!r.type && r.type.startsWith('avatar_')}\n onChange={(e) => updateMut.mutate({ id: r.id, body: { active: e.target.checked } })}\n />\n </Td>\n <Td>\n <HStack>\n <IconButton aria-label=\"Upravit\" size=\"xs\" icon={<FiEdit2 />} onClick={() => { \n setEditItem(r); \n setEditForm(r); \n const m: any = r.metadata || {}; \n const prepared: any = { ...m }; \n try {\n if (typeof m.size === 'string') prepared.__size_list = String(m.size).split(',').map((s:string)=>s.trim()).filter(Boolean);\n } catch {}\n try {\n if (typeof m.color === 'string') prepared.__color_list = String(m.color).split(',').map((s:string)=>s.trim()).filter(Boolean);\n } catch {}\n setEditMeta(prepared); \n editModal.onOpen(); \n }} />\n {!r.type?.startsWith('avatar_') && (\n <IconButton aria-label=\"Smazat\" size=\"xs\" icon={<FiTrash2 />} onClick={() => deleteMut.mutate(r.id)} />\n )}\n </HStack>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n </Box>\n\n <Box>\n <HStack justify=\"space-between\" align=\"center\" mt={6} mb={2}>\n <Heading size=\"sm\">Uplatnění odměn</Heading>\n <HelpTooltipCard\n label=\"Jak pracovat s uplatněním\"\n title=\"Vyřízení požadavků na odměny\"\n items={[\n 'Zde vidíte požadavky uživatelů na vydání odměn každý záznam odpovídá konkrétní odměně a uživateli.',\n 'Akce Schválit/Zamítnout/Vydat pomáhají sledovat stav vyřízení (např. fyzické předání merchu nebo zaslání kuponu).',\n 'Doporučujeme, aby změny stavů prováděli pouze administrátoři kvůli konzistenci bodů a auditovatelnosti.',\n ]}\n />\n </HStack>\n <Box borderWidth=\"1px\" borderRadius=\"md\" overflowX=\"auto\">\n <Table size=\"sm\">\n <Thead>\n <Tr>\n <Th>ID</Th>\n <Th>Uživatel</Th>\n <Th>Odměna</Th>\n <Th>Vytvořeno</Th>\n <Th>Status</Th>\n <Th>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {redemptions.map((d: AdminRedemption) => (\n <Tr key={d.id}>\n <Td>#{d.id}</Td>\n <Td>\n {usersById.get(d.user_id as any)?.name ? (\n <HStack spacing={1}>\n <Text noOfLines={1}>{usersById.get(d.user_id as any)?.name}</Text>\n <Text color=\"gray.500\" fontSize=\"xs\">#{d.user_id}</Text>\n </HStack>\n ) : (\n <Text>#{d.user_id}</Text>\n )}\n </Td>\n <Td>\n <HStack>\n <Text>#{d.reward_id}</Text>\n {rewardById.get(d.reward_id as any)?.name && <Text as=\"span\"> {rewardById.get(d.reward_id as any)?.name}</Text>}\n {rewardById.get(d.reward_id as any)?.type && <Badge>{rewardById.get(d.reward_id as any)?.type}</Badge>}\n </HStack>\n </Td>\n <Td>{d.created_at ? new Date(d.created_at as any).toLocaleString() : '-'}</Td>\n <Td><Badge colorScheme={d.status === 'approved' ? 'blue' : d.status === 'fulfilled' ? 'green' : d.status === 'rejected' ? 'red' : 'gray'}>{d.status}</Badge></Td>\n <Td>\n <HStack>\n <Button size=\"xs\" variant=\"outline\" onClick={() => redStatusMut.mutate({ id: d.id, action: 'approve' })}>Schválit</Button>\n <Button size=\"xs\" variant=\"outline\" colorScheme=\"red\" onClick={() => redStatusMut.mutate({ id: d.id, action: 'reject' })}>Zamítnout</Button>\n <Button size=\"xs\" variant=\"outline\" colorScheme=\"green\" onClick={() => redStatusMut.mutate({ id: d.id, action: 'fulfill' })}>Vydat</Button>\n </HStack>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n </Box>\n\n {/* Transactions & Adjust */}\n <Box>\n <HStack justify=\"space-between\" align=\"center\" mt={6} mb={2}>\n <Heading size=\"sm\">Transakce bodů & Úpravy</Heading>\n <HelpTooltipCard\n label=\"Jak pracovat s body\"\n title=\"Transakce bodů a ruční úpravy\"\n items={[\n 'Transakce ukazují historii pohybů bodů (získané, utracené, ručně upravené) pro jednotlivé uživatele.',\n 'Ruční úpravy bodů používejte výjimečně například k opravě chyb nebo speciálním odměnám mimo běžná pravidla.',\n 'Pro dlouhodobou konzistenci je vhodné mít v týmu jasná pravidla, kdo může body upravovat a za jakých podmínek.',\n ]}\n />\n </HStack>\n <TransactionsAndAdjust />\n </Box>\n </VStack>\n </Box>\n\n {/* Edit reward modal */}\n <Modal isOpen={editModal.isOpen} onClose={editModal.onClose} isCentered>\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Upravit odměnu #{editItem?.id}</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack align=\"stretch\" spacing={3}>\n <FormControl>\n <FormLabel>Název</FormLabel>\n <Input value={editForm.name || ''} onChange={(e)=>setEditForm({ ...editForm, name: e.target.value })} isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')} />\n </FormControl>\n <FormControl>\n <FormLabel>Typ</FormLabel>\n <Select value={editForm.type || ''} onChange={(e)=>setEditForm({ ...editForm, type: e.target.value })} isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')}>\n <option value=\"merch_digital\">Digitální odměna</option>\n <option value=\"merch_coupon\">Merch kupon</option>\n <option value=\"merch_physical\">Merch (fyzický)</option>\n <option value=\"custom\">Vlastní</option>\n </Select>\n </FormControl>\n <HStack>\n <FormControl>\n <FormLabel>Body</FormLabel>\n <NumberInput value={Number(editForm.cost_points || 0)} min={0} onChange={(_v, n)=>setEditForm({ ...editForm, cost_points: Number.isFinite(n)? n : 0 })} isDisabled={!editItem || (!!editItem.type && !editItem.type.startsWith('avatar_') && false)}>\n <NumberInputField />\n </NumberInput>\n <FormHelperText>~ {Math.round(Number(editForm.cost_points || 0) * 0.1)} Kč</FormHelperText>\n </FormControl>\n <FormControl>\n <FormLabel>Množství/Sklad</FormLabel>\n <HStack>\n <NumberInput value={Number(editForm.stock || 0)} min={-1} isDisabled={(!!editItem?.type && editItem.type.startsWith('avatar_')) || Number(editForm.stock) === -1} onChange={(_v, n)=>setEditForm({ ...editForm, stock: Number.isFinite(n)? n : 0 })}>\n <NumberInputField />\n </NumberInput>\n <HStack>\n <Text fontSize=\"sm\">Neomezeně</Text>\n <Switch isChecked={Number(editForm.stock) === -1} onChange={(e)=> setEditForm(prev => ({ ...prev, stock: e.target.checked ? -1 : Math.max(0, Number(prev.stock) === -1 ? 0 : Number(prev.stock)||0) }))} isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')} />\n </HStack>\n </HStack>\n <FormHelperText>-1 = neomezeně, 0 = vyprodáno.</FormHelperText>\n </FormControl>\n </HStack>\n <FormControl>\n <FormLabel>Obrázek URL</FormLabel>\n <Input\n value={editForm.image_url || ''}\n onChange={(e)=>setEditForm({ ...editForm, image_url: e.target.value })}\n isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')}\n />\n <FormHelperText>Vložte URL z /uploads nebo nahrávací tlačítko (proxy na frontend funguje).</FormHelperText>\n {(!editItem?.type || !editItem.type.startsWith('avatar_')) && (\n <Box mt={2}>\n <UploadPanel\n label=\"Nahrát obrázek\"\n description=\"Nahrajte obrázek odměny.\"\n accept=\"image/*\"\n multiple={false}\n maxFiles={1}\n onUploadFinished={(uploaded) => {\n const last = uploaded[uploaded.length - 1];\n if (!last) return;\n setEditForm((prev) => ({ ...prev, image_url: last.url }));\n }}\n />\n </Box>\n )}\n </FormControl>\n {/* Edit metadata helpers (structured) */}\n { (editForm.type === 'merch_coupon' || editForm.type === 'merch_physical' || editForm.type === 'merch_digital' || editForm.type === 'custom') && (\n <VStack align=\"stretch\" spacing={2}>\n {editForm.type === 'merch_coupon' && (\n <>\n <FormControl><FormLabel>Kód kuponu</FormLabel><Input isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')} value={(editMeta as any).coupon_code || ''} onChange={(e)=>setEditMetaField('coupon_code', e.target.value)} /></FormControl>\n <FormControl><FormLabel>Poznámka</FormLabel><Input isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')} value={(editMeta as any).note || ''} onChange={(e)=>setEditMetaField('note', e.target.value)} /></FormControl>\n </>\n )}\n {editForm.type === 'merch_physical' && (\n <>\n {(editMeta as any)?.sku ? (\n <HStack spacing={2}>\n <Text fontSize=\"sm\" color=\"gray.500\">Kód (SKU): {(editMeta as any).sku}</Text>\n <IconButton aria-label=\"Kopírovat SKU\" size=\"xs\" variant=\"ghost\" icon={<FiCopy />} onClick={()=> navigator.clipboard?.writeText(String((editMeta as any).sku || ''))} />\n </HStack>\n ) : null}\n <FormControl>\n <FormLabel>Velikosti</FormLabel>\n <CheckboxGroup value={(editMeta as any).__size_list || []} onChange={(vals)=>{\n const arr = vals as string[];\n setEditMeta(prev => ({ ...(prev as any), __size_list: arr } as any));\n }}>\n <Wrap spacing={3}>\n {SIZE_OPTIONS.map((s)=> (\n <WrapItem key={s}><Checkbox value={s} isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')}>{s}</Checkbox></WrapItem>\n ))}\n </Wrap>\n </CheckboxGroup>\n <HStack mt={1} spacing={2}>\n <Input placeholder=\"Vlastní velikosti, oddělte čárkami\" isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')} value={(editMeta as any).__size_custom || ''} onChange={(e)=>setEditMetaField('__size_custom', e.target.value)} />\n <Button size=\"sm\" isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')} onClick={()=>{\n const parts = String((editMeta as any).__size_custom || '').split(',').map((s:string)=>s.trim()).filter(Boolean);\n const cur = Array.isArray((editMeta as any).__size_list) ? (editMeta as any).__size_list as string[] : [];\n const merged = Array.from(new Set([...(cur as string[]), ...parts]));\n setEditMeta(prev => ({ ...(prev as any), __size_list: merged, __size_custom: '' } as any));\n }}>Přidat</Button>\n </HStack>\n <FormHelperText>Vyberte z nabídky nebo přidejte vlastní hodnoty (oddělené čárkami).</FormHelperText>\n </FormControl>\n <FormControl>\n <FormLabel>Barvy</FormLabel>\n <CheckboxGroup value={(editMeta as any).__color_list || []} onChange={(vals)=>{\n const arr = vals as string[];\n setEditMeta(prev => ({ ...(prev as any), __color_list: arr } as any));\n }}>\n <Wrap spacing={3}>\n {COLOR_OPTIONS.map((c)=> (\n <WrapItem key={c}><Checkbox value={c} isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')}>{c}</Checkbox></WrapItem>\n ))}\n </Wrap>\n </CheckboxGroup>\n <HStack mt={1} spacing={2}>\n <Input placeholder=\"Vlastní barvy, oddělte čárkami\" isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')} value={(editMeta as any).__color_custom || ''} onChange={(e)=>setEditMetaField('__color_custom', e.target.value)} />\n <Button size=\"sm\" isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')} onClick={()=>{\n const parts = String((editMeta as any).__color_custom || '').split(',').map((s:string)=>s.trim()).filter(Boolean);\n const cur = Array.isArray((editMeta as any).__color_list) ? (editMeta as any).__color_list as string[] : [];\n const merged = Array.from(new Set([...(cur as string[]), ...parts]));\n setEditMeta(prev => ({ ...(prev as any), __color_list: merged, __color_custom: '' } as any));\n }}>Přidat</Button>\n </HStack>\n <FormHelperText>Vyberte více možností nebo přidejte vlastní barvy (oddělené čárkami).</FormHelperText>\n </FormControl>\n <FormControl><FormLabel>Poznámka</FormLabel><Input isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')} value={(editMeta as any).note || ''} onChange={(e)=>setEditMetaField('note', e.target.value)} /></FormControl>\n </>\n )}\n {editForm.type === 'merch_digital' && (\n <>\n <FormControl><FormLabel>Licenční klíč</FormLabel><Input isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')} value={(editMeta as any).license_key || ''} onChange={(e)=>setEditMetaField('license_key', e.target.value)} /></FormControl>\n <FormControl><FormLabel>Stažení (URL)</FormLabel><Input isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')} value={(editMeta as any).download_url || ''} onChange={(e)=>setEditMetaField('download_url', e.target.value)} /></FormControl>\n <FormControl><FormLabel>Poznámka</FormLabel><Input isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')} value={(editMeta as any).note || ''} onChange={(e)=>setEditMetaField('note', e.target.value)} /></FormControl>\n </>\n )}\n {editForm.type === 'custom' && (\n <HStack>\n <Input placeholder=\"klíč\" id=\"edit-kv-key\" isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')} />\n <Input placeholder=\"hodnota\" id=\"edit-kv-value\" isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')} />\n <Button size=\"sm\" isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')} onClick={()=>{\n const k = (document.getElementById('edit-kv-key') as HTMLInputElement)?.value?.trim();\n const v = (document.getElementById('edit-kv-value') as HTMLInputElement)?.value?.trim();\n if (!k) return;\n setEditMetaField(k, v || '');\n }}>Přidat</Button>\n </HStack>\n )}\n </VStack>\n )}\n <VStack align=\"stretch\" spacing={2}>\n <HStack>\n <Text>Neomezená platnost</Text>\n <Switch isChecked={!(editMeta as any).valid_from && !(editMeta as any).valid_to} onChange={(e)=>{\n const on = e.target.checked;\n if (on) { setEditMeta(prev => ({ ...(prev as any), valid_from: '', valid_to: '' } as any)); }\n }} isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')} />\n </HStack>\n <FormControl isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_') || (!(editMeta as any).valid_from && !(editMeta as any).valid_to)}>\n <FormLabel>Platnost od</FormLabel>\n <Input type=\"datetime-local\" value={(editMeta as any).valid_from || ''} onChange={(e)=>setEditMetaField('valid_from', e.target.value)} />\n </FormControl>\n <FormControl isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_') || (!(editMeta as any).valid_from && !(editMeta as any).valid_to)}>\n <FormLabel>Platnost do</FormLabel>\n <Input type=\"datetime-local\" value={(editMeta as any).valid_to || ''} onChange={(e)=>setEditMetaField('valid_to', e.target.value)} />\n <FormHelperText>Když je zapnuto „Neomezená platnost“, datumy se nevyžadují a ignorují.</FormHelperText>\n </FormControl>\n </VStack>\n {/* Odstraněno: ruční JSON metadata v editoru. */}\n <HStack>\n <Text>Aktivní</Text>\n <Switch isChecked={!!editForm.active} onChange={(e)=>setEditForm({ ...editForm, active: e.target.checked })} isDisabled={!!editItem?.type && editItem.type.startsWith('avatar_')} />\n {editForm.image_url ? <Image src={assetUrl(String(editForm.image_url))} alt={String(editForm.name || '')} boxSize=\"56px\" objectFit=\"cover\" borderRadius=\"md\" /> : null}\n </HStack>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <HStack>\n <Button onClick={editModal.onClose}>Zrušit</Button>\n <Button colorScheme=\"blue\" isLoading={updateMut.isPending} onClick={async ()=>{\n if (!editItem) return;\n if (editItem.type && editItem.type.startsWith('avatar_')) {\n await updateMut.mutateAsync({ id: editItem.id, body: { cost_points: editForm.cost_points as any } });\n } else {\n const metadata: Record<string, any> = { ...(Object.keys(editMeta || {}).length ? (editMeta as any) : {}) } as any;\n // Merge structured lists to CSV in metadata\n const sz = Array.isArray((metadata as any).__size_list) ? (metadata as any).__size_list as string[] : [];\n const cz = Array.isArray((metadata as any).__color_list) ? (metadata as any).__color_list as string[] : [];\n if (sz.length) (metadata as any).size = sz.join(',');\n if (cz.length) (metadata as any).color = cz.join(',');\n delete (metadata as any).__size_list; delete (metadata as any).__size_custom;\n delete (metadata as any).__color_list; delete (metadata as any).__color_custom;\n // If unlimited validity, clear dates\n const unlimited = !(metadata as any).valid_from && !(metadata as any).valid_to;\n if (unlimited) { delete (metadata as any).valid_from; delete (metadata as any).valid_to; }\n await updateMut.mutateAsync({ id: editItem.id, body: {\n name: editForm.name,\n type: editForm.type,\n cost_points: editForm.cost_points as any,\n stock: editForm.stock as any,\n image_url: editForm.image_url,\n active: editForm.active as any,\n metadata: Object.keys(metadata).length ? metadata as any : undefined,\n } as any });\n }\n editModal.onClose();\n }}>Uložit</Button>\n </HStack>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n \n </AdminLayout>\n );\n};\n\n// Inline component: Transactions viewer and Adjust points panel\nconst TransactionsAndAdjust: React.FC = () => {\n const [userId, setUserId] = React.useState<string>('');\n const [reason, setReason] = React.useState<string>('');\n const [limit, setLimit] = React.useState<number>(100);\n const qc = useQueryClient();\n const toast = useToast();\n // Users for dropdowns\n const usersQ = useQuery({ queryKey: ['admin-users'], queryFn: adminListUsers, staleTime: 30000 });\n const txQ = useQuery({\n queryKey: ['admin-engagement-tx', { userId, reason, limit }],\n queryFn: async () => {\n const params: any = {};\n if (userId.trim()) params.user_id = userId.trim();\n if (reason.trim()) params.reason = reason.trim();\n if (limit) params.limit = limit;\n return adminListTransactions(params);\n }\n });\n const [adjUserId, setAdjUserId] = React.useState<string>('');\n const [adjDelta, setAdjDelta] = React.useState<string>('');\n const [adjReason, setAdjReason] = React.useState<string>('admin_adjust');\n const passwordModal = useDisclosure();\n const [currentPassword, setCurrentPassword] = React.useState<string>('');\n const adjustMut = useMutation({\n mutationFn: async () => {\n const uid = Number(adjUserId);\n const delta = Number(adjDelta);\n if (!uid || !delta) throw new Error('Zadejte platné user_id a delta');\n return adminAdjustPoints({ user_id: uid, delta, reason: adjReason.trim() || 'admin_adjust', current_password: currentPassword });\n },\n onSuccess: async () => {\n setAdjDelta(''); setCurrentPassword(''); passwordModal.onClose();\n await qc.invalidateQueries({ queryKey: ['admin-engagement-tx'] });\n toast({ status: 'success', title: 'Upraveno' });\n },\n onError: (e: any) => toast({ status: 'error', title: e?.message || 'Chyba při úpravě bodů' })\n });\n\n return (\n <VStack align=\"stretch\" spacing={3}>\n <HStack flexWrap=\"wrap\" rowGap={2}>\n <Select placeholder=\"Všichni uživatelé\" value={userId} onChange={(e)=>setUserId(e.target.value)} maxW=\"260px\">\n {(usersQ.data || []).map(u => (\n <option key={u.id} value={String(u.id)}>{u.name || u.email} (#{u.id})</option>\n ))}\n </Select>\n <Select placeholder=\"Důvod\" value={reason} onChange={(e)=>setReason(e.target.value)} maxW=\"220px\">\n <option value=\"daily_checkin\">daily_checkin</option>\n <option value=\"article_read\">article_read</option>\n <option value=\"redeem\">redeem</option>\n <option value=\"redeem_refund\">redeem_refund</option>\n <option value=\"admin_adjust\">admin_adjust</option>\n </Select>\n <NumberInput value={limit} min={10} max={1000} onChange={(_v,n)=>setLimit(Number.isFinite(n)? n : 100)} maxW=\"160px\">\n <NumberInputField />\n </NumberInput>\n <Button size=\"sm\" variant=\"outline\" onClick={()=>qc.invalidateQueries({ queryKey: ['admin-engagement-tx'] })}>Obnovit</Button>\n </HStack>\n <Box borderWidth=\"1px\" borderRadius=\"md\" overflowX=\"auto\">\n <Table size=\"sm\">\n <Thead>\n <Tr>\n <Th>ID</Th>\n <Th>Uživatel</Th>\n <Th>Delta</Th>\n <Th>Důvod</Th>\n <Th>Meta</Th>\n <Th>Čas</Th>\n </Tr>\n </Thead>\n <Tbody>\n {(txQ.data || []).map((t: any) => (\n <Tr key={t.id}>\n <Td>#{t.id}</Td>\n <Td>\n { (usersQ.data || []).find((u:any)=>u.id===t.user_id)?.name ? (\n <HStack spacing={1}>\n <Text noOfLines={1}>{(usersQ.data || []).find((u:any)=>u.id===t.user_id)?.name}</Text>\n <Text color=\"gray.500\" fontSize=\"xs\">#{t.user_id}</Text>\n </HStack>\n ) : (\n <Text>#{t.user_id}</Text>\n )}\n </Td>\n <Td>{t.delta}</Td>\n <Td><Badge>{t.reason}</Badge></Td>\n <Td><Text fontSize=\"xs\" noOfLines={1}>{t.meta ? JSON.stringify(t.meta) : '-'}</Text></Td>\n <Td>{t.created_at ? new Date(t.created_at).toLocaleString() : '-'}</Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n <Heading size=\"xs\" mt={4}>Manuální úprava bodů</Heading>\n <VStack align=\"stretch\" spacing={2}>\n <HStack flexWrap=\"wrap\" rowGap={2}>\n <Select placeholder=\"Vyberte uživatele\" value={adjUserId} onChange={(e)=>setAdjUserId(e.target.value)} maxW=\"260px\">\n {(usersQ.data || []).map(u => (\n <option key={u.id} value={String(u.id)}>{u.name || u.email} (#{u.id})</option>\n ))}\n </Select>\n <Input placeholder=\"Delta (+/-)\" value={adjDelta} onChange={(e)=>setAdjDelta(e.target.value)} maxW=\"160px\" />\n <Select value={adjReason} onChange={(e)=>setAdjReason(e.target.value)} maxW=\"240px\">\n <option value=\"admin_adjust\">admin_adjust</option>\n <option value=\"bonus\">bonus</option>\n <option value=\"penalty\">penalty</option>\n </Select>\n </HStack>\n <Button colorScheme=\"blue\" size=\"sm\" onClick={()=>passwordModal.onOpen()} isLoading={adjustMut.isPending} isDisabled={!adjUserId || !adjDelta}>Upravit body</Button>\n {/* Password confirmation modal */}\n <Modal isOpen={passwordModal.isOpen} onClose={passwordModal.onClose} isCentered>\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Potvrzení úpravy bodů</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack align=\"stretch\" spacing={3}>\n <Text>Potvrďte akci zadáním vašeho administračního hesla.</Text>\n <FormControl>\n <FormLabel display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n <Box>Heslo administrátora</Box>\n <PasswordHelpTooltip />\n </FormLabel>\n <Input type=\"password\" value={currentPassword} onChange={(e)=>setCurrentPassword(e.target.value)} />\n </FormControl>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <HStack>\n <Button onClick={passwordModal.onClose}>Zrušit</Button>\n <Button colorScheme=\"blue\" onClick={()=>adjustMut.mutate()} isLoading={adjustMut.isPending} isDisabled={!currentPassword.trim()}>Potvrdit</Button>\n </HStack>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </VStack>\n </VStack>\n );\n};\n\nexport default EngagementAdminPage;\n","import { Box, Button, Heading, Text, VStack, HStack, Icon, Divider } from '@chakra-ui/react';\nimport { Link as RouterLink, useLocation, useNavigate } from 'react-router-dom';\nimport { GiWhistle, GiSoccerBall } from 'react-icons/gi';\nimport MainLayout from '../components/layout/MainLayout';\n\nconst ForbiddenPage: React.FC = () => {\n const location = useLocation();\n const navigate = useNavigate();\n return (\n <MainLayout>\n <Box\n minH=\"60vh\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n bgGradient=\"linear(to-b, rgba(0,0,0,0.02), transparent)\"\n px={6}\n >\n <Box\n w={{ base: '100%', sm: '560px' }}\n textAlign=\"center\"\n bg=\"white\"\n _dark={{ bg: 'gray.800' }}\n borderRadius=\"xl\"\n borderWidth=\"1px\"\n borderColor=\"border.subtle\"\n boxShadow=\"md\"\n p={{ base: 6, md: 10 }}\n >\n <VStack spacing={4}>\n <HStack spacing={3} color=\"brand.primary\">\n <Icon as={GiWhistle} boxSize={8} />\n <Heading as=\"h1\" size=\"2xl\" letterSpacing=\"wide\">\n 403\n </Heading>\n <Icon as={GiSoccerBall} boxSize={8} />\n </HStack>\n <Heading\n as=\"h2\"\n size=\"lg\"\n bgGradient=\"linear(to-r, brand.primary, brand.accent)\"\n bgClip=\"text\"\n >\n Přístup odepřen\n </Heading>\n <Text color=\"gray.600\" _dark={{ color: 'gray.300' }}>\n Rozhodčí píská: tato část hřiště je jen pro kapitány (adminy).\n </Text>\n <Divider />\n <HStack spacing={3} pt={2}>\n <Button onClick={() => navigate(-1)} colorScheme=\"blue\">\n Zpět\n </Button>\n <Button as={RouterLink} to=\"/\" variant=\"outline\">\n Zpět na úvod\n </Button>\n </HStack>\n </VStack>\n </Box>\n </Box>\n </MainLayout>\n );\n};\n\nexport default ForbiddenPage;\n","import { API_URL } from './api';\n\nexport type PublicMatch = Record<string, any>;\nexport type MatchOverrideMap = Record<string, PublicMatch>;\n\nconst resolveBackendUrl = (path: string): string => {\n try {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (path.startsWith('/cache') || path.startsWith('/uploads') || path.startsWith('/api/')) {\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n return new URL(path, origin).toString();\n }\n return path;\n } catch {\n return path;\n }\n};\n\nconst fetchJSON = async <T>(path: string): Promise<T | null> => {\n try {\n const url = resolveBackendUrl(path);\n const res = await fetch(url, { cache: 'no-cache' });\n if (!res.ok) return null;\n return (await res.json()) as T;\n } catch {\n return null;\n }\n};\n\nexport const loadMatchOverrideMap = async (): Promise<MatchOverrideMap> => {\n const [upcoming, past] = await Promise.all([\n fetchJSON<PublicMatch[]>('/api/v1/matches'),\n fetchJSON<PublicMatch[]>('/api/v1/matches/history'),\n ]);\n const map: MatchOverrideMap = {};\n const add = (arr: PublicMatch[] | null) => {\n if (!Array.isArray(arr)) return;\n for (const it of arr) {\n const id = String((it as any)?.match_id || (it as any)?.id || '').trim();\n if (!id) continue;\n if (!map[id]) {\n map[id] = it;\n } else {\n map[id] = { ...map[id], ...it };\n }\n }\n };\n add(upcoming);\n add(past);\n return map;\n};\n","import React, { useEffect, useState, useMemo } from 'react';\nimport { Tabs, TabList, TabPanels, Tab, TabPanel, useColorModeValue, Modal, ModalOverlay, ModalContent, ModalHeader, ModalCloseButton, ModalBody, ModalFooter, Button, HStack, VStack, Text, Badge, Link, Divider, Box, Grid, Flex, Image, Heading, Input, useToast } from '@chakra-ui/react';\nimport MainLayout from '../components/layout/MainLayout';\nimport { getPublicSettings } from '../services/settings';\nimport { getCompetitionAliasesPublic, CompetitionAlias } from '../services/competitionAliases';\nimport { sortCategoriesWithOrder } from '../utils/categorySort';\nimport { assetUrl, sanitizeClubName } from '../utils/url';\nimport MatchModal from '../components/home/MatchModal';\nimport { useCountdown, useMultipleCountdowns } from '../hooks/useCountdown';\nimport '../styles/theme.css';\nimport { API_URL } from '../services/api';\nimport { loadMatchOverrideMap, MatchOverrideMap } from '../services/matchOverrides';\nimport { useTranslation } from 'react-i18next';\nimport { MatchWeather } from '../components/common/MatchWeather';\nimport { format, parse } from 'date-fns';\nimport { cs } from 'date-fns/locale';\n\ntype MatchItem = {\n id: number | string;\n date: string;\n time: string;\n home: string;\n away: string;\n home_id?: string;\n away_id?: string;\n home_logo_url?: string;\n away_logo_url?: string;\n score?: string | null;\n facr_link?: string | null;\n report_url?: string | null;\n venue?: string;\n competition?: string;\n competitionName?: string;\n}\n\nconst MatchesPage: React.FC = () => {\n const { t } = useTranslation();\n const [clubName, setClubName] = useState<string>('');\n const [clubId, setClubId] = useState<string>('');\n const [clubType, setClubType] = useState<'football' | 'futsal'>('football');\n const [facrCompetitions, setFacrCompetitions] = useState<Array<{ name: string; matches: Array<any>; matches_link?: string }>>([]);\n const [activeTab, setActiveTab] = useState<number>(0);\n const [isMatchModalOpen, setIsMatchModalOpen] = useState<boolean>(false);\n const [selectedMatch, setSelectedMatch] = useState<any | null>(null);\n const [aliases, setAliases] = useState<CompetitionAlias[]>([]);\n const [aliasMap, setAliasMap] = useState<Record<string, { alias: string; original_name?: string; display_order?: number }>>({});\n const [sortAscending, setSortAscending] = useState<boolean>(true); // true = oldest first, false = newest first\n const [displayedMatchesCount, setDisplayedMatchesCount] = useState<Record<number, number>>({}); // Track displayed matches per competition index\n const MATCHES_PER_PAGE = 12; // Number of matches to load initially and per load more click\n \n // Newsletter state\n const toast = useToast();\n const [fanEmail, setFanEmail] = useState<string>(\"\");\n const [fanSubscribing, setFanSubscribing] = useState<boolean>(false);\n \n // Dark mode colors\n const bgColor = useColorModeValue('#f8f9fb', '#0f1115');\n const cardBg = useColorModeValue('#fff', '#1a1d29');\n const borderColor = useColorModeValue('#e5e7eb', '#2a2e3a');\n const textPrimary = useColorModeValue('#1a1a1a', '#e8eaf0');\n const textSecondary = useColorModeValue('#666', '#9ca3af');\n const headingColor = useColorModeValue('#000', '#fff');\n\n const openMatch = (m: any) => {\n try {\n setSelectedMatch(m);\n setIsMatchModalOpen(true);\n } catch {\n // noop\n }\n };\n\n const handleTeamClick = (teamName: string, logoUrl: string) => {\n // Optional: could open club modal when clicking team in match modal\n console.log('Team clicked:', teamName, logoUrl);\n };\n\n // Newsletter subscription function\n const subscribeFan = async () => {\n if (!fanEmail) {\n toast({ title: 'Zadejte email', status: 'warning' });\n return;\n }\n setFanSubscribing(true);\n try {\n const res = await fetch(`${API_URL}/api/v1/newsletter/subscribe`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email: fanEmail })\n });\n if (!res.ok) {\n const jt = await res.json().catch(() => ({} as any));\n throw new Error(jt?.error || `HTTP ${res.status}`);\n }\n toast({ title: 'Přihlášeno k odběru', status: 'success' });\n setFanEmail('');\n } catch (e: any) {\n toast({ title: 'Chyba přihlášení', description: e?.message || String(e), status: 'error' });\n } finally {\n setFanSubscribing(false);\n }\n };\n\n // Helper function to parse countdown string to milliseconds\n const parseCountdownToMs = (countdown: string): number => {\n try {\n // Parse formats like \"2d 3h 15m 30s\" or \"3h 15m\" etc.\n let totalMs = 0;\n const parts = countdown.toLowerCase().split(/\\s+/);\n \n for (let i = 0; i < parts.length; i += 2) {\n const value = parseInt(parts[i], 10);\n const unit = parts[i + 1];\n \n if (!isNaN(value) && unit) {\n switch (unit) {\n case 'd':\n totalMs += value * 24 * 60 * 60 * 1000;\n break;\n case 'h':\n totalMs += value * 60 * 60 * 1000;\n break;\n case 'm':\n totalMs += value * 60 * 1000;\n break;\n case 's':\n totalMs += value * 1000;\n break;\n }\n }\n }\n \n return totalMs;\n } catch {\n return 0;\n }\n };\n\n // Helper function to sanitize and truncate long club names\n const truncateClubName = (name: string, maxLength: number = 35) => {\n if (!name) return name;\n // First sanitize the club name\n const sanitized = sanitizeClubName(name);\n if (sanitized.length <= maxLength) return sanitized;\n return sanitized.substring(0, maxLength).trim() + '…';\n };\n\n // Format date to Czech format\n const formatCzechDate = (dateStr: string, timeStr: string) => {\n try {\n const date = new Date(`${dateStr}T${timeStr}:00`);\n return date.toLocaleDateString('cs-CZ', {\n day: 'numeric',\n month: 'numeric',\n year: 'numeric'\n });\n } catch {\n return dateStr;\n }\n };\n\n // Sentiment helpers for win/draw/loss detection\n const normalize = (s: string) => String(s || '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\n\n const stripPrefixes = (s: string) => {\n let x = normalize(s);\n x = x.replace(/\\b(mestsky|m\\.?f\\.?k\\.?|mfk|tj|sk|sokol|fotbalovy|fotbalový|fotbalovy\\s+klub|fotbalovy\\s+klub)\\b/g, '');\n return x.replace(/\\s+/g, ' ').trim();\n };\n\n const isClubTeam = (team: string) => {\n try {\n const a = stripPrefixes(team);\n const b = stripPrefixes(clubName || '');\n if (!a || !b) return false;\n // Allow equality or suffix match (handles prefixes like TJ, SK, etc.)\n // Also handle common abbreviations like \"FK\" vs \"Fotbalový klub\"\n const aClean = a.replace(/\\bfk\\b/g, '').replace(/\\bfotbalový\\s+klub\\b/g, '').trim();\n const bClean = b.replace(/\\bfk\\b/g, '').replace(/\\bfotbalový\\s+klub\\b/g, '').trim();\n return a === b || a.endsWith(b) || b.endsWith(a) || aClean === bClean || aClean.endsWith(bClean) || bClean.endsWith(aClean);\n } catch { \n return false; \n }\n };\n\n const parseScore = (score?: string | null): { h: number; a: number } | null => {\n if (!score) return null;\n const m = score.match(/^(\\d+)\\s*[:\\-]\\s*(\\d+)$/);\n if (!m) return null;\n return { h: parseInt(m[1], 10), a: parseInt(m[2], 10) };\n };\n\n const getSentiment = (m: MatchItem): { label: string; colorScheme: 'green'|'blue'|'red' } | null => {\n const s = parseScore(m.score);\n if (!s) return null;\n \n // First try ID-based matching (most reliable)\n let ourIsHome = false;\n let ourIsAway = false;\n if (clubId) {\n // Check each team ID individually - even if one is missing, we can still match the other\n if (m.home_id) {\n ourIsHome = m.home_id === clubId;\n }\n if (m.away_id) {\n ourIsAway = m.away_id === clubId;\n }\n }\n \n // Fallback to name matching if IDs not available or no match\n if (!ourIsHome && !ourIsAway) {\n ourIsHome = isClubTeam(m.home);\n ourIsAway = isClubTeam(m.away);\n }\n \n if (!ourIsHome && !ourIsAway) return null;\n if (s.h === s.a) return { label: t('matches.draw'), colorScheme: 'blue' };\n const ourGoals = ourIsHome ? s.h : s.a;\n const oppGoals = ourIsHome ? s.a : s.h;\n if (ourGoals > oppGoals) return { label: t('matches.win'), colorScheme: 'green' };\n return { label: t('matches.loss'), colorScheme: 'red' };\n };\n\n // Get current date for accurate comparisons\n const now = useMemo(() => Date.now(), []);\n\n // Get sorted matches based on sort order\n const sortedCompetitions = useMemo(() => {\n const sorted = facrCompetitions.map(comp => ({\n ...comp,\n matches: [...comp.matches].sort((a: any, b: any) => {\n const aTime = new Date(`${a.date}T${(a.time || '00:00')}:00`).getTime();\n const bTime = new Date(`${b.date}T${(b.time || '00:00')}:00`).getTime();\n return sortAscending ? aTime - bTime : bTime - aTime;\n })\n }));\n \n // Add \"Všechny kategorie\" as first tab with all matches combined\n if (sorted.length > 0) {\n const allMatches = sorted.flatMap(comp => \n comp.matches.map(m => ({ ...m, competitionName: comp.name }))\n );\n allMatches.sort((a: any, b: any) => {\n const aTime = new Date(`${a.date}T${(a.time || '00:00')}:00`).getTime();\n const bTime = new Date(`${b.date}T${(b.time || '00:00')}:00`).getTime();\n return sortAscending ? aTime - bTime : bTime - aTime;\n });\n \n return [\n {\n name: t('matches.all_categories'),\n matches: allMatches,\n matches_link: undefined\n },\n ...sorted\n ];\n }\n \n return sorted;\n }, [facrCompetitions, sortAscending]);\n\n // Initialize displayed matches count when competitions change\n useEffect(() => {\n const initialCounts: Record<number, number> = {};\n sortedCompetitions.forEach((_, index) => {\n if (displayedMatchesCount[index] === undefined) {\n initialCounts[index] = MATCHES_PER_PAGE;\n }\n });\n if (Object.keys(initialCounts).length > 0) {\n setDisplayedMatchesCount(prev => ({ ...prev, ...initialCounts }));\n }\n }, [sortedCompetitions.length]);\n\n // Handle load more for a specific competition\n const handleLoadMore = (competitionIndex: number) => {\n setDisplayedMatchesCount(prev => ({\n ...prev,\n [competitionIndex]: (prev[competitionIndex] || MATCHES_PER_PAGE) + MATCHES_PER_PAGE\n }));\n };\n\n // Get all upcoming matches for countdown tracking\n const upcomingMatches = useMemo(() => {\n if (activeTab >= sortedCompetitions.length) return [];\n const comp = sortedCompetitions[activeTab];\n const currentTime = Date.now();\n return (comp?.matches || []).filter((m: any) => {\n const matchTime = new Date(`${m.date}T${(m.time || '00:00')}:00`).getTime();\n return matchTime > currentTime;\n });\n }, [sortedCompetitions, activeTab]);\n\n // Track countdowns for all upcoming matches in current tab\n const liveCountdowns = useMultipleCountdowns(upcomingMatches, 30000);\n\n useEffect(() => {\n let cancelled = false;\n\n const resolveBackendUrl = (path: string) => {\n try {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (path.startsWith('/cache') || path.startsWith('/uploads') || path.startsWith('/api/')) {\n const b = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : undefined);\n const abs = new URL(path, `${b.protocol}//${b.host}`);\n return abs.toString();\n }\n return path;\n } catch {\n return path;\n }\n };\n\n const fetchJSON = async (url: string) => {\n try {\n const res = await fetch(resolveBackendUrl(url), { cache: 'no-cache' });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return await res.json();\n } catch {\n return null;\n }\n };\n\n (async () => {\n const [\n cachedSettingsJSON,\n facrClubJSON,\n teamLogoOverridesAPI,\n teamLogoOverridesFile,\n matchOverrideMapRaw,\n ] = await Promise.all([\n fetchJSON('/cache/prefetch/settings.json'),\n fetchJSON('/cache/prefetch/facr_club_info.json'),\n fetchJSON(`/api/v1/public/team-logo-overrides?t=${Date.now()}`),\n fetchJSON('/cache/prefetch/team_logo_overrides.json'),\n loadMatchOverrideMap().catch(() => ({} as MatchOverrideMap)),\n ]);\n\n // Load aliases\n let aliasesList: CompetitionAlias[] = [];\n try {\n aliasesList = await getCompetitionAliasesPublic();\n } catch {}\n const amap: Record<string, { alias: string; original_name?: string; display_order?: number }> = {};\n (aliasesList || []).forEach((a) => { if (a?.code && a?.alias) amap[a.code] = { alias: a.alias, original_name: a.original_name, display_order: a.display_order }; });\n\n let liveSettings: any = null;\n try {\n liveSettings = await getPublicSettings();\n } catch {}\n\n if (!cancelled) {\n setAliases(aliasesList || []);\n setAliasMap(amap);\n\n const matchOverrideMap: MatchOverrideMap = (matchOverrideMapRaw || {}) as MatchOverrideMap;\n\n // Build override helpers\n const teamLogoOverridesJSON = (teamLogoOverridesAPI && (teamLogoOverridesAPI.by_name || teamLogoOverridesAPI.by_id)) ? teamLogoOverridesAPI : (teamLogoOverridesFile || {});\n const byName: Record<string, string> = (teamLogoOverridesJSON?.by_name || {}) as any;\n const byId: Record<string, { name?: string; logo_url?: string }> = (teamLogoOverridesJSON?.by_id || {}) as any;\n const normalize = (s: string) => String(s)\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\n const stripPrefixes = (s: string) => {\n let x = normalize(s);\n x = x.replace(/\\b(mestsky|m\\.?f\\.?k\\.?|mfk|tj|sk|sokol|fotbalovy|fotbalový|fotbalovy\\s+klub|fotbalovy\\s+klub)\\b/g, '').replace(/\\s+/g, ' ').trim();\n return x;\n };\n const byNameNormalized: Record<string, string> = Object.keys(byName || {}).reduce((acc: Record<string, string>, k: string) => {\n acc[normalize(k)] = byName[k];\n return acc;\n }, {});\n const byNameStrippedPairs: Array<{ keyNorm: string; url: string }> = Object.keys(byName || {}).map((k: string) => ({ keyNorm: stripPrefixes(k), url: byName[k] }));\n const normName = (s?: string) => String(s || '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[\\u2012\\u2013\\u2014\\u2015\\u2212]/g, '-')\n .replace(/\\bn\\.?\\b/g, ' nad ')\n .replace(/\\bp\\.?\\b/g, ' pod ')\n .replace(/[\\,\\s]*(z\\.?\\s*s\\.?|o\\.?\\s*s\\.?)\\s*$/g, '')\n .replace(/[\\.,!;:()\\[\\]{}]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\n const aliasNameIndex: Record<string, string> = (() => {\n const urlToName: Record<string, string> = {};\n for (const v of Object.values(byId || {})) {\n const nm = String((v as any)?.name || '').trim();\n const lg = String((v as any)?.logo_url || '').trim();\n if (nm && lg) urlToName[lg] = nm;\n }\n const idx: Record<string, string> = {};\n for (const [alias, url] of Object.entries(byName || {})) {\n const canon = urlToName[String(url)] || '';\n const key = normName(alias);\n if (canon && key) idx[key] = canon;\n }\n return idx;\n })();\n const nameIndex: Record<string, { id: string; name: string; logo_url: string }> = (() => {\n const idx: Record<string, { id: string; name: string; logo_url: string }> = {};\n for (const [id, v] of Object.entries(byId || {})) {\n const nm = String((v as any)?.name || '').trim();\n const lg = String((v as any)?.logo_url || '').trim();\n if (!nm) continue;\n const key = normName(nm);\n if (!key) continue;\n idx[key] = { id, name: nm, logo_url: lg } as any;\n }\n return idx;\n })();\n const getOverrideName = (teamName?: string, teamId?: string) => {\n const tid = teamId ? String(teamId) : '';\n if (tid && byId?.[tid]?.name && String(byId[tid].name).trim()) {\n return String(byId[tid].name).trim();\n }\n try {\n const n = normName(teamName);\n if (aliasNameIndex[n]) return aliasNameIndex[n];\n let hit: any = nameIndex[n];\n if (!hit) {\n for (const [k, v] of Object.entries(nameIndex)) {\n if (!k) continue;\n if (n.endsWith(k) || k.endsWith(n)) { hit = v; break; }\n }\n }\n if (hit && (hit as any).name) return String((hit as any).name);\n } catch {}\n return String(teamName || '');\n };\n \n const getFallbackLogo = (teamName?: string, original?: string) => {\n if (teamName) {\n const exact = (byName || {})[teamName];\n const normName = normalize(teamName);\n let candidate = exact || byNameNormalized[normName];\n if (!candidate) {\n const stripped = stripPrefixes(teamName);\n for (const { keyNorm, url } of byNameStrippedPairs) {\n if (!keyNorm) continue;\n if (stripped.endsWith(keyNorm) || keyNorm.endsWith(stripped)) { candidate = url; break; }\n }\n }\n if (candidate) {\n if (typeof candidate === 'string' && candidate.startsWith('/')) return resolveBackendUrl(candidate);\n return candidate;\n }\n }\n if (original) {\n if (typeof original === 'string' && original.startsWith('/')) return resolveBackendUrl(original);\n return original;\n }\n return undefined;\n };\n \n const getOverrideLogo = (teamName?: string, teamId?: string, original?: string) => {\n // Prefer explicit admin override by ID\n if (teamId && byId?.[teamId]?.logo_url) {\n const v = byId[teamId]!.logo_url as string;\n if (typeof v === 'string' && v.startsWith('/')) return resolveBackendUrl(v);\n return v;\n }\n // Prefer local club logo for our own team\n try {\n if (\n teamId && settingsJSON?.club_id && String(teamId) === String(settingsJSON.club_id) && settingsJSON?.club_logo_url\n ) {\n const local = settingsJSON.club_logo_url as string;\n if (typeof local === 'string' && local.startsWith('/')) return resolveBackendUrl(local);\n return local;\n }\n } catch {}\n // If we have a team ID and no explicit override, use logoapi as a high-quality source\n if (teamId) {\n return `http://logoapi.sportcreative.eu/logos/${teamId}`;\n }\n // Fallback to by-name overrides or original\n return getFallbackLogo(teamName, original);\n };\n\n const settingsJSON = liveSettings || cachedSettingsJSON;\n\n if (settingsJSON) {\n const name = settingsJSON?.club_name || settingsJSON?.clubName || '';\n const id = settingsJSON?.club_id || settingsJSON?.clubId || '';\n const type = settingsJSON?.club_type || 'football';\n if (name) setClubName(name);\n if (id) setClubId(id);\n if (type === 'football' || type === 'futsal') setClubType(type);\n }\n\n // Load ALL matches from FACR (no time filtering) and enrich with backend overrides\n if (facrClubJSON?.competitions?.length) {\n const comps = (facrClubJSON.competitions || []).map((c: any) => ({\n name: (amap?.[c?.code]?.alias) || (amap?.[c?.id]?.alias) || c.name || c.code || 'Soutěž',\n alias: (amap?.[c?.code]?.alias) || (amap?.[c?.id]?.alias),\n display_order: (amap?.[c?.code]?.display_order) ?? (amap?.[c?.id]?.display_order),\n matches_link: c.matches_link,\n matches: (Array.isArray(c.matches) ? c.matches : []).map((m: any, idx: number) => {\n const rawMatchId = String(m.match_id || m.id || '').trim();\n const apiMatch = rawMatchId ? (matchOverrideMap as any)[rawMatchId] : undefined;\n\n // Prefer backend date/time override when available, fallback to FACR date_time\n let dt: string = String((apiMatch && (apiMatch.date_time || apiMatch.date)) || m.date_time || '');\n if (dt && !dt.includes('.')) {\n try {\n const parsed = new Date(dt);\n if (!isNaN(parsed.getTime())) {\n const dd = String(parsed.getDate()).padStart(2, '0');\n const mm = String(parsed.getMonth() + 1).padStart(2, '0');\n const yyyy = parsed.getFullYear();\n const hh = String(parsed.getHours()).padStart(2, '0');\n const min = String(parsed.getMinutes()).padStart(2, '0');\n dt = `${dd}.${mm}.${yyyy} ${hh}:${min}`;\n }\n } catch {}\n }\n\n const [d, t] = dt.includes(' ') ? dt.split(' ') : [dt, ''];\n const [day, month, year] = (d || '').split('.');\n const isoDate = (day && month && year)\n ? `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`\n : new Date().toISOString().slice(0, 10);\n const time = (t || '18:00').slice(0, 5);\n\n const sourceHome = (apiMatch && (apiMatch.home || apiMatch.home_team)) || m.home;\n const sourceAway = (apiMatch && (apiMatch.away || apiMatch.away_team)) || m.away;\n const homeName = getOverrideName(sourceHome, m.home_id);\n const awayName = getOverrideName(sourceAway, m.away_id);\n\n const rawScore = String(\n apiMatch && typeof apiMatch.score !== 'undefined'\n ? apiMatch.score || ''\n : m.score || ''\n ).trim();\n\n // Check if match is in the future - if so, ignore score\n const matchTime = new Date(`${isoDate}T${time}:00`).getTime();\n const isFutureMatch = matchTime > Date.now();\n const actualScore = (!rawScore || isFutureMatch) ? null : rawScore;\n\n const venue = String(\n apiMatch && typeof apiMatch.venue !== 'undefined' && apiMatch.venue !== null\n ? apiMatch.venue\n : m.venue || ''\n );\n\n return {\n id: m.match_id || idx + 1,\n date: isoDate,\n time,\n home: homeName,\n away: awayName,\n home_id: m.home_id,\n away_id: m.away_id,\n home_logo_url: getOverrideLogo(homeName, m.home_id, (apiMatch && apiMatch.home_logo_url) || m.home_logo_url),\n away_logo_url: getOverrideLogo(awayName, m.away_id, (apiMatch && apiMatch.away_logo_url) || m.away_logo_url),\n score: actualScore,\n facr_link: m.facr_link,\n report_url: m.report_url,\n venue,\n competition: c.name || c.code || '',\n };\n })\n }));\n const sortedComps = sortCategoriesWithOrder(comps) as typeof comps;\n setFacrCompetitions(sortedComps);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, []);\n\n return (\n <MainLayout>\n <div style={{ maxWidth: 1200, margin: '0 auto', padding: '24px 16px', background: bgColor, minHeight: '100vh' }}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 24, flexWrap: 'wrap', gap: 16 }}>\n <div>\n <h1 style={{ fontSize: '2rem', fontWeight: 800, marginBottom: 8, color: headingColor }}>{t('matches.all_matches')}</h1>\n <p style={{ color: textSecondary }}>{clubName || 'Klub'}</p>\n </div>\n <button\n onClick={() => setSortAscending(!sortAscending)}\n style={{\n padding: '10px 20px',\n background: 'var(--primary-color, #3b82f6)',\n color: 'white',\n border: 'none',\n borderRadius: 8,\n fontWeight: 600,\n fontSize: '0.9rem',\n cursor: 'pointer',\n transition: 'all 0.2s',\n boxShadow: '0 2px 4px rgba(0,0,0,0.1)',\n display: 'flex',\n alignItems: 'center',\n gap: 8\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = 'translateY(-2px)';\n e.currentTarget.style.boxShadow = '0 4px 8px rgba(0,0,0,0.15)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = '0 2px 4px rgba(0,0,0,0.1)';\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {sortAscending ? (\n <path d=\"M11 5h4M11 9h7M11 13h10M3 17l3 3m0 0l3-3m-3 3V4\" />\n ) : (\n <path d=\"M11 5h10M11 9h7M11 13h4M3 17l3-3m0 0l3 3m-3-3v16\" />\n )}\n </svg>\n {sortAscending ? t('matches.oldest_first') : t('matches.newest_first')}\n </button>\n </div>\n\n {sortedCompetitions.length > 0 ? (\n <Tabs\n variant=\"soft-rounded\"\n colorScheme=\"blue\"\n index={activeTab}\n onChange={setActiveTab}\n >\n <TabList \n mb={4} \n flexWrap=\"wrap\" \n gap={2}\n justifyContent=\"flex-start\"\n sx={{\n '& > button': {\n minW: 'auto',\n px: { base: 3, md: 4 },\n py: { base: 1.5, md: 2 },\n fontSize: { base: 'xs', md: 'sm' },\n fontWeight: 600,\n borderRadius: 'md',\n transition: 'all 0.2s',\n _selected: {\n bg: 'brand.primary',\n color: 'white',\n transform: 'translateY(-2px)',\n boxShadow: 'md'\n },\n _hover: {\n transform: 'translateY(-1px)',\n boxShadow: 'sm'\n }\n }\n }}\n >\n {sortedCompetitions.map((c, i) => (\n <Tab key={`${c.name}-${i}`}>\n {c.name}\n </Tab>\n ))}\n </TabList>\n <TabPanels>\n {sortedCompetitions.map((c, compIdx) => (\n <TabPanel key={`panel-${c.name}-${compIdx}`} px={0}>\n {c.matches.length === 0 ? (\n <div style={{ textAlign: 'center', padding: '40px 0', color: textSecondary }}>\n {t('matches.no_matches_to_display')}\n </div>\n ) : (\n <>\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(320px, 1fr))',\n gap: 16,\n }}\n >\n {c.matches.slice(0, displayedMatchesCount[compIdx] || MATCHES_PER_PAGE).map((m: MatchItem, idx: number) => {\n const matchTime = new Date(`${m.date}T${(m.time || '00:00')}:00`).getTime();\n const currentTime = Date.now();\n const isFuture = matchTime > currentTime;\n const isPast = matchTime < currentTime;\n const hasScore = m.score && m.score.trim() !== '';\n const countdown = liveCountdowns[String(m.id)];\n\n return (\n <div\n key={m.id || idx}\n onClick={() => openMatch({ ...m, competitionName: c.name })}\n style={{\n background: cardBg,\n border: `2px solid ${borderColor}`,\n borderRadius: 16,\n padding: 20,\n cursor: 'pointer',\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n boxShadow: '0 2px 8px rgba(0,0,0,0.08)',\n color: textPrimary,\n position: 'relative',\n overflow: 'hidden',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = 'translateY(-8px)';\n e.currentTarget.style.boxShadow = '0 16px 40px rgba(0,0,0,0.12), 0 6px 16px rgba(0,0,0,0.08)';\n e.currentTarget.style.borderColor = 'var(--chakra-colors-brand-primary, #3b82f6)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = '0 2px 8px rgba(0,0,0,0.08)';\n e.currentTarget.style.borderColor = borderColor;\n }}\n >\n <div style={{ fontSize: '0.85rem', color: textSecondary, marginBottom: 16, display: 'flex', justifyContent: 'space-between', alignItems: 'center', fontWeight: 600 }}>\n <span>\n {formatCzechDate(m.date, m.time || '00:00')}\n </span>\n <span style={{ background: 'var(--chakra-colors-brand-primary, #3b82f6)', color: 'white', padding: '4px 10px', borderRadius: 8, fontSize: '0.8rem', fontWeight: 700 }}>{m.time}</span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 16 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, flex: 1, minWidth: 0 }}>\n <div style={{ width: 48, height: 48, borderRadius: '50%', overflow: 'hidden', boxShadow: '0 4px 12px rgba(0,0,0,0.1)', background: 'white', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <img\n src={assetUrl(m.home_logo_url) || '/images/club-logo-fallback.svg'}\n alt={m.home}\n style={{ \n width: 40, \n height: 40, \n objectFit: 'contain',\n padding: assetUrl(m.home_logo_url)?.includes('logoapi.sportcreative.eu') ? '4px' : '0px',\n boxSizing: 'border-box'\n }}\n onError={(e) => { \n const img = e.target as HTMLImageElement;\n // Prevent infinite retry loop\n if (!img.src.includes('club-logo-fallback.svg')) {\n img.src = '/images/club-logo-fallback.svg'; \n }\n }}\n />\n </div>\n <span style={{ fontWeight: 700, fontSize: '1rem', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }} title={m.home}>\n {truncateClubName(m.home)}\n </span>\n </div>\n </div>\n <div style={{ textAlign: 'center', margin: '20px 0', fontSize: '1.8rem', fontWeight: 'bold' }}>\n {isFuture ? (\n countdown ? (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 6 }}>\n <span style={{ fontSize: '0.7rem', color: '#f97316', fontWeight: 700, textTransform: 'uppercase', letterSpacing: '0.5px' }}>Začátek za</span>\n <span style={{ fontSize: '1.4rem', color: '#f97316', fontWeight: 800, fontFamily: 'monospace' }}>{countdown}</span>\n </div>\n ) : (\n <span style={{ fontSize: '1.2rem', color: '#3b82f6', fontWeight: 600 }}>vs</span>\n )\n ) : hasScore ? (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 8 }}>\n <span style={{ fontSize: '2rem', fontWeight: 800, background: 'linear-gradient(135deg, #3b82f6, #2563eb)', WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent' }}>{m.score}</span>\n </div>\n ) : (\n <span style={{ fontSize: '1.2rem', color: '#9ca3af', fontWeight: 600 }}>—:—</span>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 16 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, flex: 1, minWidth: 0 }}>\n <div style={{ width: 48, height: 48, borderRadius: '50%', overflow: 'hidden', boxShadow: '0 4px 12px rgba(0,0,0,0.1)', background: 'white', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <img\n src={assetUrl(m.away_logo_url) || '/images/club-opponent.svg'}\n alt={m.away}\n style={{ \n width: 40, \n height: 40, \n objectFit: 'contain',\n padding: assetUrl(m.away_logo_url)?.includes('logoapi.sportcreative.eu') ? '4px' : '0px',\n boxSizing: 'border-box'\n }}\n onError={(e) => { (e.target as HTMLImageElement).src = '/images/club-opponent.svg'; }}\n />\n </div>\n <span style={{ fontWeight: 700, fontSize: '1rem', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }} title={m.away}>\n {truncateClubName(m.away)}\n </span>\n </div>\n </div>\n {m.venue && (\n <div style={{ fontSize: '0.85rem', color: textSecondary, marginTop: 12, textAlign: 'center' }}>\n {m.venue}\n </div>\n )}\n {/* Weather widget for home matches that haven't started */}\n {m.home && clubName && isClubTeam(m.home) && isFuture && (\n <div style={{ marginTop: 12 }}>\n <MatchWeather\n matchDateTime={`${m.date}T${m.time || '15:00'}:00`}\n venue={undefined} // Home matches use club location\n isHomeMatch={true}\n matchHasStarted={false}\n />\n </div>\n )}\n {(m as any).competitionName && activeTab === 0 && (\n <div style={{ marginTop: 12, textAlign: 'center' }}>\n <span style={{ fontSize: '0.75rem', color: 'white', background: 'var(--chakra-colors-brand-primary, #3b82f6)', padding: '4px 12px', borderRadius: 12, fontWeight: 700, textTransform: 'uppercase', letterSpacing: '0.5px' }}>\n {(m as any).competitionName}\n </span>\n </div>\n )}\n {(() => {\n const sentiment = hasScore && isPast ? getSentiment(m) : null;\n if (sentiment) {\n const colors = {\n green: { bg: 'linear-gradient(135deg, #10b981 0%, #059669 100%)', shadow: 'rgba(16, 185, 129, 0.3)' },\n blue: { bg: 'linear-gradient(135deg, #3b82f6 0%, #2563eb 100%)', shadow: 'rgba(59, 130, 246, 0.3)' },\n red: { bg: 'linear-gradient(135deg, #ef4444 0%, #dc2626 100%)', shadow: 'rgba(239, 68, 68, 0.3)' }\n };\n const color = colors[sentiment.colorScheme];\n return (\n <div style={{\n fontSize: '0.75rem',\n background: color.bg,\n color: 'white',\n marginTop: 12,\n padding: '6px 12px',\n borderRadius: 8,\n textAlign: 'center',\n fontWeight: 700,\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n boxShadow: `0 2px 8px ${color.shadow}`\n }}>\n {sentiment.label}\n </div>\n );\n }\n if (!hasScore && isPast) {\n return (\n <div style={{\n fontSize: '0.75rem',\n background: 'linear-gradient(135deg, #6b7280 0%, #4b5563 100%)',\n color: 'white',\n marginTop: 12,\n padding: '6px 12px',\n borderRadius: 8,\n textAlign: 'center',\n fontWeight: 700,\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n boxShadow: '0 2px 8px rgba(107, 114, 128, 0.3)'\n }}>\n {t('matches.played')}\n </div>\n );\n }\n if (!hasScore && isFuture && !countdown) {\n return (\n <div style={{\n fontSize: '0.75rem',\n background: 'linear-gradient(135deg, #3b82f6 0%, #2563eb 100%)',\n color: 'white',\n marginTop: 12,\n padding: '6px 12px',\n borderRadius: 8,\n textAlign: 'center',\n fontWeight: 700,\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n boxShadow: '0 2px 8px rgba(59, 130, 246, 0.3)'\n }}>\n {t('matches.upcoming')}\n </div>\n );\n }\n return null;\n })()}\n </div>\n );\n })}\n </div>\n {c.matches.length > (displayedMatchesCount[compIdx] || MATCHES_PER_PAGE) && (\n <div style={{ textAlign: 'center', marginTop: 32 }}>\n <button\n onClick={() => handleLoadMore(compIdx)}\n style={{\n padding: '14px 32px',\n background: 'var(--primary-color, #3b82f6)',\n color: 'white',\n border: 'none',\n borderRadius: 12,\n fontWeight: 700,\n fontSize: '1rem',\n cursor: 'pointer',\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n boxShadow: '0 4px 12px rgba(59, 130, 246, 0.3)',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 10\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = 'translateY(-2px)';\n e.currentTarget.style.boxShadow = '0 8px 20px rgba(59, 130, 246, 0.4)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = '0 4px 12px rgba(59, 130, 246, 0.3)';\n }}\n >\n <span>{t('matches.load_more_matches')}</span>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </button>\n <div style={{ marginTop: 12, fontSize: '0.875rem', color: textSecondary, fontWeight: 600 }}>\n {t('matches.showing_matches', { \n shown: Math.min(displayedMatchesCount[compIdx] || MATCHES_PER_PAGE, c.matches.length), \n total: c.matches.length \n })}\n </div>\n </div>\n )}\n </>\n )}\n </TabPanel>\n ))}\n </TabPanels>\n </Tabs>\n ) : (\n <div style={{ textAlign: 'center', padding: '60px 0', color: textSecondary }}>\n <p style={{ fontSize: '1.2rem', marginBottom: 8, color: headingColor }}>{t('matches.no_matches_to_display')}</p>\n <p style={{ fontSize: '0.9rem', color: textSecondary }}>{t('matches.check_club_settings')}</p>\n </div>\n )}\n </div>\n {/* Match details modal - same as CalendarPage */}\n <Modal isOpen={isMatchModalOpen} onClose={() => setIsMatchModalOpen(false)} size=\"lg\" isCentered returnFocusOnClose={false}>\n <ModalContent>\n <ModalHeader>\n {selectedMatch ? (selectedMatch.competitionName || selectedMatch.competition || 'Detail zápasu') : 'Detail zápasu'}\n </ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n {selectedMatch && (\n <VStack spacing={4}>\n {/* Show match status (Výhra/Remíza/Prohra) if determinable; otherwise fall back to competition name */}\n {(() => {\n const sentiment = getSentiment(selectedMatch);\n if (sentiment) {\n return (\n <Flex justify=\"center\">\n <Badge colorScheme={sentiment.colorScheme as any} variant=\"subtle\">{sentiment.label}</Badge>\n </Flex>\n );\n }\n const compName = selectedMatch.competition || selectedMatch.competitionName;\n // Don't show \"Všechny soutěže\" badge - only show specific competition names\n if (compName && compName !== 'Všechny soutěže') {\n return (\n <Flex justify=\"center\">\n <Badge colorScheme=\"purple\">{compName}</Badge>\n </Flex>\n );\n }\n return null;\n })()}\n <Flex align=\"center\" justify=\"center\" gap={3}>\n {selectedMatch.home_logo_url && (\n <Image \n src={assetUrl(selectedMatch.home_logo_url)} \n alt={selectedMatch.home} \n boxSize=\"40px\" \n borderRadius=\"full\"\n cursor=\"pointer\"\n onClick={() => handleTeamClick(selectedMatch.home, selectedMatch.home_logo_url)}\n _hover={{ opacity: 0.8, transform: 'scale(1.1)' }}\n transition=\"all 0.2s\"\n title={`Klikněte pro zobrazení statistik: ${selectedMatch.home}`}\n />\n )}\n {(() => {\n const matchTime = new Date(`${selectedMatch.date}T${(selectedMatch.time || '00:00')}:00`);\n const isPast = matchTime.getTime() <= Date.now();\n const hasScore = Boolean(selectedMatch.score);\n \n // For future matches, always show countdown or \"vs\" - never score\n if (!isPast) {\n const countdown = liveCountdowns[String(selectedMatch.id)];\n if (countdown) {\n return (\n <Badge colorScheme=\"orange\" fontSize=\"md\" px={3} py={1}>za {countdown}</Badge>\n );\n }\n return (\n <Badge colorScheme=\"gray\" fontSize=\"md\" px={3} py={1}>vs</Badge>\n );\n }\n \n // For past matches, show score or \"vs\"\n return (\n <Badge colorScheme={hasScore ? (getSentiment(selectedMatch)?.colorScheme || 'gray') : 'gray'} fontSize=\"md\" px={3} py={1}>\n {hasScore ? selectedMatch.score : 'vs'}\n </Badge>\n );\n })()}\n {selectedMatch.away_logo_url && (\n <Image \n src={assetUrl(selectedMatch.away_logo_url)} \n alt={selectedMatch.away} \n boxSize=\"40px\" \n borderRadius=\"full\"\n cursor=\"pointer\"\n onClick={() => handleTeamClick(selectedMatch.away, selectedMatch.away_logo_url)}\n _hover={{ opacity: 0.8, transform: 'scale(1.1)' }}\n transition=\"all 0.2s\"\n title={`Klikněte pro zobrazení statistik: ${selectedMatch.away}`}\n />\n )}\n </Flex>\n {/* Date and Time Display with Countdown */}\n <Box textAlign=\"center\">\n <Text fontSize=\"lg\" fontWeight=\"semibold\" color=\"gray.800\" mb={1}>\n {(() => {\n try {\n return format(parse(selectedMatch.date, 'yyyy-MM-dd', new Date()), 'EEEE d. MMMM yyyy', { locale: cs });\n } catch {\n return selectedMatch.date;\n }\n })()}\n </Text>\n <Text fontSize=\"md\" color=\"gray.700\">\n {selectedMatch.time || '—'}\n </Text>\n </Box>\n \n {/* Enhanced Countdown Display for Upcoming Matches */}\n {(() => {\n const matchTime = new Date(`${selectedMatch.date}T${(selectedMatch.time || '00:00')}:00`);\n const isPast = matchTime.getTime() <= Date.now();\n const hasScore = Boolean(selectedMatch.score);\n const countdown = liveCountdowns[String(selectedMatch.id)];\n \n if (!hasScore && !isPast && countdown) {\n // Parse countdown string to get time remaining\n const timeRemaining = parseCountdownToMs(countdown);\n if (timeRemaining > 0) {\n const days = Math.floor(timeRemaining / (24 * 60 * 60 * 1000));\n const hours = Math.floor((timeRemaining % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000));\n const minutes = Math.floor((timeRemaining % (60 * 60 * 1000)) / (60 * 1000));\n const seconds = Math.floor((timeRemaining % (60 * 1000)) / 1000);\n \n return (\n <Box \n mt={4} \n p={4} \n bg=\"orange.50\" \n borderRadius=\"lg\" \n borderWidth=\"2px\" \n borderColor=\"orange.200\"\n >\n <Text fontSize=\"sm\" fontWeight=\"semibold\" color=\"orange.800\" mb={3} textAlign=\"center\">\n Zápas začíná za\n </Text>\n <Grid \n templateColumns={days > 0 ? \"repeat(4, 1fr)\" : \"repeat(3, 1fr)\"} \n gap={3}\n >\n {days > 0 && (\n <Box textAlign=\"center\">\n <Box \n bg=\"white\" \n borderRadius=\"md\" \n p={3} \n borderWidth=\"1px\" \n borderColor=\"orange.300\"\n boxShadow=\"sm\"\n >\n <Text fontSize=\"2xl\" fontWeight=\"bold\" color=\"orange.600\">\n {days}\n </Text>\n </Box>\n <Text fontSize=\"xs\" color=\"gray.600\" mt={1} fontWeight=\"medium\">\n {days === 1 ? 'den' : days < 5 ? 'dny' : 'dní'}\n </Text>\n </Box>\n )}\n <Box textAlign=\"center\">\n <Box \n bg=\"white\" \n borderRadius=\"md\" \n p={3} \n borderWidth=\"1px\" \n borderColor=\"orange.300\"\n boxShadow=\"sm\"\n >\n <Text fontSize=\"2xl\" fontWeight=\"bold\" color=\"orange.600\">\n {String(hours).padStart(2, '0')}\n </Text>\n </Box>\n <Text fontSize=\"xs\" color=\"gray.600\" mt={1} fontWeight=\"medium\">\n {hours === 1 ? 'hodina' : hours < 5 ? 'hodiny' : 'hodin'}\n </Text>\n </Box>\n <Box textAlign=\"center\">\n <Box \n bg=\"white\" \n borderRadius=\"md\" \n p={3} \n borderWidth=\"1px\" \n borderColor=\"orange.300\"\n boxShadow=\"sm\"\n >\n <Text fontSize=\"2xl\" fontWeight=\"bold\" color=\"orange.600\">\n {String(minutes).padStart(2, '0')}\n </Text>\n </Box>\n <Text fontSize=\"xs\" color=\"gray.600\" mt={1} fontWeight=\"medium\">\n {minutes === 1 ? 'minuta' : minutes < 5 ? 'minuty' : 'minut'}\n </Text>\n </Box>\n <Box textAlign=\"center\">\n <Box \n bg=\"white\" \n borderRadius=\"md\" \n p={3} \n borderWidth=\"1px\" \n borderColor=\"orange.300\"\n boxShadow=\"sm\"\n >\n <Text fontSize=\"2xl\" fontWeight=\"bold\" color=\"orange.600\">\n {String(seconds).padStart(2, '0')}\n </Text>\n </Box>\n <Text fontSize=\"xs\" color=\"gray.600\" mt={1} fontWeight=\"medium\">\n {seconds === 1 ? 'sekunda' : seconds < 5 ? 'sekundy' : 'sekund'}\n </Text>\n </Box>\n </Grid>\n </Box>\n );\n }\n }\n return null;\n })()}\n <Box h=\"1px\" bg=\"gray.200\" />\n \n {/* Venue information */}\n {selectedMatch.venue && (\n <Text fontSize=\"md\" color=\"gray.700\" textAlign=\"center\">\n <strong>Kde:</strong> {selectedMatch.venue}\n </Text>\n )}\n \n {/* Weather widget for home matches that haven't started */}\n {(() => {\n const matchTime = new Date(`${selectedMatch.date}T${(selectedMatch.time || '00:00')}:00`);\n const isPast = matchTime.getTime() <= Date.now();\n const isHomeMatch = selectedMatch.home && clubName && isClubTeam(selectedMatch.home);\n \n if (isHomeMatch && !isPast) {\n return (\n <Box>\n <MatchWeather\n matchDateTime={`${selectedMatch.date}T${selectedMatch.time || '15:00'}:00`}\n venue={undefined} // Home matches use club location\n isHomeMatch={true}\n matchHasStarted={false}\n delayLoad={false} // Auto-load when modal opens\n />\n </Box>\n );\n }\n return null;\n })()}\n \n <Box h=\"1px\" bg=\"gray.200\" />\n <Heading as=\"h3\" size=\"sm\">Odběr notifikací pro fanoušky</Heading>\n <Text fontSize=\"sm\" color=\"gray.600\">Zadejte svůj email a budeme vás informovat o novinkách a zápasech.</Text>\n <Flex gap={2} align=\"center\">\n <Input \n type=\"email\" \n placeholder=\"váš@email.cz\" \n value={fanEmail} \n onChange={(e) => setFanEmail(e.target.value)} \n />\n <Button colorScheme=\"red\" onClick={subscribeFan} isLoading={fanSubscribing}>\n Odebírat\n </Button>\n </Flex>\n </VStack>\n )}\n </ModalBody>\n <ModalFooter>\n {selectedMatch && (selectedMatch.facr_link || selectedMatch.report_url) && (\n <Button \n colorScheme=\"blue\" \n mr={3}\n onClick={(e) => {\n e.preventDefault();\n const facrLink = selectedMatch.facr_link || selectedMatch.report_url;\n if (facrLink) {\n const link = document.createElement('a');\n link.href = facrLink;\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n }}\n >\n Detail na FAČR\n </Button>\n )}\n <Button onClick={() => setIsMatchModalOpen(false)}>Zavřít</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </MainLayout>\n );\n};\n\nexport default MatchesPage;\n","import React, { createContext, useContext, useState, useEffect, ReactNode } from 'react';\nimport { isAuthenticated, checkAdminExists, getToken as getStoredToken, clearToken, setToken as storeToken } from '../utils/auth';\nimport api, { API_URL } from '../services/api';\nimport { User } from '../types';\n\ninterface AuthContextType {\n isAuthenticated: boolean;\n user: User | null;\n isLoading: boolean;\n adminExists: boolean;\n login: (token: string, userData: User, remember?: boolean) => Promise<void>;\n logout: () => void;\n updateUser: (userData: Partial<User>) => void;\n}\n\nconst AuthContext = createContext<AuthContextType | undefined>(undefined);\n\nexport const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const [user, setUser] = useState<User | null>(null);\n const [authenticated, setAuthenticated] = useState<boolean>(false);\n const [loading, setLoading] = useState<boolean>(true);\n const [adminExists, setAdminExists] = useState<boolean>(false);\n\n useEffect(() => {\n const initializeAuth = async () => {\n // Check if admin exists\n const adminCheck = await checkAdminExists();\n setAdminExists(adminCheck);\n \n // Check authentication\n const token = getStoredToken();\n if (token && isAuthenticated()) {\n try {\n // Fetch user data from API\n const base = API_URL;\n const response = await fetch(`${base}/auth/me`, {\n credentials: 'include',\n headers: {\n 'Authorization': `Bearer ${token}`\n }\n });\n if (response.ok) {\n const data = await response.json();\n const userData = data.user || data;\n setUser(userData);\n setAuthenticated(true);\n \n // If this is the first user, they become admin\n if (!adminCheck && !userData.role) {\n const makeAdminResponse = await fetch(`${base}/auth/make-admin`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json'\n }\n });\n \n if (makeAdminResponse.ok) {\n const updatedUser = { ...userData, role: 'admin' };\n setUser(updatedUser);\n setAdminExists(true);\n }\n }\n } else {\n clearToken();\n }\n } catch (error) {\n console.error('Error initializing auth:', error);\n clearToken();\n }\n }\n setLoading(false);\n };\n \n initializeAuth();\n }, []);\n\n const login = async (token: string, userData: User, remember: boolean = true) => {\n storeToken(token, remember);\n \n // If the user already has admin role, reflect it immediately\n if (userData.role === 'admin') {\n setAdminExists(true);\n }\n // Otherwise, try to promote if no admin exists\n else if (!adminExists && !userData.role) {\n try {\n const base = API_URL;\n const response = await fetch(`${base}/auth/make-admin`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json'\n }\n });\n \n if (response.ok) {\n userData.role = 'admin';\n setAdminExists(true);\n }\n } catch (error) {\n console.error('Error making user admin:', error);\n }\n }\n setUser(userData);\n setAuthenticated(true);\n };\n\n const updateUser = (userData: Partial<User>) => {\n if (user) {\n setUser({ ...user, ...userData });\n }\n };\n\n const logout = () => {\n // Attempt to clear server-side HttpOnly cookie (if used)\n try {\n // Use axios instance with credentials enabled\n api.post('/auth/logout').catch(() => {});\n } catch {}\n clearToken();\n setUser(null);\n setAuthenticated(false);\n };\n\n return (\n <AuthContext.Provider value={{\n isAuthenticated: authenticated,\n user,\n isLoading: loading,\n adminExists,\n login,\n logout,\n updateUser\n }}>\n {children}\n </AuthContext.Provider>\n );\n};\n\nexport const useAuth = (): AuthContextType => {\n const context = useContext(AuthContext);\n if (context === undefined) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n return context;\n};\n","import { Box, Button, FormControl, FormErrorMessage, FormLabel, Heading, Image, Input, Link, SimpleGrid, Spinner, Stack, Text, Textarea, VStack, useToast, Grid, GridItem, useColorModeValue } from '@chakra-ui/react';\nimport { useQuery, useMutation } from '@tanstack/react-query';\nimport { getSponsors, sendContact } from '../services/public';\nimport MainLayout from '../components/layout/MainLayout';\nimport { useForm } from 'react-hook-form';\nimport { assetUrl } from '../utils/url';\nimport { useTranslation } from 'react-i18next';\n\ntype ContactFormData = { name: string; email: string; subject: string; message: string; source?: string };\n\nconst SponsorsPage: React.FC = () => {\n const { t } = useTranslation();\n const { data, isLoading, isError, error } = useQuery({ queryKey: ['sponsors-page'], queryFn: getSponsors });\n const toast = useToast();\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const textSecondary = useColorModeValue('gray.600', 'gray.400');\n const textTertiary = useColorModeValue('gray.700', 'gray.300');\n\n const { register, handleSubmit, reset, formState: { errors } } = useForm<ContactFormData>();\n const { mutate, isLoading: sending } = useMutation({\n mutationFn: (payload: ContactFormData) => sendContact({ ...payload, source: 'sponsor' }),\n onSuccess: () => {\n reset();\n toast({ title: t('sponsors.message_sent'), description: t('sponsors.message_sent_desc'), status: 'success' });\n },\n onError: (e:any) => {\n const code = e?.code || '';\n const fromServer = e?.response?.data?.error || e?.response?.data?.message;\n const isTimeout = code === 'ECONNABORTED' || /timeout/i.test(String(e?.message || ''));\n const isNetwork = !!e?.isAxiosError && !e?.response;\n const msg = fromServer\n || (isTimeout ? t('sponsors.timeout_error')\n : isNetwork ? t('sponsors.network_error')\n : (e?.message || t('sponsors.send_error')));\n toast({ title: t('sponsors.error_title'), description: msg, status: 'error' });\n }\n });\n\n if (isLoading) return <Spinner />;\n if (isError) {\n const errMsg = (error as any)?.response?.data?.error || (error as any)?.message || t('sponsors.error_loading');\n return <Text color=\"red.500\">{errMsg}</Text>;\n }\n\n // Group sponsors by tier and sort within groups\n const sorter = (a: any, b: any) => {\n const ao = (a?.display_order ?? 9999);\n const bo = (b?.display_order ?? 9999);\n if (ao !== bo) return ao - bo;\n return String(a?.name || '').localeCompare(String(b?.name || ''));\n };\n const generalPartners = (data?.filter((s) => s.tier === 'general') || []).slice().sort(sorter);\n const standardSponsors = (data?.filter((s) => s.tier !== 'general') || []).slice().sort(sorter);\n\n return (\n <MainLayout>\n <VStack align=\"stretch\" spacing={10} maxW=\"7xl\" mx=\"auto\" px={{ base: 4, md: 6 }} py={{ base: 6, md: 10 }}>\n {/* Main sponsors section */}\n <Box>\n <Heading size=\"lg\" mb={6}>{t('sponsors.title')}</Heading>\n \n {/* General Partners - Larger display */}\n {generalPartners.length > 0 && (\n <Box mb={8}>\n <Heading size=\"md\" mb={4} color=\"brand.600\">{t('sponsors.main_partners')}</Heading>\n <SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} spacing={8}>\n {generalPartners.map((s) => (\n <Stack key={s.id} align=\"center\" bg={cardBg} p={6} borderRadius=\"lg\" borderWidth=\"2px\" borderColor={borderColor} boxShadow=\"md\">\n <Link href={s.website_url || '#'} isExternal>\n <Image src={assetUrl(s.logo_url) || '/sponsor-placeholder.svg'} alt={s.name} height=\"100px\" objectFit=\"contain\" />\n </Link>\n <Text fontWeight=\"semibold\" fontSize=\"lg\">{s.name}</Text>\n </Stack>\n ))}\n </SimpleGrid>\n </Box>\n )}\n\n {/* Standard Sponsors - Regular display */}\n {standardSponsors.length > 0 && (\n <Box>\n <Heading size=\"md\" mb={4} color={textTertiary}>{t('sponsors.partners')}</Heading>\n <SimpleGrid columns={{ base: 2, md: 3, lg: 5 }} spacing={6}>\n {standardSponsors.map((s) => (\n <Stack key={s.id} align=\"center\" bg={cardBg} p={4} borderRadius=\"md\" borderWidth=\"1px\" borderColor={borderColor}>\n <Link href={s.website_url || '#'} isExternal>\n <Image src={assetUrl(s.logo_url) || '/sponsor-placeholder.svg'} alt={s.name} height=\"60px\" objectFit=\"contain\" />\n </Link>\n <Text fontSize=\"sm\">{s.name}</Text>\n </Stack>\n ))}\n </SimpleGrid>\n </Box>\n )}\n </Box>\n\n {/* Kontakt pro nové partnery stylově sladěný s hlavní kontaktní stránkou */}\n <Box maxW=\"600px\" mx=\"auto\" w=\"full\" alignSelf=\"stretch\">\n <Box mb={4}>\n <Heading size=\"lg\" mb={2}>\n {t('sponsors.become_partner')}\n </Heading>\n <Text color={textSecondary}>\n {t('sponsors.partnership_description')}\n </Text>\n </Box>\n\n <Box\n bg={cardBg}\n borderRadius=\"lg\"\n borderWidth=\"1px\"\n borderColor={borderColor}\n boxShadow=\"sm\"\n p={6}\n >\n <form onSubmit={handleSubmit((vals) => mutate({ ...vals }))}>\n <VStack spacing={4}>\n <FormControl isInvalid={!!errors.name}>\n <FormLabel htmlFor=\"partner-name\">{t('sponsors.name_label')}</FormLabel>\n <Input\n id=\"partner-name\"\n placeholder={t('sponsors.name_placeholder')}\n {...register('name', { required: t('sponsors.name_required') })}\n />\n <FormErrorMessage>\n {errors.name?.message}\n </FormErrorMessage>\n </FormControl>\n\n <FormControl isInvalid={!!errors.email}>\n <FormLabel htmlFor=\"partner-email\">{t('sponsors.email_label')}</FormLabel>\n <Input\n id=\"partner-email\"\n type=\"email\"\n placeholder={t('sponsors.email_placeholder')}\n {...register('email', { required: t('sponsors.email_required') })}\n />\n <FormErrorMessage>\n {errors.email?.message}\n </FormErrorMessage>\n </FormControl>\n\n <FormControl isInvalid={!!errors.subject}>\n <FormLabel htmlFor=\"partner-subject\">{t('sponsors.subject_label')}</FormLabel>\n <Input\n id=\"partner-subject\"\n placeholder={t('sponsors.subject_placeholder')}\n {...register('subject', { required: t('sponsors.subject_required') })}\n />\n <FormErrorMessage>\n {errors.subject?.message}\n </FormErrorMessage>\n </FormControl>\n\n <FormControl isInvalid={!!errors.message}>\n <FormLabel htmlFor=\"partner-message\">{t('sponsors.message_label')}</FormLabel>\n <Textarea\n id=\"partner-message\"\n rows={6}\n placeholder={t('sponsors.message_placeholder')}\n {...register('message', { required: t('sponsors.message_required') })}\n />\n <FormErrorMessage>\n {errors.message?.message}\n </FormErrorMessage>\n </FormControl>\n\n <Button\n type=\"submit\"\n colorScheme=\"brand\"\n size=\"lg\"\n width=\"full\"\n mt={2}\n isLoading={sending}\n loadingText={t('sponsors.sending')}\n >\n {t('sponsors.send_message')}\n </Button>\n </VStack>\n </form>\n </Box>\n </Box>\n </VStack>\n </MainLayout>\n );\n}\n\nexport default SponsorsPage;\n","import api from './api';\n\nexport interface Player {\n id: number;\n first_name: string;\n last_name: string;\n date_of_birth?: string; // ISO date string\n position?: string;\n jersey_number?: number;\n team_id?: number;\n nationality?: string;\n height?: number;\n weight?: number;\n image_url?: string;\n gender?: string;\n is_active: boolean;\n created_at?: string;\n email?: string;\n phone?: string;\n}\n\n// Normalize backend payloads where gorm.Model serializes as `ID` rather than `id`.\n// Also keep only the fields we use.\nfunction normalize(p: any): Player {\n if (!p) return p as any;\n const id = p.id ?? p.ID;\n return {\n id: typeof id === 'string' ? Number(id) : id,\n first_name: p.first_name ?? p.FirstName ?? '',\n last_name: p.last_name ?? p.LastName ?? '',\n date_of_birth: p.date_of_birth ?? p.DateOfBirth ?? undefined,\n position: p.position ?? p.Position ?? undefined,\n jersey_number: p.jersey_number ?? p.JerseyNumber ?? undefined,\n team_id: p.team_id ?? p.TeamID ?? undefined,\n nationality: p.nationality ?? p.Nationality ?? undefined,\n height: p.height ?? p.Height ?? undefined,\n weight: p.weight ?? p.Weight ?? undefined,\n image_url: p.image_url ?? p.ImageURL ?? undefined,\n gender: p.gender ?? p.Gender ?? undefined,\n is_active: Boolean(p.is_active ?? p.IsActive ?? true),\n created_at: p.created_at ?? p.CreatedAt ?? undefined,\n email: p.email ?? p.Email ?? undefined,\n phone: p.phone ?? p.Phone ?? undefined,\n } as Player;\n}\n\nexport async function getPlayers(opts?: { active?: boolean; team_id?: number | string }): Promise<Player[]> {\n let url = '/players';\n const params = new URLSearchParams();\n if (opts && opts.active === false) params.set('active', 'false');\n if (opts && opts.team_id != null) params.set('team_id', String(opts.team_id));\n if (Array.from(params.keys()).length > 0) {\n url += `?${params.toString()}`;\n }\n const res = await api.get<any[] | { data?: any[]; items?: any[] }>(url);\n const raw = Array.isArray(res.data)\n ? res.data\n : ((res.data as any).data || (res.data as any).items);\n return (raw || []).map(normalize);\n}\n\nexport async function createPlayer(payload: Partial<Player>) {\n // Admin endpoint requires auth token via api interceptor\n const res = await api.post<any>('/players', payload);\n return normalize(res.data);\n}\n\nexport async function updatePlayer(id: number | string, payload: Partial<Player>) {\n const res = await api.put<any>(`/players/${id}`, payload);\n return normalize(res.data);\n}\n\nexport async function deletePlayer(id: number | string) {\n const res = await api.delete<{ zprava: string }>(`/players/${id}`);\n return res.data;\n}\n","import api from './api';\n\n// Types\nexport interface ContactCategory {\n id: number;\n name: string;\n description: string;\n display_order: number;\n is_active: boolean;\n created_at?: string;\n updated_at?: string;\n}\n\nexport interface Contact {\n id: number;\n category_id?: number;\n category?: ContactCategory;\n name: string;\n position: string;\n email: string;\n phone: string;\n image_url?: string;\n description?: string;\n display_order: number;\n is_active: boolean;\n created_at?: string;\n updated_at?: string;\n}\n\nexport interface GroupedContacts {\n categories: Record<string, Contact[]>;\n uncategorized: Contact[];\n}\n\n// Public API\nexport const getPublicContacts = async (): Promise<GroupedContacts> => {\n const response = await api.get('/contacts');\n return response.data;\n};\n\nexport const getPublicContactCategories = async (): Promise<ContactCategory[]> => {\n const response = await api.get('/contacts/categories');\n return response.data;\n};\n\n// Admin API - Contact Categories\nexport const getContactCategories = async (): Promise<ContactCategory[]> => {\n const response = await api.get('/admin/contacts/categories');\n return response.data;\n};\n\nexport const createContactCategory = async (data: Partial<ContactCategory>): Promise<ContactCategory> => {\n const response = await api.post('/admin/contacts/categories', data);\n return response.data;\n};\n\nexport const updateContactCategory = async (id: number, data: Partial<ContactCategory>): Promise<ContactCategory> => {\n const response = await api.put(`/admin/contacts/categories/${id}`, data);\n return response.data;\n};\n\nexport const deleteContactCategory = async (id: number): Promise<void> => {\n await api.delete(`/admin/contacts/categories/${id}`);\n};\n\n// Admin API - Contacts\nexport const getContacts = async (): Promise<Contact[]> => {\n const response = await api.get('/admin/contacts');\n return response.data;\n};\n\nexport const createContact = async (data: Partial<Contact>): Promise<Contact> => {\n const response = await api.post('/admin/contacts', data);\n return response.data;\n};\n\nexport const updateContact = async (id: number, data: Partial<Contact>): Promise<Contact> => {\n const response = await api.put(`/admin/contacts/${id}`, data);\n return response.data;\n};\n\nexport const deleteContact = async (id: number): Promise<void> => {\n await api.delete(`/admin/contacts/${id}`);\n};\n","import { Container, Heading, Text, List, ListItem, Link, Box, VStack, Divider, useColorModeValue } from '@chakra-ui/react';\nimport MainLayout from '../../components/layout/MainLayout';\n\nconst TermsPage: React.FC = () => {\n const textColor = useColorModeValue('gray.700', 'gray.300');\n const headingColor = useColorModeValue('gray.900', 'gray.100');\n const boxBg = useColorModeValue('blue.50', 'blue.900');\n const boxText = useColorModeValue('blue.900', 'blue.100');\n\n return (\n <MainLayout>\n <Container maxW=\"3xl\" py={8}>\n <VStack align=\"stretch\" spacing={6}>\n <Heading as=\"h1\" size=\"xl\" mb={2} color={headingColor}>Obchodní podmínky</Heading>\n <Text fontSize=\"sm\" color={textColor}>\n Poslední aktualizace: {new Date().toLocaleDateString('cs-CZ')}\n </Text>\n\n <Box bg={boxBg} p={4} borderRadius=\"md\">\n <Text fontWeight=\"bold\" mb={2} color={boxText}>Shrnutí</Text>\n <Text fontSize=\"sm\" color={boxText}>\n Používáním tohoto webu souhlasíte s níže uvedenými podmínkami. Obsah slouží pro informační účely, bez záruky úplnosti a správnosti. Provozovatel může podmínky a obsah kdykoli měnit.\n </Text>\n </Box>\n\n <Divider />\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>1. Provozovatel a kontakt</Heading>\n <Text color={textColor} mb={4}>\n Provozovatelem webových stránek je subjekt uvedený v sekci <Link href=\"/kontakt\" color=\"brand.primary\">Kontakt</Link>. Pro veškeré dotazy nebo podněty prosím využijte uvedené kontaktní údaje.\n </Text>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>2. Rozsah a přijetí podmínek</Heading>\n <Text color={textColor} mb={4}>\n Tyto podmínky upravují používání tohoto webu a souvisejících služeb (např. newsletter). Vstupem na web a jeho používáním vyjadřujete souhlas s těmito podmínkami.\n </Text>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>3. Obsah, zdroje dat a práva k duševnímu vlastnictví</Heading>\n <List spacing={2} mb={4} styleType=\"disc\" pl={6} color={textColor}>\n <ListItem><strong>Autorská práva:</strong> Texty, grafika a prvky webu podléhají ochraně autorského práva. Kopírování či šíření je možné pouze s předchozím souhlasem.</ListItem>\n <ListItem><strong>Externí data FAČR:</strong> Informace o zápasech, soutěžích a tabulkách pocházejí z veřejných zdrojů FAČR (<Link href=\"https://www.fotbal.cz\" isExternal color=\"brand.primary\">www.fotbal.cz</Link>) a jsou majetkem FAČR. Zobrazujeme je výhradně pro informační účely.</ListItem>\n <ListItem><strong>Loga klubů a týmů:</strong> Loga náleží příslušným klubům a organizacím a slouží pouze k identifikaci.</ListItem>\n <ListItem><strong>Fotografie a videa:</strong> Mediální obsah může pocházet z různých zdrojů, včetně YouTube a Zonerama. Veškerá práva náleží původním autorům.</ListItem>\n </List>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>4. Pravidla chování uživatelů</Heading>\n <List spacing={2} mb={4} styleType=\"disc\" pl={6} color={textColor}>\n <ListItem>Neporušujte právní předpisy ani práva třetích osob.</ListItem>\n <ListItem>Nevkládejte škodlivý kód a nepokoušejte se narušit bezpečnost webu.</ListItem>\n <ListItem>Nevyužívejte web k nevyžádané reklamě ani automatizovanému sběru dat (scraping) v rozporu s podmínkami.</ListItem>\n </List>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>5. Newsletter a účty</Heading>\n <Text color={textColor} mb={4}>\n Přihlášení k odběru newsletteru je dobrovolné a lze jej kdykoli odhlásit prostřednictvím odkazu v emailu nebo na stránce <Link href=\"/newsletter/preferences\" color=\"brand.primary\">nastavení newsletteru</Link>.\n </Text>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>6. Odpovědnost a záruky</Heading>\n <Text color={textColor} mb={4}>\n Obsah webu je poskytován „tak jak je“, bez jakýchkoli záruk. Provozovatel neodpovídá za případné škody vzniklé užíváním webu, v nejširším rozsahu povoleném právem. Neodpovídáme za dostupnost a obsah externích odkazů (např. FAČR, YouTube, Zonerama).\n </Text>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>7. Eshop a externí služby</Heading>\n <Text color={textColor} mb={4}>\n Pokud web odkazuje na externí eshop nebo platební službu, nákup se řídí podmínkami daného poskytovatele. Provozovatel tohoto webu není stranou takového smluvního vztahu, pokud není výslovně uvedeno jinak.\n </Text>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>8. Ochrana osobních údajů a cookies</Heading>\n <Text color={textColor} mb={4}>\n Zpracování osobních údajů se řídí dokumentem <Link href=\"/zasady-ochrany-osobnich-udaju\" color=\"brand.primary\">Zásady ochrany osobních údajů</Link>. Informace o cookies naleznete v <Link href=\"/pravidla-cookies\" color=\"brand.primary\">Pravidlech používání cookies</Link>.\n </Text>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>9. Změny podmínek</Heading>\n <Text color={textColor} mb={4}>\n Provozovatel si vyhrazuje právo tyto podmínky kdykoli upravit nebo doplnit. Změny jsou účinné zveřejněním na tomto webu.\n </Text>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>10. Rozhodné právo</Heading>\n <Text color={textColor} mb={2}>\n Tyto podmínky se řídí právním řádem České republiky. Případné spory budou řešeny u příslušných soudů České republiky.\n </Text>\n <Text color={textColor}>\n Máteli dotazy, kontaktujte nás prostřednictvím stránky <Link href=\"/kontakt\" color=\"brand.primary\">Kontakt</Link>.\n </Text>\n </Box>\n </VStack>\n </Container>\n </MainLayout>\n );\n};\n\nexport default TermsPage;\n","// Simple palette extraction using Canvas API (no external deps)\n// Returns up to 5 representative colors as hex strings\nimport { API_URL } from '../services/api';\n\nexport async function extractPalette(imageUrl: string, maxColors = 12): Promise<string[]> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n try {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) return resolve([]);\n // Downscale for performance\n const targetW = 160; // slightly larger for better color sampling\n // Prefer naturalWidth/Height; fall back to width/height; if zero (e.g., some SVGs), assume square\n const iw = (img as HTMLImageElement).naturalWidth || (img as any).width || 0;\n const ih = (img as HTMLImageElement).naturalHeight || (img as any).height || 0;\n const ratio = (iw > 0 && ih > 0) ? (ih / iw) : 1;\n const w = targetW;\n const h = Math.max(1, Math.round(w * ratio));\n canvas.width = w;\n canvas.height = h;\n ctx.drawImage(img, 0, 0, w, h);\n const { data } = ctx.getImageData(0, 0, w, h);\n const map: Record<string, number> = {};\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const a = data[i + 3];\n if (a < 200) continue; // skip transparent\n // Slightly finer quantization to keep important hues\n const quant = 16;\n const rq = Math.round(r / quant) * quant;\n const gq = Math.round(g / quant) * quant;\n const bq = Math.round(b / quant) * quant;\n const key = `${rq},${gq},${bq}`;\n map[key] = (map[key] || 0) + 1;\n }\n const entries = Object.entries(map).sort((a, b) => b[1] - a[1]);\n // Merge very similar colors to increase distinctiveness\n const merged: Array<{ key: string; count: number }> = [];\n const colorDist = (a: number[], b: number[]) => Math.sqrt((a[0]-b[0])**2 + (a[1]-b[1])**2 + (a[2]-b[2])**2);\n for (const [k, cnt] of entries) {\n const [r, g, b] = k.split(',').map(Number);\n let found = false;\n for (const m of merged) {\n const [mr, mg, mb] = m.key.split(',').map(Number);\n if (colorDist([r,g,b],[mr,mg,mb]) < 24) {\n m.count += cnt;\n found = true;\n break;\n }\n }\n if (!found) merged.push({ key: k, count: cnt });\n }\n merged.sort((a,b) => b.count - a.count);\n const toHex = (n: number) => Math.max(0, Math.min(255, n)).toString(16).padStart(2, '0');\n const colors: string[] = merged.slice(0, maxColors).map(m => {\n const [r,g,b] = m.key.split(',').map(Number);\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n });\n // If palette is too uniform (e.g., many near-same colors), try to pick more varied ones by spacing selection\n if (colors.length > 1) {\n const unique: string[] = [];\n for (const c of colors) {\n const cr = parseInt(c.slice(1,3),16), cg = parseInt(c.slice(3,5),16), cb = parseInt(c.slice(5,7),16);\n if (!unique.some(u => {\n const ur = parseInt(u.slice(1,3),16), ug = parseInt(u.slice(3,5),16), ub = parseInt(u.slice(5,7),16);\n return colorDist([ur,ug,ub],[cr,cg,cb]) < 40;\n })) {\n unique.push(c);\n }\n if (unique.length >= maxColors) break;\n }\n if (unique.length) resolve(unique);\n else resolve(colors);\n } else {\n resolve(colors);\n }\n } catch (e) {\n resolve([]);\n }\n };\n img.onerror = () => resolve([]);\n // Route through backend (or proxy) to bypass CORS and handle root-relative URLs from backend\n try {\n // Derive backend origin from API_URL (which points to /api/v1)\n const api = new URL(API_URL);\n const backendOrigin = api.origin; // e.g., http://localhost:8080\n\n // If the URL is backend-relative (e.g., /uploads, /dist, /api), prefix with backend origin\n let candidate = imageUrl || '';\n if (candidate.startsWith('/uploads') || candidate.startsWith('/dist') || candidate.startsWith('/api/')) {\n candidate = backendOrigin + candidate;\n }\n\n const u = new URL(candidate, window.location.origin);\n const isData = u.protocol === 'data:';\n const sameOriginAsWindow = u.origin === window.location.origin;\n\n // Use direct URL only if it's same-origin with the window; otherwise proxy to enable CORS for Canvas\n if (isData || sameOriginAsWindow) {\n img.src = u.toString();\n } else {\n // Otherwise, use backend proxy to obtain CORS-eligible bytes for Canvas\n img.src = `${API_URL}/proxy/image?url=${encodeURIComponent(u.toString())}`;\n }\n } catch {\n // Fallback to original URL if parsing fails\n img.src = imageUrl;\n }\n });\n}\n\nexport function pickTextColor(bgHex: string): string {\n // YIQ contrast\n const hex = bgHex.replace('#', '');\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n const yiq = (r * 299 + g * 587 + b * 114) / 1000;\n return yiq >= 128 ? '#000000' : '#ffffff';\n}\n\n// WCAG contrast helpers\nfunction srgbToLinear(c: number): number {\n const v = c / 255;\n return v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n}\n\nfunction relLuminance(hex: string): number {\n const h = hex.replace('#', '');\n const r = parseInt(h.substring(0, 2), 16);\n const g = parseInt(h.substring(2, 4), 16);\n const b = parseInt(h.substring(4, 6), 16);\n const R = srgbToLinear(r);\n const G = srgbToLinear(g);\n const B = srgbToLinear(b);\n return 0.2126 * R + 0.7152 * G + 0.0722 * B;\n}\n\nexport function contrastRatio(hex1: string, hex2: string): number {\n try {\n const L1 = relLuminance(hex1);\n const L2 = relLuminance(hex2);\n const lighter = Math.max(L1, L2);\n const darker = Math.min(L1, L2);\n return (lighter + 0.05) / (darker + 0.05);\n } catch {\n return 1;\n }\n}\n\nexport function isContrastAccessible(hex1: string, hex2: string, level: 'AA' | 'AAA' = 'AA'): boolean {\n const ratio = contrastRatio(hex1, hex2);\n const threshold = level === 'AAA' ? 7 : 4.5; // normal text thresholds\n return ratio >= threshold;\n}\n\nexport function generateJwtSecret(length = 48): string {\n const bytes = new Uint8Array(length);\n window.crypto.getRandomValues(bytes);\n // Base64url encode\n const base64 = btoa(String.fromCharCode(...Array.from(bytes)));\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\n// --- Theme generation helpers ---\n\nfunction clamp01(x: number) { return Math.min(1, Math.max(0, x)); }\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } {\n const h = hex.replace('#', '');\n const r = parseInt(h.substring(0, 2), 16);\n const g = parseInt(h.substring(2, 4), 16);\n const b = parseInt(h.substring(4, 6), 16);\n return { r, g, b };\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n const toHex = (n: number) => Math.round(clamp01(n) * 255).toString(16).padStart(2, '0');\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nfunction lighten(hex: string, amt = 0.15): string {\n const { r, g, b } = hexToRgb(hex);\n return rgbToHex(r / 255 + amt, g / 255 + amt, b / 255 + amt);\n}\n\nfunction darken(hex: string, amt = 0.15): string {\n const { r, g, b } = hexToRgb(hex);\n return rgbToHex(r / 255 - amt, g / 255 - amt, b / 255 - amt);\n}\n\nexport function adjustForContrast(bg: string, preferredText?: string): { text: string; bg: string } {\n const text = preferredText || pickTextColor(bg);\n if (isContrastAccessible(bg, text, 'AA')) return { text, bg };\n // try darken/lighten background\n for (const amt of [0.1, 0.2, 0.3]) {\n const darker = darken(bg, amt);\n if (isContrastAccessible(darker, text, 'AA')) return { text, bg: darker };\n const lighter = lighten(bg, amt);\n if (isContrastAccessible(lighter, text, 'AA')) return { text, bg: lighter };\n }\n // fallback: flip text color\n const flipped = text === '#000000' ? '#ffffff' : '#000000';\n return { text: flipped, bg };\n}\n\nexport type ThemeCandidate = {\n name: string;\n primary: string;\n secondary: string;\n accent: string;\n background: string;\n text: string;\n};\n\n// Generate up to 5 theme candidates from extracted palette, tuned for readability.\nexport function generateThemeCandidates(palette: string[]): ThemeCandidate[] {\n const p = (palette || []).filter(Boolean);\n // Fallback palette\n const fallback = ['#0b5cff', '#ffd200', '#141414', '#ffffff'];\n\n // Helper: convert hex to HSL\n function hexToHsl(hex: string) {\n const { r, g, b } = hexToRgb(hex);\n const rn = r / 255, gn = g / 255, bn = b / 255;\n const max = Math.max(rn, gn, bn), min = Math.min(rn, gn, bn);\n let h = 0, s = 0, l = (max + min) / 2;\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case rn: h = (gn - bn) / d + (gn < bn ? 6 : 0); break;\n case gn: h = (bn - rn) / d + 2; break;\n case bn: h = (rn - gn) / d + 4; break;\n }\n h /= 6;\n }\n return { h, s, l };\n }\n\n // Choose a contrasting accent from palette relative to a base\n function pickAccent(base: string, arr: string[]) {\n if (!arr || arr.length === 0) return fallback[2];\n // pick color with highest contrast ratio against base\n let best = arr[0];\n let bestScore = contrastRatio(base, best);\n for (const c of arr) {\n const score = contrastRatio(base, c);\n if (score > bestScore) { bestScore = score; best = c; }\n }\n return best;\n }\n\n const candidates: ThemeCandidate[] = [];\n\n // Helper to push candidate and ensure accessibility\n const pushCandidate = (name: string, primary: string, secondary: string, accentColor: string, background: string) => {\n const { text } = adjustForContrast(background, '#111111');\n const fixed = adjustForContrast(background, text);\n candidates.push({ name, primary, secondary, accent: accentColor, background: fixed.bg, text: fixed.text });\n };\n\n // Prepare palette with fallbacks\n const usePalette = p.length ? p : fallback;\n\n // 1) Dominant: use most frequent as primary, next distinct as secondary\n const dominant = usePalette[0] || fallback[0];\n const nextDistinct = usePalette.find((c) => c.toLowerCase() !== dominant.toLowerCase()) || fallback[1];\n const accent1 = pickAccent(dominant, usePalette.slice(1)) || fallback[2];\n pushCandidate('Klasický', dominant, nextDistinct, accent1, '#ffffff');\n\n // 2) Vibrant: pick color with highest saturation as primary\n const withSat = usePalette.map((c) => ({ c, s: hexToHsl(c).s }));\n withSat.sort((a, b) => b.s - a.s);\n const vibrant = withSat[0]?.c || dominant;\n const vibrant2 = withSat[1]?.c || nextDistinct;\n const accent2 = pickAccent(vibrant, palette) || accent1;\n pushCandidate('Živý', vibrant, vibrant2, accent2, '#ffffff');\n\n // 3) Muted: pick a less-saturated or darker color for primary and a light background\n const muted = withSat.slice(-1)[0]?.c || usePalette[1] || fallback[1];\n const mutedSecondary = usePalette.find((c) => c !== muted) || usePalette[0] || fallback[1];\n const accent3 = pickAccent(muted, usePalette) || fallback[2];\n pushCandidate('Tlumený', muted, mutedSecondary, accent3, '#f8f9fb');\n\n // 4) Dark: primary = dominant, background dark\n const darkAccent = pickAccent('#0f1115', usePalette) || accent1;\n pushCandidate('Tmavý', dominant, nextDistinct, darkAccent, '#0f1115');\n\n // 5) Accent-forward: choose the most contrasting color overall as accent, keep primary neutral\n // Find color with highest average contrast to others\n let bestAccent = usePalette[0] || fallback[2];\n let bestScore = -1;\n for (const c of usePalette) {\n let sum = 0;\n for (const d of usePalette) sum += contrastRatio(c, d);\n if (sum > bestScore) { bestScore = sum; bestAccent = c; }\n }\n const accentForwardPrimary = dominant;\n const accentForwardSecondary = usePalette.find((c) => c !== bestAccent) || nextDistinct;\n pushCandidate('Akcentní', accentForwardPrimary, accentForwardSecondary, bestAccent, '#ffffff');\n\n return candidates;\n}\n","import api from './api';\nconst AI_TIMEOUT = Number(process.env.REACT_APP_AI_TIMEOUT_MS || '') || 90000;\n\nexport interface AIGenerateBlogReq {\n prompt: string;\n audience?: string;\n min_words?: number;\n model?: string;\n}\n\nexport interface AIGenerateBlogResp {\n title: string;\n slug: string;\n html: string;\n}\n\nexport async function generateBlogAI(payload: AIGenerateBlogReq): Promise<AIGenerateBlogResp> {\n const { data } = await api.post<AIGenerateBlogResp>('/ai/blog/generate', payload, { timeout: AI_TIMEOUT });\n \n // Handle potential JSON string response from AI (defensive parsing)\n let parsedData = data;\n if (typeof data === 'string') {\n try {\n parsedData = JSON.parse(data);\n } catch {\n throw new Error('AI vrátila neplatný formát odpovědi');\n }\n }\n \n return parsedData;\n}\n\n// Instagram generation\nexport interface AIGenerateInstagramMatch {\n home?: string;\n away?: string;\n competition?: string;\n date_time?: string;\n venue?: string;\n score?: string;\n}\n\nexport interface AIGenerateInstagramReq {\n type?: 'article' | 'event' | 'generic' | string;\n title?: string;\n content?: string;\n club_name?: string;\n link: string;\n hashtags?: string[];\n audience?: string;\n tone?: string;\n category?: string;\n match?: AIGenerateInstagramMatch | null;\n}\n\nexport interface AIGenerateInstagramResp { text: string }\n\nexport async function generateInstagramAI(payload: AIGenerateInstagramReq): Promise<AIGenerateInstagramResp> {\n const { data } = await api.post<AIGenerateInstagramResp>('/ai/instagram/generate', payload, { timeout: AI_TIMEOUT });\n let parsed: any = data;\n if (typeof parsed === 'string') {\n try { parsed = JSON.parse(parsed); } catch { parsed = { text: '' }; }\n }\n return parsed as AIGenerateInstagramResp;\n}\n\nexport interface AIGenerateInstagramImagesReq {\n prompt: string;\n aspect?: string;\n count?: number;\n}\n\nexport interface AIGenerateInstagramImagesResp {\n urls: string[];\n}\n\nexport async function generateInstagramImagesAI(payload: AIGenerateInstagramImagesReq): Promise<AIGenerateInstagramImagesResp> {\n const { data } = await api.post<AIGenerateInstagramImagesResp>('/ai/instagram/images', payload, { timeout: AI_TIMEOUT });\n let parsed: any = data;\n if (typeof parsed === 'string') {\n try { parsed = JSON.parse(parsed); } catch { parsed = { urls: [] }; }\n }\n return parsed as AIGenerateInstagramImagesResp;\n}\n\nexport interface AIGenerateMainImageReq {\n subject?: 'article' | 'event' | 'activity' | string;\n title: string;\n category?: string;\n club_name?: string;\n primary_color?: string;\n secondary_color?: string;\n}\n\nexport interface AIGenerateMainImageResp {\n url: string;\n}\n\nexport async function generateMainImageAI(payload: AIGenerateMainImageReq): Promise<AIGenerateMainImageResp> {\n const { data } = await api.post<AIGenerateMainImageResp>('/ai/main-image/generate', payload, { timeout: AI_TIMEOUT });\n let parsed: any = data;\n if (typeof parsed === 'string') {\n try { parsed = JSON.parse(parsed); } catch { parsed = { url: '' }; }\n }\n return parsed as AIGenerateMainImageResp;\n}\n\nexport interface AIGenerateCSSReq {\n prompt: string;\n element_name?: string;\n root_selector?: string;\n current_css?: string;\n current_styles?: Record<string, any>;\n theme?: Record<string, string>;\n breakpoints?: number[];\n context?: Record<string, any>;\n}\n\nexport interface AIGenerateCSSResp {\n css: string;\n}\n\nexport async function generateCSSAI(payload: AIGenerateCSSReq): Promise<AIGenerateCSSResp> {\n const { data } = await api.post<AIGenerateCSSResp>('/ai/css/generate', payload, { timeout: AI_TIMEOUT });\n let parsed = data as any;\n if (typeof parsed === 'string') {\n try { parsed = JSON.parse(parsed); } catch { parsed = { css: '' }; }\n }\n return parsed as AIGenerateCSSResp;\n}\n\nexport interface AIGenerateAboutReq {\n prompt: string;\n club_name?: string;\n style?: string;\n audience?: string;\n model?: string;\n}\n\nexport interface AIGenerateAboutResp {\n title: string;\n subtitle: string;\n html: string;\n seo_title: string;\n seo_description: string;\n}\n\nexport async function generateAboutAI(payload: AIGenerateAboutReq): Promise<AIGenerateAboutResp> {\n const { data } = await api.post<AIGenerateAboutResp>('/ai/about/generate', payload, { timeout: AI_TIMEOUT });\n \n // Handle potential JSON string response from AI (defensive parsing)\n let parsedData = data;\n if (typeof data === 'string') {\n try {\n parsedData = JSON.parse(data);\n } catch {\n throw new Error('AI vrátila neplatný formát odpovědi');\n }\n }\n \n return parsedData;\n}\n\nexport interface AIOCRReq {\n document_url?: string;\n image_url?: string;\n pages?: number[];\n model?: string;\n}\n\nexport interface AIOCRResp {\n text: string;\n}\n\nexport async function processOcrAI(payload: AIOCRReq): Promise<AIOCRResp> {\n const { data } = await api.post<AIOCRResp>('/ai/ocr/process', payload, { timeout: AI_TIMEOUT });\n let parsed: any = data;\n if (typeof parsed === 'string') {\n try { parsed = JSON.parse(parsed); } catch { parsed = { text: '' }; }\n }\n return parsed as AIOCRResp;\n}\n\nexport interface AITranscriptionReq {\n file_url?: string;\n file_id?: string;\n language?: string;\n model?: string;\n}\n\nexport interface AITranscriptionResp {\n text: string;\n language: string;\n}\n\nexport async function transcribeAudioAI(payload: AITranscriptionReq): Promise<AITranscriptionResp> {\n const { data } = await api.post<AITranscriptionResp>('/ai/voice/transcribe', payload, { timeout: AI_TIMEOUT });\n let parsed: any = data;\n if (typeof parsed === 'string') {\n try { parsed = JSON.parse(parsed); } catch { parsed = { text: '', language: '' }; }\n }\n return parsed as AITranscriptionResp;\n}\n\nexport interface AITestParseReq {\n raw: string;\n}\n\nexport interface AITestParseResp {\n sanitized: string;\n parsed?: any;\n error?: string;\n}\n\nexport async function testAIParse(payload: AITestParseReq): Promise<AITestParseResp> {\n const { data } = await api.post<AITestParseResp>('/ai/test-parse', payload, { timeout: AI_TIMEOUT });\n return data;\n}\n","import api, { API_URL } from './api';\n\nexport interface ZoneramaPhoto {\n id: string;\n page_url: string;\n image_1500?: string;\n title?: string;\n}\n\nexport interface ZoneramaAlbumResp {\n album: { id?: string; title?: string; url?: string };\n photos: ZoneramaPhoto[];\n}\n\nexport interface ZoneramaPickPayload {\n id: string;\n album_id?: string;\n album_url: string;\n page_url?: string;\n image_url: string;\n title?: string;\n}\n\nexport async function getZoneramaAlbum(link: string, opts: { photo_limit?: number; rendered?: boolean } = {}): Promise<ZoneramaAlbumResp> {\n const params: any = { link };\n if (typeof opts.photo_limit === 'number') params.photo_limit = String(opts.photo_limit);\n if (typeof opts.rendered === 'boolean') params.rendered = String(opts.rendered);\n const res = await api.get<ZoneramaAlbumResp>('/zonerama/album', { params });\n return res.data as any;\n}\n\nexport async function getZoneramaPicks(): Promise<ZoneramaPickPayload[]> {\n const res = await api.get<ZoneramaPickPayload[]>('/zonerama/picks');\n return Array.isArray(res.data) ? res.data : [] as any;\n}\n\nexport async function putZoneramaPick(payload: ZoneramaPickPayload): Promise<{ ok: boolean; count: number }> {\n const res = await api.post<{ ok: boolean; count: number }>('/admin/zonerama/pick', payload);\n return res.data;\n}\n\nexport interface ZoneramaAlbumData {\n id: string;\n title: string;\n url: string;\n date: string;\n photos_count: number;\n views_count?: number;\n photos: ZoneramaPhoto[];\n fetched_at?: string;\n}\n\nexport async function saveAlbumToCache(albumLink: string, photoLimit: number = 50): Promise<ZoneramaAlbumData> {\n const res = await api.post<ZoneramaAlbumData>('/admin/zonerama/save-album', {\n link: albumLink,\n photo_limit: photoLimit\n });\n return res.data;\n}\n\n// Helper to read the flat manifest produced by the prefetcher for fast grid rendering\nexport async function getZoneramaManifest(): Promise<Array<{ id: string; album_id: string; src: string; local: string; page_url: string }>> {\n let origin = '';\n try {\n const assetBase = (process.env.REACT_APP_ASSET_BASE_URL || '').trim();\n if (assetBase) {\n origin = new URL(assetBase, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n }\n } catch {}\n if (!origin) {\n try {\n origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n } catch {}\n }\n // New unified path for prefetched Zonerama items\n const url = `${origin}/cache/prefetch/zonerama_flat.json`;\n const res = await fetch(url, { cache: 'no-cache' });\n if (!res.ok) return [];\n try {\n const json = await res.json();\n if (Array.isArray(json)) return json as any;\n return [];\n } catch {\n return [];\n }\n}\n\n// More robust loader that tries multiple sources for prefetched items\nexport async function getZoneramaManifestWithFallbacks(): Promise<Array<{ id: string; album_id: string; src: string; local: string; page_url: string }>> {\n // 1) Try the main manifest\n const primary = await getZoneramaManifest();\n if (primary && primary.length > 0) return primary;\n\n let origin = '';\n try {\n const assetBase = (process.env.REACT_APP_ASSET_BASE_URL || '').trim();\n if (assetBase) {\n origin = new URL(assetBase, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n }\n } catch {}\n if (!origin) {\n try {\n origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n } catch {}\n }\n\n // 1b) Backward-compat removed - old path no longer used to avoid 404 errors\n\n // 2) Try unified controller JSON (one JSON to control all prefetched albums)\n try {\n const ctrlUrl = `${origin}/cache/prefetch/zonerama_albums.json`;\n const resCtrl = await fetch(ctrlUrl, { cache: 'no-cache' });\n if (resCtrl.ok) {\n const json = await resCtrl.json();\n // Expect shape: { albums: [{ id, page_url, cover_local, cover_src, items: [...] }], items?: [...] }\n const items = Array.isArray(json?.items) ? json.items : [];\n const flatFromCtrl = items.map((it: any) => ({\n id: String(it.id || it.photo_id || ''),\n album_id: String(it.album_id || ''),\n src: String(it.src || it.image_url || ''),\n local: String(it.local || it.local_url || it.image_local || ''),\n page_url: String(it.page_url || it.url || ''),\n }));\n if (flatFromCtrl.length > 0) return flatFromCtrl;\n }\n } catch { /* ignore */ }\n\n // 2b) Try zonerama_profile.json which contains the actual gallery data\n try {\n const profileUrl = `${origin}/cache/prefetch/zonerama_profile.json`;\n const resProfile = await fetch(profileUrl, { cache: 'no-cache' });\n if (resProfile.ok) {\n const json = await resProfile.json();\n // Expect shape: { albums: [{ id, date, photos: [{ id, image_1500, page_url }] }] }\n if (json?.albums && Array.isArray(json.albums)) {\n const flatFromProfile = [];\n for (const album of json.albums) {\n if (album.photos && Array.isArray(album.photos)) {\n for (const photo of album.photos) {\n flatFromProfile.push({\n id: String(photo.id || ''),\n album_id: String(album.id || ''),\n src: String(photo.image_1500 || ''),\n local: String(photo.image_1500 || ''),\n page_url: String(photo.page_url || ''),\n });\n }\n }\n }\n if (flatFromProfile.length > 0) return flatFromProfile;\n }\n }\n } catch { /* ignore */ }\n\n // 3) Fall back to picks endpoint if available (admin saves picks)\n try {\n const picks = await getZoneramaPicks();\n const mapped = picks.map((p) => ({\n id: String(p.id),\n album_id: String(p.album_id || ''),\n src: String(p.image_url),\n local: String(p.image_url),\n page_url: String(p.page_url || p.album_url || ''),\n }));\n return mapped;\n } catch { /* ignore */ }\n\n return [];\n}\n","import {\n AlertDialog,\n AlertDialogBody,\n AlertDialogContent,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogOverlay,\n Button,\n useDisclosure,\n useToast,\n} from '@chakra-ui/react';\nimport { useRef } from 'react';\n\ninterface ConfirmationDialogProps {\n isOpen: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title: string;\n message: string;\n confirmText?: string;\n cancelText?: string;\n isDanger?: boolean;\n isLoading?: boolean;\n}\n\nexport default function ConfirmationDialog({\n isOpen,\n onClose,\n onConfirm,\n title,\n message,\n confirmText = 'Potvrdit',\n cancelText = 'Zrušit',\n isDanger = false,\n isLoading = false,\n}: ConfirmationDialogProps) {\n const cancelRef = useRef<HTMLButtonElement>(null);\n\n const handleConfirm = () => {\n onConfirm();\n };\n\n return (\n <AlertDialog\n isOpen={isOpen}\n leastDestructiveRef={cancelRef}\n onClose={onClose}\n isCentered\n >\n <AlertDialogOverlay>\n <AlertDialogContent>\n <AlertDialogHeader fontSize=\"lg\" fontWeight=\"bold\">\n {title}\n </AlertDialogHeader>\n\n <AlertDialogBody>{message}</AlertDialogBody>\n\n <AlertDialogFooter>\n <Button \n ref={cancelRef} \n onClick={onClose}\n isDisabled={isLoading}\n >\n {cancelText}\n </Button>\n <Button\n colorScheme={isDanger ? 'red' : 'blue'}\n onClick={handleConfirm}\n ml={3}\n isLoading={isLoading}\n loadingText=\"Zpracovávám...\"\n >\n {confirmText}\n </Button>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialogOverlay>\n </AlertDialog>\n );\n}\n","import React, { useEffect, useMemo, useRef, useState, startTransition, useDeferredValue } from 'react';\nimport {\n Box,\n Button,\n FormControl,\n FormLabel,\n Input,\n NumberInput,\n NumberInputField,\n Select,\n SimpleGrid,\n HStack,\n VStack,\n Heading,\n Divider,\n Image,\n useToast,\n Text,\n Switch,\n Badge,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalCloseButton,\n ModalBody,\n ModalFooter,\n useDisclosure,\n Tabs,\n TabList,\n TabPanels,\n Tab,\n TabPanel,\n useColorModeValue,\n AlertDialog,\n AlertDialogOverlay,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogBody,\n AlertDialogFooter,\n} from '@chakra-ui/react';\nimport { CopyIcon } from '@chakra-ui/icons';\nimport AdminLayout from '@/layouts/AdminLayout';\nimport ScoreboardPreview from '@/components/scoreboard/ScoreboardPreview';\nimport ColorPicker from '@/components/common/ColorPicker';\nimport { HelpTooltipCard } from '@/components/common/HelpTooltipCard';\nimport UploadPanel, { UploadPanelFile } from '@/components/common/UploadPanel';\nimport {\n getScoreboardState,\n saveScoreboardState,\n updateAdminScoreboard,\n ScoreboardState,\n deriveShort,\n derivePrimaryFromLogo,\n ScoreboardTheme,\n resetTimer,\n listPresets,\n savePreset,\n loadPreset,\n listSponsorsAdmin,\n uploadSponsors,\n deleteSponsor,\n prefillSponsorsFromPage,\n getQr,\n uploadQr,\n deleteQr,\n} from '@/services/scoreboard';\nimport { useFacrApi } from '@/hooks/useFacrApi';\nimport { SearchResult } from '@/services/facr/types';\nimport { API_URL } from '@/services/api';\nimport { useQuery } from '@tanstack/react-query';\nimport { AdminMatch, fetchAdminMatches, fetchTeamLogoOverrides } from '@/services/adminMatches';\nimport { getFacrClubInfoCache } from '@/services/facr/cache';\nimport { createSponsor } from '@/services/sponsors';\n\nconst themes: ScoreboardTheme[] = ['classic', 'pill', 'var1', 'var2', 'var3', 'var4'];\n\nconst resolveLogoUrl = (u?: string | null) => {\n if (!u) return undefined;\n if (u.startsWith('/uploads') || u.startsWith('/dist') || u.startsWith('/api/')) return u;\n if (/^https?:\\/\\//i.test(u)) {\n const base = (API_URL || '').replace(/\\/$/, '');\n return `${base}/proxy/image?url=${encodeURIComponent(u)}`;\n }\n return u;\n};\n\nconst toAbsoluteUploadUrl = (u?: string | null) => {\n try {\n if (!u) return u || undefined;\n const base = new URL(API_URL || '', typeof window !== 'undefined' ? window.location.origin : undefined);\n const origin = `${base.protocol}//${base.host}`;\n return u.startsWith('/uploads/') ? (origin + u) : u;\n } catch {\n return u || undefined;\n }\n};\n\nconst deproxify = (u?: string | null) => {\n try {\n if (!u) return u || undefined;\n const base = new URL(API_URL || '', typeof window !== 'undefined' ? window.location.origin : undefined);\n const parsed = new URL(u, base.origin);\n if (/\\/proxy\\/image$/i.test(parsed.pathname)) {\n const inner = parsed.searchParams.get('url');\n return inner || u || undefined;\n }\n return u || undefined;\n } catch {\n return u || undefined;\n }\n};\n\nconst ScoreboardAdminPage: React.FC = () => {\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const inputBg = useColorModeValue('white', 'gray.700');\n const [state, setState] = useState<ScoreboardState | null>(null);\n const [loading, setLoading] = useState(true);\n // Local draft colors for smooth dragging - use refs to avoid re-renders\n const primaryDraftRef = useRef<string>(state?.primaryColor || '#1e3a8a');\n const secondaryDraftRef = useRef<string>(state?.secondaryColor || '#2563eb');\n const homeTextDraftRef = useRef<string>(state?.homeTextColor || '#ffffff');\n const awayTextDraftRef = useRef<string>(state?.awayTextColor || '#ffffff');\n const [primaryDraft, setPrimaryDraft] = useState<string>(state?.primaryColor || '#1e3a8a');\n const [secondaryDraft, setSecondaryDraft] = useState<string>(state?.secondaryColor || '#2563eb');\n const [homeTextDraft, setHomeTextDraft] = useState<string>(state?.homeTextColor || '#ffffff');\n const [awayTextDraft, setAwayTextDraft] = useState<string>(state?.awayTextColor || '#ffffff');\n const toast = useToast();\n const [activeTab, setActiveTab] = useState<number>(0); // 0 upcoming, 1 recent\n // Presets & sponsors state\n const [presets, setPresets] = useState<string[]>([]);\n const [presetName, setPresetName] = useState('');\n const [sponsors, setSponsors] = useState<string[]>([]);\n const [qrUrl, setQrUrl] = useState<string>('');\n const { isOpen: isSponsorModalOpen, onOpen: openSponsorModal, onClose: closeSponsorModal } = useDisclosure();\n const [uploadedSponsorUrls, setUploadedSponsorUrls] = useState<string[]>([]);\n const [uploadedNewSponsors, setUploadedNewSponsors] = useState<Array<{ url: string; urlAbs: string; name: string; website: string }>>([]);\n const [isBulkDeleting, setIsBulkDeleting] = useState(false);\n const { isOpen: isBulkDeleteOpen, onOpen: openBulkDelete, onClose: closeBulkDelete } = useDisclosure();\n const cancelBulkRef = useRef<HTMLButtonElement | null>(null);\n const [addingSponsors, setAddingSponsors] = useState(false);\n const [isPickingColor, setIsPickingColor] = useState(false);\n const deferredState = useDeferredValue(state);\n const previewState = useMemo(() => {\n // Use refs for instant preview during dragging, fallback to state\n const base = deferredState || state;\n if (!base) return null;\n return {\n ...base,\n primaryColor: primaryDraftRef.current || base.primaryColor || '#1e3a8a',\n secondaryColor: secondaryDraftRef.current || base.secondaryColor || '#2563eb',\n homeTextColor: homeTextDraftRef.current || base.homeTextColor || '#ffffff',\n awayTextColor: awayTextDraftRef.current || base.awayTextColor || '#ffffff',\n } as ScoreboardState;\n }, [deferredState, state]);\n const saveDebounceRef = useRef<number | undefined>(undefined);\n const pendingPatchRef = useRef<Partial<ScoreboardState>>({});\n const setPartialDebounced = (patch: Partial<ScoreboardState>) => {\n startTransition(() => {\n setState((prev) => ({ ...(prev as ScoreboardState), ...patch }));\n });\n pendingPatchRef.current = { ...pendingPatchRef.current, ...patch };\n if (saveDebounceRef.current) {\n window.clearTimeout(saveDebounceRef.current);\n }\n saveDebounceRef.current = window.setTimeout(async () => {\n const toSave = pendingPatchRef.current;\n pendingPatchRef.current = {};\n saveDebounceRef.current = undefined;\n try {\n const next = await saveScoreboardState(toSave);\n setState(next);\n } catch {}\n }, 250);\n };\n\n // For performance-sensitive inputs (color pickers): queue save, but don't re-render immediately on every drag\n const queueSaveOnly = (patch: Partial<ScoreboardState>) => {\n pendingPatchRef.current = { ...pendingPatchRef.current, ...patch };\n if (saveDebounceRef.current) {\n window.clearTimeout(saveDebounceRef.current);\n }\n saveDebounceRef.current = window.setTimeout(() => {\n const toSave = pendingPatchRef.current;\n pendingPatchRef.current = {};\n saveDebounceRef.current = undefined;\n // Update UI immediately (non-urgent) without waiting for network\n startTransition(() => {\n setState((prev) => ({ ...(prev as ScoreboardState), ...toSave }));\n });\n // Persist asynchronously; ignore result to avoid blocking UI\n try { void saveScoreboardState(toSave); } catch {}\n }, 250);\n };\n\n // Commit any draft color values (called on pointer up/blur)\n const commitDraftColors = () => {\n if (!state) return;\n const patch: Partial<ScoreboardState> = {\n primaryColor: primaryDraftRef.current || state.primaryColor || '#1e3a8a',\n secondaryColor: secondaryDraftRef.current || state.secondaryColor || '#2563eb',\n homeTextColor: homeTextDraftRef.current || state.homeTextColor || '#ffffff',\n awayTextColor: awayTextDraftRef.current || state.awayTextColor || '#ffffff',\n };\n queueSaveOnly(patch);\n // Sync state displays with refs after commit\n setPrimaryDraft(primaryDraftRef.current);\n setSecondaryDraft(secondaryDraftRef.current);\n setHomeTextDraft(homeTextDraftRef.current);\n setAwayTextDraft(awayTextDraftRef.current);\n };\n\n // Club search inline (home/away target)\n const [clubQuery, setClubQuery] = useState('');\n const [assignTo, setAssignTo] = useState<'home' | 'away'>('home');\n const { searchClubs, searchResults, searchLoading, searchError } = useFacrApi();\n\n useEffect(() => {\n (async () => {\n const s = await getScoreboardState();\n setState(s);\n setLoading(false);\n // load presets & sponsors lists\n try { setPresets(await listPresets()); } catch {}\n try { setSponsors(await listSponsorsAdmin()); } catch {}\n try { setQrUrl(await getQr()); } catch {}\n })();\n }, []);\n\n const uploadSponsorFile = async (file: File): Promise<UploadPanelFile> => {\n const res = await uploadSponsors([file]);\n const rels = (res?.files || []).filter(Boolean) as string[];\n if (rels.length > 0) {\n const items = rels.map((rel) => {\n const abs = toAbsoluteUploadUrl(rel) as string;\n const baseName = (rel.split('/').pop() || '').replace(/\\.[a-z0-9]+$/i, '');\n return { url: rel, urlAbs: abs, name: baseName, website: '' };\n });\n setUploadedSponsorUrls((prev) => [\n ...prev,\n ...rels.map((u) => toAbsoluteUploadUrl(u) as string),\n ]);\n setUploadedNewSponsors((prev) => [...prev, ...items]);\n if (!isSponsorModalOpen) {\n openSponsorModal();\n }\n }\n try {\n setSponsors(await listSponsorsAdmin());\n } catch {}\n const rel = rels[0] || '';\n const abs = rel ? (toAbsoluteUploadUrl(rel) as string) : undefined;\n return {\n url: abs || rel || '',\n name: file.name,\n type: file.type || 'image/*',\n size: file.size,\n };\n };\n\n const uploadQrFile = async (file: File): Promise<UploadPanelFile> => {\n await uploadQr(file);\n const url = await getQr();\n setQrUrl(url);\n return {\n url: url || '',\n name: file.name,\n type: file.type || 'image/*',\n size: file.size,\n };\n };\n\n useEffect(() => {\n if (!state) return;\n if (isPickingColor) return;\n // Update both refs and state when colors change from external sources\n primaryDraftRef.current = state.primaryColor || '#1e3a8a';\n secondaryDraftRef.current = state.secondaryColor || '#2563eb';\n homeTextDraftRef.current = state.homeTextColor || '#ffffff';\n awayTextDraftRef.current = state.awayTextColor || '#ffffff';\n setPrimaryDraft(primaryDraftRef.current);\n setSecondaryDraft(secondaryDraftRef.current);\n setHomeTextDraft(homeTextDraftRef.current);\n setAwayTextDraft(awayTextDraftRef.current);\n }, [state?.primaryColor, state?.secondaryColor, state?.homeTextColor, state?.awayTextColor, isPickingColor]);\n\n useEffect(() => {\n return () => {\n if (saveDebounceRef.current) {\n window.clearTimeout(saveDebounceRef.current);\n saveDebounceRef.current = undefined;\n }\n pendingPatchRef.current = {};\n };\n }, []);\n\n // Polling is handled by React Query refetchInterval in the useQuery below\n\n // Load matches for linking\n const { data: adminMatches = [] } = useQuery<AdminMatch[]>({\n queryKey: ['admin-matches'],\n queryFn: fetchAdminMatches,\n staleTime: 60_000,\n });\n\n // Load team overrides (names + logos)\n const { data: teamOverrides = {} } = useQuery<any>({\n queryKey: ['team-logo-overrides-admin'],\n queryFn: fetchTeamLogoOverrides,\n staleTime: 5 * 60 * 1000,\n });\n const byId: Record<string, { name?: string; logo_url?: string }> = (teamOverrides as any)?.by_id || {};\n const byNameMap: Record<string, string> = (teamOverrides as any)?.by_name || {} as Record<string, string>;\n const normName = (s?: string) => String(s || '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[\\u2012\\u2013\\u2014\\u2015\\u2212]/g, '-')\n .replace(/\\bn\\.?\\b/g, ' nad ')\n .replace(/\\bp\\.?\\b/g, ' pod ')\n .replace(/[\\,\\s]*(z\\.?\\s*s\\.?|o\\.?\\s*s\\.?)\\s*$/g, '')\n .replace(/[\\.,!;:()\\[\\]{}]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\n const aliasNameIndex = React.useMemo(() => {\n const urlToName: Record<string, string> = {};\n for (const v of Object.values(byId || {})) {\n const nm = String((v as any)?.name || '').trim();\n const lg = String((v as any)?.logo_url || '').trim();\n if (nm && lg) urlToName[lg] = nm;\n }\n const idx: Record<string, string> = {};\n for (const [alias, url] of Object.entries(byNameMap || {})) {\n const canon = urlToName[String(url)] || '';\n const key = normName(alias);\n if (canon && key) idx[key] = canon;\n }\n return idx;\n }, [byId, byNameMap]);\n const nameIndex = React.useMemo(() => {\n const idx: Record<string, { id: string; name: string; logo_url: string }> = {};\n try {\n for (const [id, v] of Object.entries(byId || {})) {\n const nm = String((v as any)?.name || '').trim();\n const lg = String((v as any)?.logo_url || '').trim();\n if (!nm) continue;\n const key = normName(nm);\n if (!key) continue;\n idx[key] = { id, name: nm, logo_url: lg } as any;\n }\n } catch {}\n return idx;\n }, [byId]);\n const getOverrideName = (teamName?: string, teamId?: string) => {\n const tid = teamId ? String(teamId) : '';\n if (tid && byId?.[tid]?.name && String(byId[tid].name).trim()) {\n return String(byId[tid].name).trim();\n }\n try {\n const n = normName(teamName);\n if (aliasNameIndex[n]) return aliasNameIndex[n];\n let hit: any = nameIndex[n];\n if (!hit) {\n for (const [k, v] of Object.entries(nameIndex)) {\n if (!k) continue;\n if (n.endsWith(k) || k.endsWith(n)) { hit = v; break; }\n }\n }\n if (hit && (hit as any).name) return String((hit as any).name);\n } catch {}\n return String(teamName || '');\n };\n const getLogo = (teamName?: string, original?: string) => {\n const byName = (teamOverrides as any)?.by_name || {} as Record<string, string>;\n const norm = (s: string) => String(s || '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\n const stripPrefixes = (s: string) => {\n let x = norm(s);\n x = x.replace(/\\b(mestsky|m\\.?f\\.?k\\.?|mfk|tj|sk|sokol|fotbalovy|fotbalový|fotbalovy\\s+klub|fotbalovy\\s+klub)\\b/g, '');\n return x.replace(/\\s+/g, ' ').trim();\n };\n const byNameNorm: Record<string, string> = Object.keys(byName || {}).reduce((acc: Record<string, string>, k) => { acc[norm(k)] = byName[k]; return acc; }, {});\n const strippedPairs = Object.keys(byName || {}).map((k) => ({ key: stripPrefixes(k), url: byName[k] }));\n const pick = (name?: string, orig?: string) => {\n if (!name) return orig;\n const exact = byName[name];\n let candidate = exact || byNameNorm[norm(name)];\n if (!candidate) {\n const s = stripPrefixes(name);\n for (const { key, url } of strippedPairs) { if (key && (s.endsWith(key) || key.endsWith(s))) { candidate = url; break; } }\n }\n return candidate || orig;\n };\n return pick(teamName, original);\n };\n\n // Load competitions/matches from cached FACR blob\n const { data: facrCache } = useQuery<any>({\n queryKey: ['facr-club-info-cache'],\n queryFn: getFacrClubInfoCache,\n staleTime: 600_000, // Increased from 120_000 to 600_000 (10 minutes)\n refetchInterval: 600_000, // Increased from 120_000 to 600_000 (10 minutes)\n });\n\n // Normalize matches from FACR cache to AdminMatch-ish shape\n const facrMatches: AdminMatch[] = useMemo(() => {\n const out: AdminMatch[] = [];\n try {\n const comps = facrCache?.competitions || [];\n for (const c of comps) {\n const cname = String(c?.name || c?.code || '').trim();\n const matches = c?.matches || [];\n for (const m of matches) {\n out.push({\n match_id: m?.match_id || m?.id || '',\n id: m?.match_id || m?.id || '',\n home: m?.home || '',\n away: m?.away || '',\n date_time: m?.date_time || m?.kickoff || '',\n home_logo_url: m?.home_logo_url || '',\n away_logo_url: m?.away_logo_url || '',\n competition: cname,\n league: cname,\n });\n }\n }\n } catch {}\n return out;\n }, [facrCache]);\n\n // Build competition list from both sources\n const competitions = React.useMemo(() => {\n const set = new Set<string>();\n for (const m of adminMatches) {\n const comp = String(m.competition || m.league || '').trim();\n if (comp) set.add(comp);\n }\n for (const m of facrMatches) {\n const comp = String((m as any).competition || (m as any).league || '').trim();\n if (comp) set.add(comp);\n }\n return ['Vše', ...Array.from(set)];\n }, [adminMatches, facrMatches]);\n\n const [compFilter, setCompFilter] = useState<string>('Vše');\n const [matchQuery, setMatchQuery] = useState('');\n\n const parsedMatches = React.useMemo(() => {\n const parseTs = (m: AdminMatch) => {\n const dt = String(m.date_time || m.date || '').slice(0, 16);\n // Accept RFC3339 or \"YYYY-MM-DD HH:MM\"\n let t = Date.parse(dt);\n if (isNaN(t) && dt.includes(' ')) {\n t = Date.parse(dt.replace(' ', 'T') + ':00');\n }\n return t;\n };\n const now = Date.now();\n let list: AdminMatch[] = [...(adminMatches || []), ...facrMatches];\n if (compFilter && compFilter !== 'Vše') {\n list = list.filter((m) => String((m as any).competition || (m as any).league || '').trim() === compFilter);\n }\n if (matchQuery.trim()) {\n const q = matchQuery.trim().toLowerCase();\n list = list.filter((m) =>\n String(m.home || '').toLowerCase().includes(q) ||\n String(m.away || '').toLowerCase().includes(q) ||\n String((m as any).competition || (m as any).league || '').toLowerCase().includes(q)\n );\n }\n const withTs = list.map((m) => ({ m, ts: parseTs(m) }));\n const upcoming = withTs\n .filter((x) => typeof x.ts === 'number' && !isNaN(x.ts) && x.ts >= now)\n .sort((a, b) => a.ts - b.ts)\n .map((x) => x.m);\n const recent = withTs\n .filter((x) => typeof x.ts === 'number' && !isNaN(x.ts) && x.ts < now)\n .sort((a, b) => b.ts - a.ts)\n .map((x) => x.m);\n return { upcoming, recent };\n }, [adminMatches, facrMatches, compFilter, matchQuery]);\n\n useEffect(() => {\n const q = clubQuery.trim();\n if (!q) return;\n const t = setTimeout(() => {\n searchClubs(q).catch(() => {});\n }, 400);\n return () => clearTimeout(t);\n }, [clubQuery, searchClubs]);\n\n const setPartial = async (patch: Partial<ScoreboardState>) => {\n const next = await saveScoreboardState(patch);\n setState(next);\n };\n\n const applyMatch = async (m: AdminMatch) => {\n if (!state) return;\n // Populate names, logos and short codes\n const rawHomeName = String(m.home || (m as any).home_team || '').trim();\n const rawAwayName = String(m.away || (m as any).away_team || '').trim();\n const homeTeamId = String((m as any).home_id || (m as any).homeTeamId || (m as any).home_team_id || '');\n const awayTeamId = String((m as any).away_id || (m as any).awayTeamId || (m as any).away_team_id || '');\n const homeName = getOverrideName(rawHomeName, homeTeamId) || rawHomeName;\n const awayName = getOverrideName(rawAwayName, awayTeamId) || rawAwayName;\n // Prefer ID-based logo override, then name-based, then original logo URL\n const homeLogoRaw = (homeTeamId && byId?.[homeTeamId]?.logo_url)\n ? String(byId[homeTeamId].logo_url)\n : getLogo(rawHomeName, m.home_logo_url || (m as any).homeLogoURL || '');\n const awayLogoRaw = (awayTeamId && byId?.[awayTeamId]?.logo_url)\n ? String(byId[awayTeamId].logo_url)\n : getLogo(rawAwayName, m.away_logo_url || (m as any).awayLogoURL || '');\n const homeLogo = homeLogoRaw || '';\n const awayLogo = awayLogoRaw || '';\n const updates: Partial<ScoreboardState> = {\n homeName,\n awayName,\n homeShort: deriveShort(homeName),\n awayShort: deriveShort(awayName),\n homeLogo: homeLogo || state.homeLogo,\n awayLogo: awayLogo || state.awayLogo,\n externalMatchId: String(m.match_id || m.id || ''),\n };\n // Try to detect colors from logos\n const [cHome, cAway] = await Promise.all([\n derivePrimaryFromLogo(deproxify(homeLogo || state.homeLogo)),\n derivePrimaryFromLogo(deproxify(awayLogo || state.awayLogo)),\n ]);\n if (cHome) updates.primaryColor = cHome;\n if (cAway) updates.secondaryColor = cAway;\n const next = await saveScoreboardState(updates);\n setState(next);\n toast({ title: 'Zápas vybrán', description: 'Základní údaje byly předvyplněny.', status: 'success' });\n };\n\n const applyClub = async (club: SearchResult) => {\n const logoRaw = club.logo_url || undefined;\n const color = await derivePrimaryFromLogo(deproxify(logoRaw) || undefined);\n if (assignTo === 'home') {\n await setPartial({\n homeName: club.name || 'DOMÁCÍ',\n homeShort: deriveShort(club.name || ''),\n homeLogo: logoRaw,\n primaryColor: color || state?.primaryColor,\n });\n } else {\n await setPartial({\n awayName: club.name || 'HOSTÉ',\n awayShort: deriveShort(club.name || ''),\n awayLogo: logoRaw,\n secondaryColor: color || state?.secondaryColor,\n });\n }\n toast({ title: `Nastaveno pro ${assignTo === 'home' ? 'domácí' : 'hosty'}`, status: 'success' });\n };\n\n if (loading || !state || !previewState) return (\n <AdminLayout requireAdmin={false}>\n <Box>Načítání…</Box>\n </AdminLayout>\n );\n\n return (\n <AdminLayout requireAdmin={false}>\n <Box>\n <Heading size=\"lg\" mb={2}>Tabule (Scoreboard)</Heading>\n <Text color=\"gray.500\" mb={2}>Napojte tabuli na konkrétní zápas a ovládejte skóre v reálném čase. Pokud je tabule propojená se zápasem, propisujeme živé skóre i do veřejné homepage.</Text>\n <HStack spacing={3} mb={4}>\n <Badge colorScheme=\"green\">OBS</Badge>\n {(() => { const href = (typeof window !== 'undefined' ? window.location.origin.replace(/\\/$/, '') : '') + '/overlay/scoreboard'; return (\n <>\n <HelpTooltipCard\n label=\"Jak použít overlay\"\n title=\"Použití scoreboard overlay v OBS\"\n items={[\n 'V OBS přidejte nový Browser Source a vložte sem uvedenou URL overlaye.',\n 'Doporučená šířka zdroje je 1920 px, pozadí zůstává průhledné nad přenosem.',\n 'Overlay je veřejný sdílejte URL jen s lidmi, kteří spravují přenos a výsledky.',\n ]}\n />\n <Button as=\"a\" href={href} target=\"_blank\" rel=\"noreferrer\">Otevřít overlay</Button>\n <HStack spacing={2}>\n <Text fontSize=\"sm\" color=\"gray.500\">Veřejná URL pro OBS: {href}</Text>\n <Button size=\"sm\" leftIcon={<CopyIcon />} onClick={() => { try { navigator.clipboard.writeText(href); } catch (_) {} }}>Kopírovat</Button>\n </HStack>\n </>\n ); })()}\n </HStack>\n\n {/* Match linking (initial element) */}\n <Box borderWidth=\"1px\" borderRadius=\"lg\" p={4} bg={cardBg} mb={6}>\n <Heading size=\"md\" mb={3}>Napojení na zápas (FAČR)</Heading>\n <SimpleGrid columns={{ base: 1, md: 3 }} spacing={3} mb={3}>\n <FormControl>\n <FormLabel>Soutěž</FormLabel>\n <Select value={compFilter} onChange={(e) => setCompFilter(e.target.value)}>\n {competitions.map((c) => (<option key={c} value={c}>{c}</option>))}\n </Select>\n </FormControl>\n <FormControl>\n <FormLabel>Hledat zápas</FormLabel>\n <Input placeholder=\"Hledat podle názvu týmu nebo soutěže\" value={matchQuery} onChange={(e)=>setMatchQuery(e.target.value)} />\n </FormControl>\n <FormControl display=\"flex\" alignItems=\"center\">\n <FormLabel mb={0}>Napojení</FormLabel>\n {state?.externalMatchId ? <Badge ml={3} colorScheme=\"blue\">Zápas: {state.externalMatchId}</Badge> : <Badge ml={3}>Bez zápasu</Badge>}\n </FormControl>\n </SimpleGrid>\n\n <Tabs index={activeTab} onChange={setActiveTab} variant=\"enclosed\" size=\"sm\">\n <TabList>\n <Tab>Nadcházející</Tab>\n <Tab>Nedávné</Tab>\n </TabList>\n <TabPanels>\n <TabPanel px={0}>\n <VStack align=\"stretch\" spacing={2} maxH=\"320px\" overflowY=\"auto\">\n {parsedMatches.upcoming.map((m) => {\n const homeLogo = getLogo(String(m.home), m.home_logo_url || (m as any).homeLogoURL || '');\n return (\n <HStack key={`${m.match_id || m.id}`} spacing={3} p={2} borderWidth=\"1px\" borderRadius=\"md\" _hover={{ bg: 'gray.50' }}>\n {homeLogo ? <Image src={resolveLogoUrl(homeLogo)} alt={String(m.home)} boxSize=\"28px\" objectFit=\"contain\" /> : null}\n <Text fontWeight=\"semibold\">{String(m.home)} vs {String(m.away)}</Text>\n <Badge ml=\"auto\">{String(m.date_time || m.date || '').slice(0,16).replace('T',' ')}</Badge>\n <Button size=\"sm\" onClick={() => applyMatch(m)}>Vybrat zápas</Button>\n </HStack>\n );\n })}\n </VStack>\n </TabPanel>\n <TabPanel px={0}>\n <VStack align=\"stretch\" spacing={2} maxH=\"320px\" overflowY=\"auto\">\n {parsedMatches.recent.map((m) => {\n const homeLogo = getLogo(String(m.home), m.home_logo_url || (m as any).homeLogoURL || '');\n return (\n <HStack key={`${m.match_id || m.id}`} spacing={3} p={2} borderWidth=\"1px\" borderRadius=\"md\" _hover={{ bg: 'gray.50' }}>\n {homeLogo ? <Image src={resolveLogoUrl(homeLogo)} alt={String(m.home)} boxSize=\"28px\" objectFit=\"contain\" /> : null}\n <Text fontWeight=\"semibold\">{String(m.home)} vs {String(m.away)}</Text>\n <Badge ml=\"auto\" colorScheme=\"purple\">{String(m.date_time || m.date || '').slice(0,16).replace('T',' ')}</Badge>\n <Button size=\"sm\" variant=\"outline\" onClick={() => applyMatch(m)}>Vybrat zápas</Button>\n </HStack>\n );\n })}\n </VStack>\n </TabPanel>\n </TabPanels>\n </Tabs>\n\n <HStack mt={3}>\n <Button\n variant=\"ghost\"\n onClick={async () => {\n const next = await saveScoreboardState({ externalMatchId: '' });\n setState(next);\n toast({ title: 'Odpojeno', description: 'Tabule odpojena od zápasu.', status: 'info' });\n }}\n >Odpojit od zápasu</Button>\n </HStack>\n </Box>\n\n {/* Live preview */}\n <Box display=\"flex\" justifyContent=\"center\" mb={6}>\n <ScoreboardPreview state={previewState as ScoreboardState} />\n </Box>\n\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={6}>\n <Box>\n <Heading size=\"md\" mb={3}>Základní údaje</Heading>\n <SimpleGrid columns={2} spacing={4}>\n <FormControl>\n <FormLabel>Domácí tým</FormLabel>\n <Input\n value={state.homeName}\n onChange={async (e) => {\n const v = e.target.value;\n await setPartial({ homeName: v, homeShort: state.homeShort?.trim() ? state.homeShort : deriveShort(v) });\n }}\n />\n </FormControl>\n <FormControl>\n <FormLabel>Zkratka domácích</FormLabel>\n <Input\n value={state.homeShort || ''}\n maxLength={3}\n onChange={async (e) => {\n await setPartial({ homeShort: e.target.value.toUpperCase().slice(0,3) });\n }}\n />\n </FormControl>\n <FormControl>\n <FormLabel>Hostující tým</FormLabel>\n <Input\n value={state.awayName}\n onChange={async (e) => {\n const v = e.target.value;\n await setPartial({ awayName: v, awayShort: state.awayShort?.trim() ? state.awayShort : deriveShort(v) });\n }}\n />\n </FormControl>\n <FormControl>\n <FormLabel>Zkratka hostů</FormLabel>\n <Input\n value={state.awayShort || ''}\n maxLength={3}\n onChange={async (e) => {\n await setPartial({ awayShort: e.target.value.toUpperCase().slice(0,3) });\n }}\n />\n </FormControl>\n <FormControl>\n <FormLabel>Logo domácích (URL)</FormLabel>\n <Input\n value={state.homeLogo || ''}\n onChange={async (e) => {\n await setPartial({ homeLogo: e.target.value });\n }}\n />\n </FormControl>\n <FormControl>\n <FormLabel>Logo hostů (URL)</FormLabel>\n <Input\n value={state.awayLogo || ''}\n onChange={async (e) => {\n await setPartial({ awayLogo: e.target.value });\n }}\n />\n </FormControl>\n <FormControl>\n <FormLabel>Délka poločasu (min)</FormLabel>\n <NumberInput value={state.halfLength} min={1} max={60} onChange={async (_, n) => setPartial({ halfLength: Number.isFinite(n) ? n : 45 })}>\n <NumberInputField />\n </NumberInput>\n </FormControl>\n <FormControl>\n <FormLabel>Styl</FormLabel>\n <Select value={state.theme} onChange={async (e) => setPartial({ theme: e.target.value as ScoreboardTheme })}>\n {themes.map((t) => (\n <option key={t} value={t}>{t}</option>\n ))}\n </Select>\n </FormControl>\n <FormControl>\n <FormLabel>Poločas</FormLabel>\n <Select value={String(state.half || 1)} onChange={async (e) => setPartial({ half: parseInt(e.target.value, 10) || 1 })}>\n <option value=\"1\">1</option>\n <option value=\"2\">2</option>\n </Select>\n </FormControl>\n </SimpleGrid>\n </Box>\n\n <Box>\n <Heading size=\"md\" mb={3} color=\"black\">Barvy a vyhledání klubu</Heading>\n <SimpleGrid columns={2} spacing={4}>\n <FormControl>\n <FormLabel>Barva domácích</FormLabel>\n <ColorPicker\n value={primaryDraft}\n showAlpha\n onChange={(hex) => {\n // Update ref for instant preview, state for display\n primaryDraftRef.current = hex;\n setPrimaryDraft(hex);\n }}\n onChangeComplete={(hex) => {\n primaryDraftRef.current = hex;\n setPrimaryDraft(hex);\n commitDraftColors();\n }}\n recentStorageKey=\"scoreboard-primary\"\n onInteractionStart={() => setIsPickingColor(true)}\n onInteractionEnd={() => setIsPickingColor(false)}\n />\n </FormControl>\n <FormControl>\n <FormLabel>Barva hostů</FormLabel>\n <ColorPicker\n value={secondaryDraft}\n showAlpha\n onChange={(hex) => {\n // Update ref for instant preview, state for display\n secondaryDraftRef.current = hex;\n setSecondaryDraft(hex);\n }}\n onChangeComplete={(hex) => {\n secondaryDraftRef.current = hex;\n setSecondaryDraft(hex);\n commitDraftColors();\n }}\n recentStorageKey=\"scoreboard-secondary\"\n onInteractionStart={() => setIsPickingColor(true)}\n onInteractionEnd={() => setIsPickingColor(false)}\n />\n </FormControl>\n <FormControl>\n <FormLabel>Barva textu domácích</FormLabel>\n <ColorPicker\n value={homeTextDraft}\n showAlpha\n onChange={(hex) => {\n // Update ref for instant preview, state for display\n homeTextDraftRef.current = hex;\n setHomeTextDraft(hex);\n }}\n onChangeComplete={(hex) => {\n homeTextDraftRef.current = hex;\n setHomeTextDraft(hex);\n commitDraftColors();\n }}\n recentStorageKey=\"scoreboard-home-text\"\n onInteractionStart={() => setIsPickingColor(true)}\n onInteractionEnd={() => setIsPickingColor(false)}\n />\n </FormControl>\n <FormControl>\n <FormLabel>Barva textu hostů</FormLabel>\n <ColorPicker\n value={awayTextDraft}\n showAlpha\n onChange={(hex) => {\n // Update ref for instant preview, state for display\n awayTextDraftRef.current = hex;\n setAwayTextDraft(hex);\n }}\n onChangeComplete={(hex) => {\n awayTextDraftRef.current = hex;\n setAwayTextDraft(hex);\n commitDraftColors();\n }}\n recentStorageKey=\"scoreboard-away-text\"\n onInteractionStart={() => setIsPickingColor(true)}\n onInteractionEnd={() => setIsPickingColor(false)}\n />\n </FormControl>\n <FormControl>\n <FormLabel>QR interval (minuty)</FormLabel>\n <NumberInput value={state.qrEvery || 5} min={1} max={120} onChange={async (_, n) => setPartial({ qrEvery: Math.max(1, Number.isFinite(n) ? n : 5) })}>\n <NumberInputField />\n </NumberInput>\n </FormControl>\n <FormControl>\n <FormLabel>QR délka zobrazení (sekundy)</FormLabel>\n <NumberInput value={state.qrDuration || 60} min={5} max={600} onChange={async (_, n) => setPartial({ qrDuration: Math.max(5, Number.isFinite(n) ? n : 60) })}>\n <NumberInputField />\n </NumberInput>\n </FormControl>\n </SimpleGrid>\n\n <Divider my={4} />\n <HStack spacing={3} align=\"flex-start\">\n <Select value={assignTo} onChange={(e) => setAssignTo((e.target.value as 'home'|'away') || 'home')} maxW=\"160px\">\n <option value=\"home\">Nastavit domácí</option>\n <option value=\"away\">Nastavit hosty</option>\n </Select>\n <Input placeholder=\"Hledat klub (FAČR)\" value={clubQuery} onChange={(e) => setClubQuery(e.target.value)} />\n <Button isLoading={searchLoading} onClick={() => clubQuery.trim() && searchClubs(clubQuery.trim())}>Hledat</Button>\n </HStack>\n {searchError ? (\n <Text color=\"red.500\" mt={2}>Chyba vyhledávání: {searchError.message}</Text>\n ) : null}\n <VStack align=\"stretch\" spacing={2} mt={3} maxH=\"260px\" overflowY=\"auto\">\n {searchResults?.slice(0, 8).map((r) => (\n <HStack key={`${r.club_type}-${r.club_id}`} spacing={3} p={2} borderWidth=\"1px\" borderRadius=\"md\" _hover={{ bg: 'gray.50' }} cursor=\"pointer\" onClick={() => applyClub(r)}>\n {r.logo_url ? <Image src={resolveLogoUrl(r.logo_url)} alt={r.name} boxSize=\"28px\" objectFit=\"contain\" /> : null}\n <Box>\n <Text fontWeight=\"medium\" color=\"black\">{r.name}</Text>\n <Text fontSize=\"sm\" color=\"black\">{r.club_type}</Text>\n </Box>\n </HStack>\n ))}\n </VStack>\n </Box>\n </SimpleGrid>\n\n <Divider my={6} />\n\n <HStack spacing={3}>\n <Button variant=\"outline\" onClick={() => setPartial({ homeScore: 0, awayScore: 0 })}>Reset skóre</Button>\n <Button variant=\"outline\" onClick={async () => { await resetTimer(); const s = await getScoreboardState(); setState(s); }}>Reset čas</Button>\n <Button variant=\"outline\" onClick={() => setPartial({ homeFouls: 0, awayFouls: 0 })}>Reset fauly</Button>\n </HStack>\n\n <Divider my={6} />\n\n {/* Časovač ovládá pouze mobilní ovladač. Na této stránce ponechány pouze reset akce. */}\n\n <Box borderWidth=\"1px\" borderRadius=\"lg\" p={4} bg={cardBg} mb={6}>\n <Heading size=\"md\" mb={3}>Sponzoři (overlay)</Heading>\n {(() => { const href = (typeof window !== 'undefined' ? window.location.origin.replace(/\\/$/, '') : '') + '/overlay/sponsors'; return (\n <HStack spacing={3} mb={3}>\n <Badge colorScheme=\"green\">OBS</Badge>\n <Button as=\"a\" href={href} target=\"_blank\" rel=\"noreferrer\">Otevřít overlay sponzoři</Button>\n <Text fontSize=\"sm\" color=\"gray.500\">Veřejná URL: {href}</Text>\n </HStack>\n ); })()}\n <HStack spacing={3} mb={3} align=\"flex-start\">\n <Box flex=\"1\">\n <UploadPanel\n label=\"Nahrát loga\"\n description=\"Nahrajte loga sponzorů pro overlay v přenosu.\"\n accept=\"image/*,image/svg+xml\"\n multiple\n maxFiles={50}\n uploadFn={uploadSponsorFile}\n allowUrlImport={false}\n />\n </Box>\n <VStack align=\"stretch\" spacing={2} minW=\"180px\">\n <Button variant=\"ghost\" onClick={async ()=>{ try { setSponsors(await listSponsorsAdmin()); toast({ title: 'Seznam aktualizován', status: 'info' }); } catch {} }}>Obnovit</Button>\n <Button variant=\"outline\" onClick={async ()=>{\n try {\n const res = await prefillSponsorsFromPage();\n setSponsors(await listSponsorsAdmin());\n toast({ title: 'Předvyplněno ze Sponzorů', description: `Přidáno ${res?.saved || 0} log`, status: 'success' });\n } catch (e:any) {\n toast({ title: 'Předvyplnění selhalo', description: e?.message, status: 'error' });\n }\n }}>Předvyplnit ze stránky Sponzoři</Button>\n <Button colorScheme=\"red\" variant=\"outline\" isDisabled={!sponsors.length} onClick={openBulkDelete}>Smazat vše</Button>\n </VStack>\n </HStack>\n <SimpleGrid columns={{ base: 2, md: 4, lg: 6 }} spacing={3}>\n {sponsors.map((u) => {\n const name = (u || '').split('/').pop() || '';\n return (\n <VStack key={u} spacing={2} borderWidth=\"1px\" borderRadius=\"md\" p={2}>\n <Image src={u} alt={name} boxSize=\"64px\" objectFit=\"contain\" />\n <Text fontSize=\"xs\" noOfLines={1} maxW=\"120px\">{name}</Text>\n <Button size=\"xs\" colorScheme=\"red\" variant=\"ghost\" onClick={async ()=>{ try { await deleteSponsor(name); setSponsors(await listSponsorsAdmin()); toast({ title: 'Smazáno', status: 'success' }); } catch { toast({ title: 'Smazání selhalo', status: 'error' }); } }}>Smazat</Button>\n </VStack>\n );\n })}\n </SimpleGrid>\n </Box>\n\n {/* Modal: Add uploaded logos as sponsors */}\n <Modal isOpen={isSponsorModalOpen} onClose={closeSponsorModal} size=\"lg\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Přidat loga jako sponzory?</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <Text mb={3}>Vyplňte název a (volitelně) web pro každé nahrané logo. Záznamy bez názvu budou přeskočeny.</Text>\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={4}>\n {uploadedNewSponsors.map((it, idx) => (\n <VStack key={it.urlAbs} align=\"stretch\" spacing={2} borderWidth=\"1px\" borderRadius=\"md\" p={3}>\n <Image src={it.urlAbs} alt=\"logo\" boxSize=\"64px\" objectFit=\"contain\" />\n <FormControl>\n <FormLabel>Název</FormLabel>\n <Input value={it.name} onChange={(e)=>{\n const v = e.target.value;\n setUploadedNewSponsors((prev) => prev.map((x,i) => i===idx ? { ...x, name: v } : x));\n }} />\n </FormControl>\n <FormControl>\n <FormLabel>Web (https://…)</FormLabel>\n <Input value={it.website} onChange={(e)=>{\n const v = e.target.value;\n setUploadedNewSponsors((prev) => prev.map((x,i) => i===idx ? { ...x, website: v } : x));\n }} />\n </FormControl>\n </VStack>\n ))}\n </SimpleGrid>\n </ModalBody>\n <ModalFooter>\n <Button mr={3} onClick={closeSponsorModal}>Ne</Button>\n <Button colorScheme=\"blue\" isLoading={addingSponsors} onClick={async ()=>{\n try {\n setAddingSponsors(true);\n for (const it of uploadedNewSponsors) {\n const name = (it.name || '').trim();\n if (!name) continue;\n try {\n await createSponsor({ name, logo_url: it.url, website_url: (it.website || '').trim() || undefined, is_active: true });\n } catch {}\n }\n toast({ title: 'Sponzoři přidáni', status: 'success' });\n } finally {\n setAddingSponsors(false);\n closeSponsorModal();\n setUploadedSponsorUrls([]);\n setUploadedNewSponsors([]);\n }\n }}>Ano, přidat</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n {/* Bulk delete confirm */}\n <AlertDialog isOpen={isBulkDeleteOpen} leastDestructiveRef={cancelBulkRef} onClose={closeBulkDelete}>\n <AlertDialogOverlay>\n <AlertDialogContent>\n <AlertDialogHeader>Smazat všechna loga?</AlertDialogHeader>\n <AlertDialogBody>\n Tato akce odstraní všechna nahraná loga pro overlay sponzorů. Operaci nelze vrátit zpět.\n </AlertDialogBody>\n <AlertDialogFooter>\n <Button ref={cancelBulkRef} onClick={closeBulkDelete} mr={3}>Zrušit</Button>\n <Button colorScheme=\"red\" isLoading={isBulkDeleting} onClick={async ()=>{\n try {\n setIsBulkDeleting(true);\n const current = [...sponsors];\n for (const u of current) {\n const name = (u || '').split('/').pop() || '';\n if (!name) continue;\n try { await deleteSponsor(name); } catch {}\n }\n setSponsors(await listSponsorsAdmin());\n toast({ title: 'Všechna loga smazána', status: 'success' });\n } finally {\n setIsBulkDeleting(false);\n closeBulkDelete();\n }\n }}>Smazat vše</Button>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialogOverlay>\n </AlertDialog>\n\n <Box borderWidth=\"1px\" borderRadius=\"lg\" p={4} bg={cardBg} mb={6}>\n <Heading size=\"md\" mb={3}>QR kód</Heading>\n <HStack spacing={4} align=\"flex-start\" flexWrap=\"wrap\">\n <VStack align=\"start\" spacing={2}>\n <Text fontSize=\"sm\" color=\"gray.500\">Aktuální QR:</Text>\n {qrUrl ? (\n <Image src={qrUrl} alt=\"QR\" boxSize=\"128px\" objectFit=\"contain\" borderWidth=\"1px\" borderRadius=\"md\" />\n ) : (\n <Text fontSize=\"sm\" color=\"gray.400\">Nenahrán</Text>\n )}\n </VStack>\n <Box maxW=\"360px\" flex=\"1\">\n <UploadPanel\n label=\"Nahrát QR\"\n description=\"Nahrajte obrázek QR kódu pro scoreboard.\"\n accept=\"image/*\"\n multiple={false}\n maxFiles={1}\n uploadFn={uploadQrFile}\n allowUrlImport={false}\n />\n </Box>\n <Button variant=\"ghost\" onClick={async ()=>{ try { setQrUrl(await getQr()); toast({ title: 'Obnoveno', status: 'info' }); } catch {} }}>Obnovit</Button>\n <Button variant=\"outline\" colorScheme=\"red\" isDisabled={!qrUrl} onClick={async ()=>{\n try { await deleteQr(); setQrUrl(''); toast({ title: 'QR smazán', status: 'info' }); } catch { toast({ title: 'Smazání selhalo', status: 'error' }); }\n }}>Smazat QR</Button>\n </HStack>\n </Box>\n\n <Box borderWidth=\"1px\" borderRadius=\"lg\" p={4} bg={cardBg} mb={6}>\n <Heading size=\"md\" mb={3}>Presety</Heading>\n <HStack spacing={3} align=\"center\" flexWrap=\"wrap\" mb={3}>\n <Input placeholder=\"Název presetu (např. derby-2025)\"\n value={presetName}\n onChange={(e)=>setPresetName(e.target.value)}\n maxW=\"260px\" />\n <Button onClick={async ()=>{ try { await savePreset(presetName); setPresets(await listPresets()); setPresetName(''); toast({ title: 'Preset uložen', status: 'success' }); } catch (e:any){ toast({ title: 'Uložení selhalo', description: e?.message, status: 'error' }); } }}>Uložit preset</Button>\n </HStack>\n <HStack spacing={3} align=\"center\" flexWrap=\"wrap\">\n <Select placeholder=\"Vyberte preset\" maxW=\"260px\" onChange={(e)=>setPresetName(e.target.value)} value={presetName}>\n {presets.map((p)=> (<option key={p} value={p}>{p}</option>))}\n </Select>\n <Button variant=\"outline\" onClick={async ()=>{ if (!presetName) { toast({ title: 'Vyberte preset', status: 'warning' }); return; } try { await loadPreset(presetName); setState(await getScoreboardState()); toast({ title: 'Preset načten', status: 'success' }); } catch (e:any){ toast({ title: 'Načtení selhalo', description: e?.message, status: 'error' }); } }}>Načíst preset</Button>\n <Button variant=\"ghost\" onClick={async ()=>{ try { setPresets(await listPresets()); toast({ title: 'Seznam aktualizován', status: 'info' }); } catch {} }}>Obnovit</Button>\n </HStack>\n </Box>\n\n <Heading size=\"md\" mb={3}>Import / Export</Heading>\n <HStack spacing={4} align=\"center\" flexWrap=\"wrap\">\n <Button\n onClick={() => {\n try {\n const blob = new Blob([JSON.stringify(state, null, 2)], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'scoreboard-state.json';\n a.click();\n URL.revokeObjectURL(url);\n } catch (e) {\n toast({ title: 'Export selhal', status: 'error' });\n }\n }}\n >Exportovat JSON</Button>\n <Button as=\"label\">\n Importovat JSON\n <Input type=\"file\" accept=\"application/json\" display=\"none\" onChange={async (e) => {\n try {\n const f = e.target.files?.[0];\n if (!f) return;\n const text = await f.text();\n const data = JSON.parse(text);\n // Patch via admin API when possible\n await updateAdminScoreboard(data);\n setState(await getScoreboardState());\n toast({ title: 'Import dokončen', status: 'success' });\n } catch (err: any) {\n toast({ title: 'Import selhal', description: err?.message || 'Neplatný soubor', status: 'error' });\n } finally {\n try { if (e.target) (e.target as HTMLInputElement).value = ''; } catch {}\n }\n }} />\n </Button>\n </HStack>\n\n <Divider my={8} />\n <Heading size=\"md\" mb={2}>Návod k použití (CZ)</Heading>\n <VStack align=\"start\" spacing={2} color=\"gray.700\">\n <Text>1) V horní části vyberte soutěž, případně vyhledejte zápas podle názvu týmu. Klikněte na „Vybrat zápas“.</Text>\n <Text>2) Pole „Domácí/Hosté“, loga a zkratky se předvyplní. Barvy se pokusíme odhadnout z log.</Text>\n <Text>3) Skóre upravujte tlačítky níže nebo ručním zadáním. Změny se ukládají průběžně.</Text>\n <Text>4) Jakmile je tabule propojená se zápasem, živé skóre se propisuje do veřejné homepage (nejbližší zápas) a do JSON cache.</Text>\n <Text>5) Přepněte vzhled tabule (styl) dle potřeby. Pro přenos do streamu použijte veřejnou adresu /overlay/scoreboard.</Text>\n <Text>Tip: Při importu JSON použijte předchozí export, formát je kompatibilní.</Text>\n </VStack>\n </Box>\n </AdminLayout>\n );\n};\n\nexport default ScoreboardAdminPage;\n","import { api } from '../api';\n\nexport interface ContactMessage {\n id: string;\n name: string;\n email: string;\n subject?: string;\n message: string;\n source?: string;\n ipAddress?: string;\n userAgent?: string;\n isRead: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ContactMessagesResponse {\n data: ContactMessage[];\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n}\n\nexport const getContactMessages = async (params?: {\n page?: number;\n limit?: number;\n search?: string;\n isRead?: boolean;\n sortBy?: string;\n sortOrder?: 'asc' | 'desc';\n}): Promise<ContactMessagesResponse> => {\n // Backend returns { data: ContactMessage[], pagination: { total, page, limit, pages, has_more } }\n const response = await api.get<{ data: ContactMessage[]; pagination: { total: number; page: number; limit: number; pages: number } }>(\n '/admin/contact-messages',\n { params }\n );\n const r = response.data;\n // Normalize possible snake_case fields coming from backend to camelCase expected by UI\n const normalized = (r.data as any[]).map((m) => ({\n id: String(m.id),\n name: m.name,\n email: m.email,\n subject: m.subject,\n message: m.message,\n source: m.source,\n ipAddress: m.ipAddress ?? m.ip_address,\n userAgent: m.userAgent ?? m.user_agent,\n isRead: m.isRead ?? m.is_read ?? false,\n createdAt: m.createdAt ?? m.created_at,\n updatedAt: m.updatedAt ?? m.updated_at,\n })) as ContactMessage[];\n return {\n data: normalized,\n total: r.pagination.total,\n page: r.pagination.page,\n limit: r.pagination.limit,\n totalPages: r.pagination.pages,\n };\n};\n\nexport const getContactMessage = async (id: string) => {\n // Backend returns the message object directly\n const response = await api.get<ContactMessage>(`/admin/contact-messages/${id}`);\n return response.data;\n};\n\nexport const markAsRead = async (id: string) => {\n // Backend returns only a message string; caller doesn't need data\n await api.patch(\n `/admin/contact-messages/${id}/read`,\n { isRead: true }\n );\n};\n\nexport const deleteMessage = async (id: string) => {\n await api.delete(`/admin/contact-messages/${id}`);\n};\n\nexport const deleteMultipleMessages = async (ids: Array<string | number>) => {\n // Backend expects a raw JSON array []int in the body. Convert to numbers.\n const numericIds = ids.map((v) => (typeof v === 'string' ? Number(v) : v));\n await api.delete('/admin/contact-messages', { data: numericIds });\n};\n\nexport const forwardMessage = async (id: string, toEmail: string) => {\n await api.post(`/admin/contact-messages/${id}/forward`, { to_email: toEmail });\n};\n\nexport const forwardAllMessages = async (\n emails: string | string[],\n options?: { saveDefault?: boolean }\n) => {\n let payload: any = {};\n if (Array.isArray(emails)) {\n const arr = emails.map((e) => String(e || '').trim()).filter(Boolean);\n payload = arr.length > 1 ? { to_emails: arr } : { to_email: arr[0] || '' };\n } else {\n const parts = String(emails || '')\n .split(/[;\\,\\s]+/)\n .map((s) => s.trim())\n .filter(Boolean);\n payload = parts.length > 1 ? { to_emails: parts } : { to_email: parts[0] || '' };\n }\n if (options?.saveDefault) {\n payload.save_default = true;\n }\n const response = await api.post('/admin/contact-messages/forward-all', payload);\n return response.data;\n};\n","import { Button, HStack, Text } from '@chakra-ui/react';\nimport { ChevronLeftIcon, ChevronRightIcon } from '@chakra-ui/icons';\n\ninterface PaginationProps {\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n maxVisiblePages?: number;\n}\n\nexport default function Pagination({\n currentPage,\n totalPages,\n onPageChange,\n maxVisiblePages = 5,\n}: PaginationProps) {\n if (totalPages <= 1) return null;\n\n const getPageNumbers = () => {\n const pages = [];\n let startPage = Math.max(1, currentPage - Math.floor(maxVisiblePages / 2));\n const endPage = Math.min(totalPages, startPage + maxVisiblePages - 1);\n\n if (endPage - startPage + 1 < maxVisiblePages) {\n startPage = Math.max(1, endPage - maxVisiblePages + 1);\n }\n\n for (let i = startPage; i <= endPage; i++) {\n pages.push(i);\n }\n\n return pages;\n };\n\n const pages = getPageNumbers();\n\n return (\n <HStack spacing={1}>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => onPageChange(currentPage - 1)}\n isDisabled={currentPage === 1}\n aria-label=\"Předchozí stránka\"\n >\n <ChevronLeftIcon />\n </Button>\n\n {!pages.includes(1) && (\n <>\n <Button\n size=\"sm\"\n variant={currentPage === 1 ? 'solid' : 'outline'}\n onClick={() => onPageChange(1)}\n >\n 1\n </Button>\n {!pages.includes(2) && <Text>...</Text>}\n </>\n )}\n\n {pages.map((page) => (\n <Button\n key={page}\n size=\"sm\"\n variant={currentPage === page ? 'solid' : 'outline'}\n colorScheme={currentPage === page ? 'blue' : 'gray'}\n onClick={() => onPageChange(page)}\n aria-current={currentPage === page ? 'page' : undefined}\n >\n {page}\n </Button>\n ))}\n\n {!pages.includes(totalPages) && (\n <>\n {!pages.includes(totalPages - 1) && <Text>...</Text>}\n <Button\n size=\"sm\"\n variant={currentPage === totalPages ? 'solid' : 'outline'}\n onClick={() => onPageChange(totalPages)}\n >\n {totalPages}\n </Button>\n </>\n )}\n\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => onPageChange(currentPage + 1)}\n isDisabled={currentPage === totalPages}\n aria-label=\"Další stránka\"\n >\n <ChevronRightIcon />\n </Button>\n </HStack>\n );\n}\n","import {\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalFooter,\n ModalBody,\n ModalCloseButton,\n Button,\n VStack,\n Text,\n Divider,\n HStack,\n Badge,\n useClipboard,\n useToast,\n Box,\n Input,\n FormControl,\n FormLabel,\n useDisclosure,\n Popover,\n PopoverTrigger,\n PopoverContent,\n PopoverHeader,\n PopoverBody,\n PopoverArrow,\n PopoverCloseButton,\n} from '@chakra-ui/react';\nimport { EmailIcon, CopyIcon, CheckIcon, DeleteIcon, ArrowForwardIcon } from '@chakra-ui/icons';\nimport { useState } from 'react';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { forwardMessage } from '../../services/admin/contactMessages';\nimport { format } from 'date-fns';\nimport { cs } from 'date-fns/locale';\n\ninterface MessageDetailModalProps {\n isOpen: boolean;\n onClose: () => void;\n message: {\n id: string;\n name: string;\n email: string;\n subject?: string;\n message: string;\n source?: string;\n ipAddress?: string;\n userAgent?: string;\n isRead: boolean;\n createdAt: string;\n };\n onDelete: () => void;\n onMarkAsRead: () => void;\n}\n\nexport default function MessageDetailModal({\n isOpen,\n onClose,\n message,\n onDelete,\n onMarkAsRead,\n}: MessageDetailModalProps) {\n const toast = useToast();\n const queryClient = useQueryClient();\n const { hasCopied, onCopy } = useClipboard(message.email);\n const { isOpen: isPopoverOpen, onOpen: onPopoverOpen, onClose: onPopoverClose } = useDisclosure();\n const [forwardEmail, setForwardEmail] = useState('');\n\n const formatDate = (dateString: string) => {\n return format(new Date(dateString), 'd. M. yyyy HH:mm', { locale: cs });\n };\n\n const handleCopyEmail = () => {\n onCopy();\n toast({\n title: 'E-mail zkopírován do schránky',\n status: 'success',\n duration: 2000,\n isClosable: true,\n });\n };\n\n const forwardMutation = useMutation({\n mutationFn: (toEmail: string) => forwardMessage(message.id, toEmail),\n onSuccess: () => {\n toast({\n title: 'Zpráva přeposílána',\n description: `Zpráva bude odeslána na ${forwardEmail}`,\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n setForwardEmail('');\n onPopoverClose();\n },\n onError: () => {\n toast({\n title: 'Chyba',\n description: 'Nepodařilo se přeposlat zprávu',\n status: 'error',\n duration: 3000,\n isClosable: true,\n });\n },\n });\n\n const handleForward = () => {\n if (!forwardEmail || !forwardEmail.includes('@')) {\n toast({\n title: 'Chyba',\n description: 'Zadejte platnou e-mailovou adresu',\n status: 'error',\n duration: 3000,\n });\n return;\n }\n forwardMutation.mutate(forwardEmail);\n };\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} size=\"xl\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>\n <Box>\n <Text fontSize=\"lg\" fontWeight=\"bold\">\n {message.subject || 'Bez předmětu'}\n </Text>\n <HStack mt={1} fontSize=\"sm\" color=\"gray.500\">\n <Text>{formatDate(message.createdAt)}</Text>\n {!message.isRead && (\n <Badge colorScheme=\"blue\">\n Nová zpráva\n </Badge>\n )}\n {message.source && (\n <Badge colorScheme={message.source === 'sponsor' ? 'purple' : 'gray'}>\n {message.source === 'sponsor' ? 'Sponzor' : 'Kontakt'}\n </Badge>\n )}\n </HStack>\n </Box>\n </ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack align=\"stretch\" spacing={4}>\n <Box>\n <Text fontWeight=\"bold\" mb={1}>\n Od:\n </Text>\n <HStack>\n <Text>{message.name}</Text>\n <HStack\n as=\"button\"\n onClick={handleCopyEmail}\n color=\"blue.500\"\n _hover={{ textDecoration: 'underline' }}\n spacing={1}\n >\n <Text>&lt;{message.email}&gt;</Text>\n {hasCopied ? (\n <CheckIcon boxSize={3} />\n ) : (\n <CopyIcon boxSize={3} />\n )}\n </HStack>\n </HStack>\n </Box>\n\n <Divider />\n\n <Box>\n <Text fontWeight=\"bold\" mb={2}>\n Zpráva:\n </Text>\n <Text whiteSpace=\"pre-wrap\" p={3} bg=\"gray.50\" borderRadius=\"md\">\n {message.message}\n </Text>\n </Box>\n\n {(message.ipAddress || message.userAgent) && (\n <Box mt={4} fontSize=\"sm\" color=\"gray.500\">\n <Text fontWeight=\"bold\" mb={1}>\n Technické informace:\n </Text>\n {message.ipAddress && (\n <Text>\n <Text as=\"span\" fontWeight=\"medium\">IP adresa:</Text>{' '}\n {message.ipAddress}\n </Text>\n )}\n {message.userAgent && (\n <Text mt={1} isTruncated title={message.userAgent}>\n <Text as=\"span\" fontWeight=\"medium\">Prohlížeč:</Text>{' '}\n {message.userAgent.length > 50\n ? `${message.userAgent.substring(0, 47)}...`\n : message.userAgent}\n </Text>\n )}\n </Box>\n )}\n </VStack>\n </ModalBody>\n\n <ModalFooter>\n <HStack spacing={2} flexWrap=\"wrap\" justify=\"flex-end\" w=\"full\">\n <Button\n variant=\"outline\"\n colorScheme=\"red\"\n leftIcon={<DeleteIcon />}\n onClick={onDelete}\n size={{ base: \"sm\", md: \"md\" }}\n >\n Smazat\n </Button>\n \n <Popover isOpen={isPopoverOpen} onClose={onPopoverClose}>\n <PopoverTrigger>\n <Button\n colorScheme=\"teal\"\n leftIcon={<ArrowForwardIcon />}\n onClick={onPopoverOpen}\n size={{ base: \"sm\", md: \"md\" }}\n >\n Přeposlat\n </Button>\n </PopoverTrigger>\n <PopoverContent>\n <PopoverArrow />\n <PopoverCloseButton />\n <PopoverHeader>Přeposlat zprávu</PopoverHeader>\n <PopoverBody>\n <VStack spacing={3}>\n <FormControl>\n <FormLabel fontSize=\"sm\">E-mailová adresa</FormLabel>\n <Input\n placeholder=\"prijemce@email.cz\"\n value={forwardEmail}\n onChange={(e) => setForwardEmail(e.target.value)}\n type=\"email\"\n size=\"sm\"\n />\n </FormControl>\n <Button\n size=\"sm\"\n colorScheme=\"teal\"\n width=\"full\"\n onClick={handleForward}\n isLoading={forwardMutation.isLoading}\n >\n Odeslat\n </Button>\n </VStack>\n </PopoverBody>\n </PopoverContent>\n </Popover>\n \n {!message.isRead && (\n <Button\n colorScheme=\"blue\"\n leftIcon={<EmailIcon />}\n onClick={onMarkAsRead}\n size={{ base: \"sm\", md: \"md\" }}\n >\n Označit jako přečtené\n </Button>\n )}\n <Button variant=\"ghost\" onClick={onClose} size={{ base: \"sm\", md: \"md\" }}>\n Zavřít\n </Button>\n </HStack>\n </ModalFooter>\n </ModalContent>\n </Modal>\n );\n}\n","import { useState, useMemo, useEffect } from 'react';\nimport { \n Box, \n Button, \n Checkbox, \n Flex, \n Heading, \n IconButton, \n Menu, \n MenuButton, \n MenuItem, \n MenuList, \n Select, \n Stack, \n Table, \n Tbody, \n Td, \n Text, \n Th, \n Thead, \n Tr, \n useDisclosure,\n useToast,\n Badge,\n InputGroup,\n InputLeftElement,\n Input,\n HStack,\n useColorModeValue,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalBody,\n ModalFooter,\n ModalCloseButton,\n FormControl,\n FormLabel,\n VStack\n} from '@chakra-ui/react';\nimport { AddIcon, DeleteIcon, EmailIcon, Search2Icon, StarIcon, ArrowForwardIcon } from '@chakra-ui/icons';\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { format } from 'date-fns';\nimport { cs } from 'date-fns/locale';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport { \n getContactMessages, \n markAsRead, \n deleteMessage, \n deleteMultipleMessages,\n forwardAllMessages,\n ContactMessage \n} from '../../services/admin/contactMessages';\nimport Pagination from '../../components/common/Pagination';\nimport MessageDetailModal from '../../components/admin/MessageDetailModal';\nimport ConfirmationDialog from '../../components/common/ConfirmationDialog';\nimport { useAuth } from '../../contexts/AuthContext';\n\nexport default function MessagesAdminPage() {\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const inputBg = useColorModeValue('white', 'gray.700');\n const [selectedMessages, setSelectedMessages] = useState<string[]>([]);\n const [searchTerm, setSearchTerm] = useState('');\n const [statusFilter, setStatusFilter] = useState<'all' | 'read' | 'unread'>('all');\n const [sortBy, setSortBy] = useState<{ field: string; order: 'asc' | 'desc' }>({\n field: 'createdAt',\n order: 'desc',\n });\n const [pagination, setPagination] = useState({\n page: 1,\n limit: 10,\n });\n\n const { \n isOpen: isDetailOpen, \n onOpen: onDetailOpen, \n onClose: onDetailClose \n } = useDisclosure();\n const { \n isOpen: isDeleteOpen, \n onOpen: onDeleteOpen, \n onClose: onDeleteClose \n } = useDisclosure();\n const { \n isOpen: isForwardAllOpen, \n onOpen: onForwardAllOpen, \n onClose: onForwardAllClose \n } = useDisclosure();\n \n const [forwardAllEmail, setForwardAllEmail] = useState('');\n const [saveForwardDefault, setSaveForwardDefault] = useState<boolean>(true);\n const { user } = useAuth();\n \n const [selectedMessage, setSelectedMessage] = useState<ContactMessage | null>(null);\n const toast = useToast();\n const queryClient = useQueryClient();\n\n const { data, isLoading, isError } = useQuery({\n queryKey: ['admin', 'contact-messages', { ...pagination, searchTerm, statusFilter, sortBy }],\n queryFn: () =>\n getContactMessages({\n page: pagination.page,\n limit: pagination.limit,\n search: searchTerm,\n isRead: statusFilter === 'all' ? undefined : statusFilter === 'read',\n sortBy: sortBy.field,\n sortOrder: sortBy.order,\n }),\n keepPreviousData: true,\n });\n\n const markAsReadMutation = useMutation({\n mutationFn: markAsRead,\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['admin', 'contact-messages'] });\n toast({\n title: 'Zpráva označena jako přečtená',\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n },\n });\n\n const deleteMessageMutation = useMutation({\n mutationFn: deleteMessage,\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['admin', 'contact-messages'] });\n toast({\n title: 'Zpráva smazána',\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n },\n });\n\n const deleteMultipleMutation = useMutation({\n mutationFn: deleteMultipleMessages,\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['admin', 'contact-messages'] });\n setSelectedMessages([]);\n toast({\n title: 'Vybrané zprávy byly smazány',\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n },\n });\n\n const forwardAllMutation = useMutation({\n mutationFn: (payload: { emails: string | string[]; saveDefault?: boolean }) =>\n forwardAllMessages(payload.emails, { saveDefault: payload.saveDefault }),\n onSuccess: (data) => {\n toast({\n title: 'Zprávy se přeposílají',\n description: data.message || 'Všechny zprávy budou přeposlány na zadaný e-mail',\n status: 'success',\n duration: 5000,\n isClosable: true,\n });\n setForwardAllEmail('');\n onForwardAllClose();\n },\n onError: () => {\n toast({\n title: 'Chyba',\n description: 'Nepodařilo se přeposlat zprávy',\n status: 'error',\n duration: 3000,\n isClosable: true,\n });\n },\n });\n\n const handleViewMessage = (message: ContactMessage) => {\n setSelectedMessage(message);\n if (!message.isRead) {\n markAsReadMutation.mutate(message.id);\n }\n onDetailOpen();\n };\n\n const handleDeleteClick = (message: ContactMessage) => {\n setSelectedMessage(message);\n onDeleteOpen();\n };\n\n const handleDeleteConfirm = () => {\n if (selectedMessage) {\n deleteMessageMutation.mutate(selectedMessage.id);\n }\n onDeleteClose();\n };\n\n const handleBulkDelete = () => {\n if (selectedMessages.length > 0) {\n deleteMultipleMutation.mutate(selectedMessages);\n }\n };\n\n const handleForwardAll = () => {\n if (!forwardAllEmail || !forwardAllEmail.includes('@')) {\n toast({\n title: 'Chyba',\n description: 'Zadejte platnou e-mailovou adresu',\n status: 'error',\n duration: 3000,\n });\n return;\n }\n forwardAllMutation.mutate({ emails: forwardAllEmail, saveDefault: saveForwardDefault });\n };\n\n useEffect(() => {\n if (isForwardAllOpen) {\n // Prefill with current user's email if empty\n if (!forwardAllEmail && user?.email) {\n setForwardAllEmail(user.email);\n }\n // Default to saving as auto-forward unless user opts out\n setSaveForwardDefault(true);\n }\n }, [isForwardAllOpen, user?.email]);\n\n const handleSelectAll = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n setSelectedMessages(data?.data.map((msg) => msg.id) || []);\n } else {\n setSelectedMessages([]);\n }\n };\n\n const handleSelectMessage = (id: string, isSelected: boolean) => {\n if (isSelected) {\n setSelectedMessages((prev) => [...prev, id]);\n } else {\n setSelectedMessages((prev) => prev.filter((msgId) => msgId !== id));\n }\n };\n\n const handleSort = (field: string) => {\n setSortBy((prev) => ({\n field,\n order: prev.field === field && prev.order === 'asc' ? 'desc' : 'asc',\n }));\n };\n\n const formatDate = (dateString: string) => {\n return format(new Date(dateString), 'd. M. yyyy HH:mm', { locale: cs });\n };\n\n const getSortIcon = (field: string) => {\n if (sortBy.field !== field) return null;\n return sortBy.order === 'asc' ? '↑' : '↓';\n };\n\n return (\n <AdminLayout>\n <Box p={6}>\n <Flex justify=\"space-between\" align=\"center\" mb={6}>\n <Box>\n <Heading size=\"lg\" mb={2}>\n Příchozí zprávy\n </Heading>\n <Text color=\"gray.600\">\n Spravujte příchozí zprávy z kontaktního formuláře\n </Text>\n </Box>\n \n <HStack spacing={3} flexWrap=\"wrap\">\n <Button\n colorScheme=\"teal\"\n variant=\"outline\"\n leftIcon={<ArrowForwardIcon />}\n onClick={onForwardAllOpen}\n size={{ base: \"sm\", md: \"md\" }}\n >\n Přeposlat vše\n </Button>\n {selectedMessages.length > 0 && (\n <Button\n colorScheme=\"red\"\n variant=\"outline\"\n leftIcon={<DeleteIcon />}\n onClick={handleBulkDelete}\n isLoading={deleteMultipleMutation.isLoading}\n size={{ base: \"sm\", md: \"md\" }}\n >\n Smazat vybrané ({selectedMessages.length})\n </Button>\n )}\n </HStack>\n </Flex>\n\n <Box bg={cardBg} borderRadius=\"lg\" boxShadow=\"sm\" p={4} mb={6}>\n <Flex mb={4} gap={4} flexWrap=\"wrap\">\n <InputGroup maxW=\"md\">\n <InputLeftElement pointerEvents=\"none\">\n <Search2Icon color=\"gray.400\" />\n </InputLeftElement>\n <Input\n placeholder=\"Hledat v zprávách...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n />\n </InputGroup>\n \n <Select\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value as any)}\n maxW=\"200px\"\n >\n <option value=\"all\">Všechny zprávy</option>\n <option value=\"unread\">Nepřečtené</option>\n <option value=\"read\">Přečtené</option>\n </Select>\n </Flex>\n\n <Box overflowX=\"auto\">\n <Table variant=\"simple\">\n <Thead>\n <Tr>\n <Th w=\"40px\">\n <Checkbox\n isChecked={selectedMessages.length > 0 && selectedMessages.length === data?.data.length}\n onChange={handleSelectAll}\n />\n </Th>\n <Th \n cursor=\"pointer\" \n onClick={() => handleSort('name')}\n _hover={{ textDecoration: 'underline' }}\n >\n Jméno {getSortIcon('name')}\n </Th>\n <Th \n cursor=\"pointer\" \n onClick={() => handleSort('email')}\n _hover={{ textDecoration: 'underline' }}\n >\n E-mail {getSortIcon('email')}\n </Th>\n <Th>Předmět</Th>\n <Th>Zdroj</Th>\n <Th \n cursor=\"pointer\" \n onClick={() => handleSort('createdAt')}\n _hover={{ textDecoration: 'underline' }}\n >\n Datum {getSortIcon('createdAt')}\n </Th>\n <Th>Stav</Th>\n <Th w=\"120px\">Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {isLoading ? (\n <Tr>\n <Td colSpan={8} textAlign=\"center\" py={8}>\n Načítání...\n </Td>\n </Tr>\n ) : isError ? (\n <Tr>\n <Td colSpan={8} textAlign=\"center\" py={8} color=\"red.500\">\n Chyba při načítání zpráv\n </Td>\n </Tr>\n ) : data?.data.length === 0 ? (\n <Tr>\n <Td colSpan={8} textAlign=\"center\" py={8} color=\"gray.500\">\n Žádné zprávy nenalezeny\n </Td>\n </Tr>\n ) : (\n data?.data.map((message) => (\n <Tr \n key={message.id} \n bg={!message.isRead ? 'blue.50' : 'transparent'}\n _hover={{ bg: !message.isRead ? 'blue.50' : 'gray.50' }}\n >\n <Td>\n <Checkbox\n isChecked={selectedMessages.includes(message.id)}\n onChange={(e) => handleSelectMessage(message.id, e.target.checked)}\n />\n </Td>\n <Td fontWeight={!message.isRead ? 'semibold' : 'normal'}>\n {message.name}\n </Td>\n <Td>{message.email}</Td>\n <Td maxW=\"200px\" isTruncated title={message.subject || 'Bez předmětu'}>\n {message.subject || '—'}\n </Td>\n <Td>\n {message.source === 'sponsor' ? (\n <Badge colorScheme=\"purple\">Sponzor</Badge>\n ) : (\n <Badge colorScheme=\"gray\">Kontakt</Badge>\n )}\n </Td>\n <Td whiteSpace=\"nowrap\">\n {formatDate(message.createdAt)}\n </Td>\n <Td>\n {message.isRead ? (\n <Badge colorScheme=\"green\">Přečteno</Badge>\n ) : (\n <Badge colorScheme=\"blue\">Nová zpráva</Badge>\n )}\n </Td>\n <Td>\n <HStack spacing={2}>\n <IconButton\n aria-label=\"Zobrazit zprávu\"\n icon={<EmailIcon />}\n size=\"sm\"\n colorScheme=\"blue\"\n variant=\"ghost\"\n onClick={() => handleViewMessage(message)}\n />\n <IconButton\n aria-label=\"Smazat zprávu\"\n icon={<DeleteIcon />}\n size=\"sm\"\n colorScheme=\"red\"\n variant=\"ghost\"\n onClick={() => handleDeleteClick(message)}\n isLoading={\n deleteMessageMutation.isLoading && \n deleteMessageMutation.variables === message.id\n }\n />\n </HStack>\n </Td>\n </Tr>\n ))\n )}\n </Tbody>\n </Table>\n </Box>\n\n {data && data.total > 0 && (\n <Flex justify=\"space-between\" mt={4} alignItems=\"center\">\n <Text color=\"gray.600\" fontSize=\"sm\">\n Zobrazeno {data.data.length} z {data.total} zpráv\n </Text>\n <Pagination\n currentPage={pagination.page}\n totalPages={data.totalPages || 1}\n onPageChange={(page) => setPagination((p) => ({ ...p, page }))}\n />\n </Flex>\n )}\n </Box>\n </Box>\n\n {selectedMessage && (\n <MessageDetailModal\n isOpen={isDetailOpen}\n onClose={onDetailClose}\n message={selectedMessage}\n onDelete={() => {\n onDetailClose();\n handleDeleteClick(selectedMessage);\n }}\n onMarkAsRead={() => markAsReadMutation.mutate(selectedMessage.id)}\n />\n )}\n\n <ConfirmationDialog\n isOpen={isDeleteOpen}\n onClose={onDeleteClose}\n onConfirm={handleDeleteConfirm}\n title=\"Smazat zprávu\"\n message=\"Opravdu chcete smazat tuto zprávu? Tato akce je nevratná.\"\n confirmText=\"Smazat\"\n cancelText=\"Zrušit\"\n isDanger\n isLoading={deleteMessageMutation.isLoading}\n />\n\n <Modal isOpen={isForwardAllOpen} onClose={onForwardAllClose}>\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Přeposlat všechny zprávy</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack spacing={4}>\n <Text>\n Všechny příchozí zprávy budou přeposlány na zadanou e-mailovou adresu.\n </Text>\n <FormControl isRequired>\n <FormLabel>E-mailová adresa</FormLabel>\n <Input\n type=\"email\"\n placeholder=\"např. ja@klub.cz, info@klub.cz\"\n value={forwardAllEmail}\n onChange={(e) => setForwardAllEmail(e.target.value)}\n />\n </FormControl>\n <HStack w=\"full\" justify=\"space-between\">\n <Checkbox\n isChecked={saveForwardDefault}\n onChange={(e) => setSaveForwardDefault(e.target.checked)}\n >\n Uložit jako výchozí (automaticky přeposílat nové zprávy)\n </Checkbox>\n </HStack>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" mr={3} onClick={onForwardAllClose}>\n Zrušit\n </Button>\n <Button\n colorScheme=\"teal\"\n onClick={handleForwardAll}\n isLoading={forwardAllMutation.isLoading}\n >\n Přeposlat\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </AdminLayout>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport { Link as RouterLink } from 'react-router-dom';\nimport {\n Box,\n Container,\n Heading,\n SimpleGrid,\n Image,\n Text,\n VStack,\n HStack,\n Badge,\n Spinner,\n Button,\n useColorModeValue,\n} from '@chakra-ui/react';\nimport { Calendar, Image as ImageIcon, ExternalLink } from 'lucide-react';\nimport MainLayout from '../components/layout/MainLayout';\nimport { API_URL } from '../services/api';\nimport NewsletterCTA from '../components/common/NewsletterCTA';\nimport { Helmet } from 'react-helmet-async';\nimport { useTranslation } from 'react-i18next';\n\ninterface Album {\n id: string;\n title: string;\n url: string;\n date: string;\n photos_count: number;\n views_count?: number;\n photos: Array<{\n id: string;\n page_url: string;\n image_1500: string;\n }>;\n fetched_at?: string;\n}\n\nconst resolveBackendUrl = (path: string) => {\n try {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (path.startsWith('/cache') || path.startsWith('/uploads') || path.startsWith('/api/')) {\n let origin = '';\n try {\n const assetBase = (process.env.REACT_APP_ASSET_BASE_URL || '').trim();\n if (assetBase) {\n origin = new URL(assetBase, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n }\n } catch {}\n if (!origin) {\n try {\n origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n } catch {}\n }\n const abs = new URL(path, origin || (typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000'));\n return abs.toString();\n }\n return path;\n } catch {\n return path;\n }\n};\n\nconst GalleryPage: React.FC = () => {\n const { t } = useTranslation();\n const [albums, setAlbums] = useState<Album[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string>('');\n const [zoneramaProfileUrl, setZoneramaProfileUrl] = useState<string>('https://zonerama.com');\n const bgApp = useColorModeValue('#f8f9fb', '#0f1115');\n const cardBg = useColorModeValue('white', '#1a1d29');\n const borderColor = useColorModeValue('#e5e7eb', '#2a2e3a');\n const textPrimary = useColorModeValue('gray.800', 'gray.100');\n const textSecondary = useColorModeValue('gray.600', 'gray.300');\n const infoBg = useColorModeValue('blue.50', 'blue.900');\n const infoBorder = useColorModeValue('blue.200', 'blue.700');\n const infoText = useColorModeValue('blue.800', 'blue.200');\n const errorBg = useColorModeValue('red.50', 'red.900');\n const errorBorder = useColorModeValue('red.200', 'red.700');\n const errorText = useColorModeValue('red.600', 'red.300');\n\n useEffect(() => {\n const fetchAlbums = async () => {\n setLoading(true);\n setError('');\n \n try {\n // Load from both sources and combine\n const [profileRes, albumsRes] = await Promise.allSettled([\n fetch(resolveBackendUrl('/cache/prefetch/zonerama_profile.json'), { cache: 'no-cache' }),\n fetch(resolveBackendUrl('/cache/prefetch/zonerama_albums.json'), { cache: 'no-cache' })\n ]);\n \n let combinedAlbums: Album[] = [];\n \n // Get profile albums (newest/main source)\n if (profileRes.status === 'fulfilled' && profileRes.value.ok) {\n const profileData = await profileRes.value.json();\n combinedAlbums = [...(profileData.albums || [])];\n \n // Extract Zonerama profile URL\n if (profileData.input_link) {\n setZoneramaProfileUrl(profileData.input_link);\n }\n }\n \n // Get blog-related albums (additional source)\n if (albumsRes.status === 'fulfilled' && albumsRes.value.ok) {\n const albumsData = await albumsRes.value.json();\n const blogAlbums = Array.isArray(albumsData) ? albumsData : [];\n \n // Filter out albums with empty/invalid data and avoid duplicates\n const validBlogAlbums = blogAlbums.filter((album: any) => \n album.id && \n album.title && \n !combinedAlbums.some(existing => existing.id === album.id)\n );\n \n combinedAlbums = [...combinedAlbums, ...validBlogAlbums];\n }\n \n // Sort by date (newest first) - parse Czech date format \"DD. MM. YYYY\"\n combinedAlbums.sort((a, b) => {\n const parseDate = (dateStr: string) => {\n if (!dateStr) return new Date(0);\n const parts = dateStr.split(/[.\\s]+/).filter(Boolean);\n if (parts.length === 3) {\n const [day, month, year] = parts;\n return new Date(`${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`);\n }\n return new Date(dateStr);\n };\n \n return parseDate(b.date).getTime() - parseDate(a.date).getTime();\n });\n \n setAlbums(combinedAlbums);\n } catch (err: any) {\n setError(err.message || t('gallery.error_loading_albums'));\n } finally {\n setLoading(false);\n }\n };\n\n fetchAlbums();\n }, []);\n\n return (\n <MainLayout>\n <Helmet>\n <title>{t('gallery.page_title')}</title>\n <meta name=\"description\" content={t('gallery.page_description')} />\n </Helmet>\n <Box bg={bgApp} minH=\"100vh\" py={8}>\n <Container maxW=\"7xl\">\n {/* Header */}\n <VStack align=\"stretch\" spacing={6} mb={8}>\n <Heading size=\"2xl\" color={textPrimary}>\n {t('gallery.page_title')}\n </Heading>\n </VStack>\n\n {/* Loading State */}\n {loading && (\n <VStack spacing={4} py={12}>\n <Spinner size=\"xl\" color=\"brand.primary\" />\n <Text color={textSecondary}>{t('gallery.loading_albums')}</Text>\n </VStack>\n )}\n\n {/* Error State */}\n {error && !loading && (\n <Box\n bg={errorBg}\n borderWidth=\"1px\"\n borderColor={errorBorder}\n borderRadius=\"md\"\n p={4}\n textAlign=\"center\"\n >\n <Text color={errorText}>{error}</Text>\n </Box>\n )}\n\n {/* Empty State */}\n {!loading && !error && albums.length === 0 && (\n <Box\n bg={cardBg}\n borderWidth=\"1px\"\n borderColor={borderColor}\n borderRadius=\"lg\"\n p={12}\n textAlign=\"center\"\n >\n <VStack spacing={4}>\n <ImageIcon size={48} color=\"gray\" />\n <Heading size=\"md\" color={textSecondary}>\n {t('gallery.no_albums')}\n </Heading>\n <Text color={textSecondary}>\n {t('gallery.albums_will_appear')}\n </Text>\n </VStack>\n </Box>\n )}\n\n {/* Albums Grid */}\n {!loading && !error && albums.length > 0 && (\n <>\n <SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} spacing={6}>\n {albums.map((album) => {\n // Get the first photo as cover image\n const coverPhoto = album.photos && album.photos.length > 0 \n ? album.photos[0] \n : null;\n\n return (\n <Box\n key={album.id}\n as={RouterLink}\n to={`/galerie/album/${album.id}`}\n bg={cardBg}\n borderRadius=\"lg\"\n overflow=\"hidden\"\n boxShadow=\"md\"\n borderWidth=\"1px\"\n borderColor={borderColor}\n transition=\"all 0.2s\"\n _hover={{\n transform: 'translateY(-4px)',\n boxShadow: 'xl',\n borderColor: useColorModeValue('gray.300', 'gray.600'),\n }}\n cursor=\"pointer\"\n >\n {/* Cover Image */}\n {coverPhoto ? (\n <Image\n src={resolveBackendUrl(coverPhoto.image_1500)}\n alt={album.title}\n w=\"100%\"\n h=\"250px\"\n objectFit=\"cover\"\n loading=\"lazy\"\n />\n ) : (\n <Box\n w=\"100%\"\n h=\"250px\"\n bg=\"gray.200\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <ImageIcon size={48} color=\"gray\" />\n </Box>\n )}\n\n {/* Album Info */}\n <VStack align=\"stretch\" p={4} spacing={3}>\n <Heading size=\"md\" color={textPrimary} noOfLines={2}>\n {album.title}\n </Heading>\n \n <HStack spacing={4} flexWrap=\"wrap\" fontSize=\"sm\" color={textSecondary}>\n {album.date && (\n <HStack spacing={1}>\n <Calendar size={16} />\n <Text>{album.date}</Text>\n </HStack>\n )}\n <HStack spacing={1}>\n <ImageIcon size={16} />\n <Text>\n {album.photos_count === 1 \n ? t('gallery.photos_count_one', { count: album.photos_count })\n : (album.photos_count >= 2 && album.photos_count <= 4)\n ? t('gallery.photos_count_few', { count: album.photos_count })\n : t('gallery.photos_count_many', { count: album.photos_count })\n }\n </Text>\n </HStack>\n </HStack>\n\n {album.views_count !== undefined && album.views_count > 0 && (\n <HStack>\n <Badge colorScheme=\"purple\" fontSize=\"xs\">\n {album.views_count === 1 \n ? t('gallery.views_count_one', { count: album.views_count })\n : (album.views_count >= 2 && album.views_count <= 4)\n ? t('gallery.views_count_few', { count: album.views_count })\n : t('gallery.views_count_many', { count: album.views_count })\n }\n </Badge>\n </HStack>\n )}\n </VStack>\n </Box>\n );\n })}\n </SimpleGrid>\n\n {/* Show More Button - Link to Zonerama Profile */}\n <Box textAlign=\"center\" mt={8}>\n <Button\n as=\"a\"\n href={zoneramaProfileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n rightIcon={<ExternalLink size={18} />}\n colorScheme=\"blue\"\n size=\"lg\"\n variant=\"outline\"\n >\n {t('gallery.show_more_on_zonerama')}\n </Button>\n </Box>\n </>\n )}\n </Container>\n </Box>\n \n {/* Newsletter CTA */}\n <NewsletterCTA />\n </MainLayout>\n );\n};\n\nexport default GalleryPage;\n","import api, { API_URL } from './api';\nimport { getToken } from '../utils/auth';\n\nconst normalizeArticle = (raw: any): Article => {\n if (!raw) return raw as Article;\n const id = raw.id ?? raw.ID ?? raw.article_id ?? raw.articleId;\n const category = raw.category ?? raw.Category;\n const author = raw.author ?? raw.Author;\n\n // Normalize attachments: backend may send a JSON string or an array\n let attachments: Array<{ name: string; url: string; mime_type?: string; size?: number }> | undefined = undefined;\n const aRaw = raw.attachments ?? raw.Attachments;\n try {\n if (Array.isArray(aRaw)) {\n attachments = aRaw.map((it: any) => {\n if (typeof it === 'string') {\n const name = it.split('/').pop() || 'soubor';\n return { name, url: it };\n }\n return { name: it?.name || (String(it?.url || '').split('/').pop() || 'soubor'), url: it?.url || '', mime_type: it?.mime_type || it?.type, size: it?.size };\n });\n } else if (typeof aRaw === 'string' && aRaw.trim() !== '') {\n const parsed = JSON.parse(aRaw);\n if (Array.isArray(parsed)) {\n attachments = parsed.map((it: any) => {\n if (typeof it === 'string') {\n const name = it.split('/').pop() || 'soubor';\n return { name, url: it };\n }\n return { name: it?.name || (String(it?.url || '').split('/').pop() || 'soubor'), url: it?.url || '', mime_type: it?.mime_type || it?.type, size: it?.size };\n });\n }\n }\n } catch {\n // ignore malformed attachments\n }\n\n return {\n ...(raw as Article),\n id,\n category,\n author,\n ...(attachments ? { attachments } : {}),\n } as Article;\n};\n\nexport interface Article {\n id: number;\n title: string;\n content: string;\n image_url?: string;\n author?: { id: number; first_name?: string; last_name?: string; email: string };\n category_id?: number;\n category?: { id: number; name: string; description?: string; slug?: string; created_at?: string; updated_at?: string };\n category_name?: string;\n published?: boolean;\n featured?: boolean;\n created_at?: string;\n slug?: string;\n seo_title?: string;\n seo_description?: string;\n og_image_url?: string;\n published_at?: string;\n updated_at?: string;\n estimated_read_minutes?: number;\n read_count?: number;\n view_count?: number;\n read_time?: number;\n gallery_album_id?: string;\n gallery_album_url?: string;\n gallery_photo_ids?: string[];\n youtube_video_id?: string;\n youtube_video_title?: string;\n youtube_video_url?: string;\n youtube_video_thumbnail?: string;\n attachments?: Array<{ name: string; url: string; mime_type?: string; size?: number }>;\n}\n\n// --- Article ⇄ Match link ---\nexport interface ArticleMatchLink {\n article_id: number;\n external_match_id?: string;\n title?: string;\n}\n\nexport async function getArticleMatchLink(articleId: number | string): Promise<ArticleMatchLink> {\n const res = await api.get<ArticleMatchLink>(`/articles/${articleId}/match-link`);\n return res.data;\n}\n\nexport async function putArticleMatchLink(articleId: number | string, payload: { external_match_id: string; title?: string }): Promise<ArticleMatchLink> {\n const res = await api.post<ArticleMatchLink>(`/articles/${articleId}/match-link`, payload);\n return res.data;\n}\n\nexport async function deleteArticleMatchLink(articleId: number | string): Promise<{ ok: boolean }> {\n const res = await api.delete<{ ok: boolean }>(`/articles/${articleId}/match-link`);\n return res.data;\n}\n\nexport async function getFeaturedArticles(params: {\n page?: number;\n page_size?: number;\n} = {}) {\n const res = await api.get<any>('/articles/featured', { params });\n const d = res.data || {};\n const itemsRaw: any[] = Array.isArray(d.items)\n ? d.items\n : Array.isArray(d.data)\n ? d.data\n : [];\n const items: Article[] = itemsRaw.map((item) => normalizeArticle(item));\n const total = typeof d.total === 'number' ? d.total : items.length;\n const page = typeof d.page === 'number' ? d.page : (params as any).page || 1;\n const page_size = typeof d.page_size === 'number' ? d.page_size : (params as any).page_size || items.length;\n return { data: items, total, page, page_size } as Paginated<Article>;\n}\n\nexport interface Paginated<T> {\n data: T[];\n page: number;\n page_size: number;\n total: number;\n}\n\nexport async function getArticles(params: { \n page?: number; \n page_size?: number; \n category_id?: number; \n published?: boolean;\n featured?: boolean;\n q?: string;\n slug?: string;\n match_id?: string | number;\n month?: string; // YYYY-MM\n} = {}) {\n // Backend returns shape: { items, total, page, page_size }\n // Normalize to { data, total, page, page_size } expected by the frontend.\n const res = await api.get<any>('/articles', { params });\n const d = res.data || {};\n const itemsRaw: any[] = Array.isArray(d.items)\n ? d.items\n : Array.isArray(d.data)\n ? d.data\n : [];\n const items: Article[] = itemsRaw.map((item) => normalizeArticle(item));\n const total = typeof d.total === 'number' ? d.total : (typeof d.count === 'number' ? d.count : items.length);\n const page = typeof d.page === 'number' ? d.page : (params as any).page || 1;\n const page_size = typeof d.page_size === 'number' ? d.page_size : (params as any).page_size || items.length;\n return { data: items, total, page, page_size } as Paginated<Article>;\n}\n\nexport async function getArticle(id: number | string) {\n const res = await api.get<Article>(`/articles/${id}`);\n return normalizeArticle(res.data);\n}\n\nexport interface CreateArticlePayload {\n title: string;\n content: string;\n category_id?: number;\n category_name?: string; // optional: backend will resolve/create category by name\n published?: boolean;\n image_url?: string;\n slug?: string;\n seo_title?: string;\n seo_description?: string;\n og_image_url?: string;\n featured?: boolean;\n gallery_album_id?: string;\n gallery_album_url?: string;\n gallery_photo_ids?: string[];\n youtube_video_id?: string;\n youtube_video_title?: string;\n youtube_video_url?: string;\n youtube_video_thumbnail?: string;\n attachments?: Array<{ name: string; url: string; mime_type?: string; size?: number }>;\n}\n\nexport async function createArticle(payload: CreateArticlePayload) {\n const res = await api.post<Article>('/articles', payload);\n return normalizeArticle(res.data);\n}\n\nexport type UpdateArticlePayload = Partial<CreateArticlePayload>;\n\nexport async function updateArticle(id: number | string, payload: UpdateArticlePayload) {\n const res = await api.put<Article>(`/articles/${id}`, payload);\n return normalizeArticle(res.data);\n}\n\nexport async function deleteArticle(id: number | string) {\n const res = await api.delete<{ success: boolean }>(`/articles/${id}`);\n return res.data;\n}\n\n// Fetch by slug if the backend exposes /articles/slug/:slug.\n// Falls back to querying the list endpoint with ?slug= if needed.\nexport async function getArticleBySlug(slug: string) {\n try {\n const res = await api.get<Article>(`/articles/slug/${encodeURIComponent(slug)}`);\n return normalizeArticle(res.data);\n } catch (e) {\n // Fallback: attempt list query through normalized helper and return first match\n const list = await getArticles({ slug });\n return list.data?.[0];\n }\n}\n\nexport async function uploadFile(file: File) {\n const form = new FormData();\n form.append('file', file);\n // Important: Do NOT set Content-Type manually so Axios can attach the proper multipart boundary.\n // The api instance will automatically add Authorization via the interceptor when a token exists.\n const res = await api.post<{ url: string; name: string; type: string; size: number }>(\n '/upload',\n form\n );\n const data = res.data;\n let url = data.url || '';\n try {\n // Normalize URLs returned by backend: if the returned URL points to the frontend origin (dev server)\n // or to the API origin, convert it to a backend-relative path like '/uploads/2025/...'\n const parsed = new URL(url, window.location.origin);\n const appOrigin = window.location.origin;\n const apiOrigin = new URL(API_URL).origin;\n if (parsed.origin === appOrigin) {\n // Rewrite frontend-origin URLs to API origin, then strip origin to keep a relative path\n url = parsed.pathname + parsed.search + parsed.hash;\n } else if (parsed.origin === apiOrigin) {\n // Keep only the path so stored values are consistent (backend relative path)\n url = parsed.pathname + parsed.search + parsed.hash;\n }\n } catch (e) {\n // ignore parsing errors, keep original\n }\n return { ...data, url };\n}\n\nexport async function trackArticleView(id: number | string) {\n try {\n // Send an explicit empty JSON body to satisfy backend Content-Type validation\n await api.post(`/articles/${id}/track-view`, {});\n } catch (e) {\n console.debug('Failed to track article view:', e);\n }\n}\n\n","import React, { createContext, useCallback, useContext, useRef, useState } from 'react';\nimport ConfirmationDialog from '../components/common/ConfirmationDialog';\n\ninterface ConfirmDialogOptions {\n title?: string;\n message?: string;\n confirmText?: string;\n cancelText?: string;\n isDanger?: boolean;\n}\n\ninterface ConfirmDialogState {\n isOpen: boolean;\n title: string;\n message: string;\n confirmText?: string;\n cancelText?: string;\n isDanger?: boolean;\n isLoading?: boolean;\n}\n\ninterface ConfirmDialogContextValue {\n confirm: (options: ConfirmDialogOptions) => Promise<boolean>;\n}\n\nconst ConfirmDialogContext = createContext<ConfirmDialogContextValue | undefined>(undefined);\n\nexport const ConfirmDialogProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const [state, setState] = useState<ConfirmDialogState>({\n isOpen: false,\n title: '',\n message: '',\n confirmText: 'Potvrdit',\n cancelText: 'Zrušit',\n isDanger: false,\n isLoading: false,\n });\n\n const pendingRef = useRef<{ resolve: (value: boolean) => void } | null>(null);\n\n const closeDialog = useCallback(() => {\n setState((prev) => ({ ...prev, isOpen: false, isLoading: false }));\n if (pendingRef.current) {\n pendingRef.current.resolve(false);\n pendingRef.current = null;\n }\n }, []);\n\n const handleConfirm = useCallback(() => {\n setState((prev) => ({ ...prev, isLoading: false, isOpen: false }));\n if (pendingRef.current) {\n pendingRef.current.resolve(true);\n pendingRef.current = null;\n }\n }, []);\n\n const confirm = useCallback((options: ConfirmDialogOptions): Promise<boolean> => {\n return new Promise<boolean>((resolve) => {\n pendingRef.current = { resolve };\n setState({\n isOpen: true,\n title: options.title || 'Potvrzení',\n message: options.message || '',\n confirmText: options.confirmText || 'Potvrdit',\n cancelText: options.cancelText || 'Zrušit',\n isDanger: options.isDanger || false,\n isLoading: false,\n });\n });\n }, []);\n\n return (\n <ConfirmDialogContext.Provider value={{ confirm }}>\n {children}\n <ConfirmationDialog\n isOpen={state.isOpen}\n onClose={closeDialog}\n onConfirm={handleConfirm}\n title={state.title}\n message={state.message}\n confirmText={state.confirmText}\n cancelText={state.cancelText}\n isDanger={state.isDanger}\n isLoading={state.isLoading}\n />\n </ConfirmDialogContext.Provider>\n );\n};\n\nexport const useConfirmDialog = (): ConfirmDialogContextValue => {\n const ctx = useContext(ConfirmDialogContext);\n if (!ctx) {\n throw new Error('useConfirmDialog must be used within ConfirmDialogProvider');\n }\n return ctx;\n};\n","import React from 'react';\nimport {\n Button,\n Box,\n Text,\n Alert,\n AlertIcon,\n AlertTitle,\n AlertDescription,\n Spinner,\n HStack,\n VStack,\n Divider,\n} from '@chakra-ui/react';\nimport { useBlogTranslation } from '../../hooks/useBlogTranslation';\nimport { FaLanguage, FaCheck, FaExclamationTriangle } from 'react-icons/fa';\n\ninterface UniversalTranslatorProps {\n title: string;\n content: string;\n onTranslationComplete: (translatedTitle: string, translatedContent: string) => void;\n disabled?: boolean;\n contentType?: 'article' | 'activity' | 'page' | 'sponsor' | 'player';\n}\n\nexport const UniversalTranslator: React.FC<UniversalTranslatorProps> = ({\n title,\n content,\n onTranslationComplete,\n disabled = false,\n contentType = 'article',\n}) => {\n const { translateBlog, isTranslating, translationError, detectSourceLanguage, getTargetLanguage } = useBlogTranslation();\n\n const handleTranslate = async () => {\n try {\n const result = await translateBlog(title, content);\n onTranslationComplete(result.title, result.content);\n } catch (error) {\n // Error is handled by the hook\n }\n };\n\n const sourceLang = detectSourceLanguage(title + ' ' + content);\n const targetLang = getTargetLanguage();\n const shouldTranslate = sourceLang !== targetLang && title && content;\n\n if (!shouldTranslate) {\n return (\n <Alert status=\"info\" borderRadius=\"md\">\n <AlertIcon as={FaLanguage} />\n <Box>\n <AlertTitle>Translation not needed</AlertTitle>\n <AlertDescription>\n Content is already in {sourceLang === 'cs' ? 'Czech' : 'English'} or the target language is the same.\n </AlertDescription>\n </Box>\n </Alert>\n );\n }\n\n const getContentTypeLabel = () => {\n switch (contentType) {\n case 'activity': return 'Activity';\n case 'page': return 'Page';\n case 'sponsor': return 'Sponsor';\n case 'player': return 'Player';\n default: return 'Content';\n }\n };\n\n return (\n <VStack spacing={3} align=\"stretch\">\n <Box>\n <HStack spacing={2} mb={2}>\n <FaLanguage />\n <Text fontWeight=\"medium\">\n Translate {getContentTypeLabel()} from {sourceLang === 'cs' ? 'Czech' : 'English'} to {targetLang === 'cs' ? 'Czech' : 'English'}\n </Text>\n </HStack>\n \n <Button\n colorScheme=\"blue\"\n onClick={handleTranslate}\n isLoading={isTranslating}\n loadingText=\"Translating...\"\n leftIcon={<FaLanguage />}\n disabled={disabled || isTranslating}\n size=\"sm\"\n >\n {isTranslating ? 'Translating...' : `Translate ${getContentTypeLabel()}`}\n </Button>\n </Box>\n\n {translationError && (\n <Alert status=\"error\" borderRadius=\"md\">\n <AlertIcon as={FaExclamationTriangle} />\n <Box>\n <AlertTitle>Translation Failed</AlertTitle>\n <AlertDescription>{translationError}</AlertDescription>\n </Box>\n </Alert>\n )}\n\n {!isTranslating && !translationError && (\n <Alert status=\"success\" borderRadius=\"md\">\n <AlertIcon as={FaCheck} />\n <Box>\n <AlertTitle>Ready to Translate</AlertTitle>\n <AlertDescription>\n Click the translate button to convert this {getContentTypeLabel().toLowerCase()} to {targetLang === 'cs' ? 'Czech' : 'English'}.\n </AlertDescription>\n </Box>\n </Alert>\n )}\n\n <Divider />\n </VStack>\n );\n};\n","import React, { useEffect, useMemo, useState } from 'react';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport {\n Box,\n Button,\n ButtonGroup,\n FormControl,\n FormLabel,\n FormHelperText,\n HStack,\n Heading,\n IconButton,\n Input,\n Modal,\n ModalBody,\n ModalCloseButton,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalOverlay,\n Select,\n Switch,\n Table,\n Tbody,\n Td,\n Textarea,\n Th,\n Thead,\n Tr,\n useDisclosure,\n useToast,\n SimpleGrid,\n Text,\n VStack,\n Tag,\n TagLabel,\n Tooltip,\n Badge,\n Wrap,\n WrapItem,\n useColorModeValue,\n Image as ChakraImage,\n} from '@chakra-ui/react';\nimport { FiEdit2, FiPlus, FiTrash2, FiLink, FiGlobe } from 'react-icons/fi';\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { Event } from '../../types/event';\nimport { uploadFile } from '../../services/articles';\nimport { createEvent, deleteEvent, getEvents, updateEvent } from '../../services/eventService';\nimport { api } from '../../services/api';\n// Removed react-datepicker to prevent crash; using native date/time inputs instead\nimport { getPublicSettings } from '../../services/settings';\nimport PollLinker from '../../components/admin/PollLinker';\nimport { useAuth } from '../../contexts/AuthContext';\nimport FilePreview from '../../components/common/FilePreview';\nimport { facrApi } from '../../services/facr/facrApi';\nimport { getCompetitionAliasesPublic } from '../../services/competitionAliases';\nimport { BlogTranslator } from '../../components/admin/BlogTranslator';\nimport { translateBlogContent, detectLanguage } from '../../services/translation';\nimport { UniversalTranslator } from '../../components/admin/UniversalTranslator';\nimport MapLinkImporter from '../../components/admin/MapLinkImporter';\nimport { MapCoordinates } from '../../utils/mapUrlParser';\nimport ContactMap from '../../components/home/ContactMap';\nimport RichTextEditor from '../../components/common/RichTextEditor';\nimport { getCachedYouTube, YouTubeVideo } from '../../services/youtube';\nimport SaveStatusIndicator from '../../components/common/SaveStatusIndicator';\nimport { useAutoSave, loadDraft, getDraftMetadata } from '../../hooks/useAutoSave';\nimport { FiVideo, FiYoutube } from 'react-icons/fi';\nimport ThumbnailPreview from '../../components/common/ThumbnailPreview';\nimport { assetUrl } from '../../utils/url';\nimport { createShortLink } from '../../services/shortlinks';\nimport DateRangePicker from '../../components/common/DateRangePicker';\nimport { HelpTooltipCard } from '../../components/common/HelpTooltipCard';\nimport UploadPanel, { UploadPanelFile } from '../../components/common/UploadPanel';\nimport AIPromptInput from '../../components/common/AIPromptInput';\nimport { AITextModelId, getDefaultTextModelId } from '../../utils/aiModels';\nimport { generateMainImageAI } from '../../services/ai';\nimport { processAIContent, cleanAIText } from '../../utils/aiTextProcessing';\nimport AILoadingModal from '../../components/common/AILoadingModal';\n\nconst types: Array<{ value: Event['type']; label: string }> = [\n { value: 'match', label: 'Zápas' },\n { value: 'training', label: 'Trénink' },\n { value: 'meeting', label: 'Schůzka' },\n { value: 'other', label: 'Jiné' },\n];\n\nconst AdminActivitiesPage: React.FC = () => {\n const { user } = useAuth();\n const isAdmin = (user as any)?.role === 'admin';\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const inputBg = useColorModeValue('white', 'gray.700');\n const textSecondary = useColorModeValue('gray.600', 'gray.400');\n const toast = useToast();\n const qc = useQueryClient();\n const { isOpen, onOpen, onClose } = useDisclosure();\n const [editing, setEditing] = useState<Partial<Event> | null>(null);\n const [draftKey, setDraftKey] = useState<string>('');\n const [localDraft, setLocalDraft] = useState<Partial<Event> | null>(null);\n const [aiPrompt, setAiPrompt] = useState<string>('');\n const [aiLoading, setAiLoading] = useState<boolean>(false);\n const [aiProgress, setAiProgress] = useState<number | undefined>(undefined);\n const [aiStartTime, setAiStartTime] = useState<number | null>(null);\n const [aiTone, setAiTone] = useState<'informative'|'friendly'|'formal'>('informative');\n const [aiOverwrite, setAiOverwrite] = useState<boolean>(true);\n const [aiModelId, setAiModelId] = useState<AITextModelId>(getDefaultTextModelId());\n // Location coordinates for map preview\n const [locationLat, setLocationLat] = useState<number | undefined>(undefined);\n const [locationLng, setLocationLng] = useState<number | undefined>(undefined);\n // YouTube videos from club channel\n const [clubVideos, setClubVideos] = useState<YouTubeVideo[]>([]);\n const [youtubeTab, setYoutubeTab] = useState<'club' | 'custom'>('club');\n const [savedLocations, setSavedLocations] = useState<Array<{ id: string; label: string; address: string; lat?: number; lng?: number }>>([]);\n const [selectedSavedId, setSelectedSavedId] = useState<string>('');\n const [mainImageLoading, setMainImageLoading] = useState<boolean>(false);\n\n // Auto-save hook - saves draft automatically\n const { saveStatus, lastSaved, forceSave, clearDraft } = useAutoSave({\n data: editing || {},\n storageKey: draftKey,\n onSave: async (data) => {\n // If event has ID, update it\n if (data.id) {\n try {\n return await updateEvent(data.id, data);\n } catch (e: any) {\n const status = e?.response?.status;\n if (status === 404) {\n if (data.title?.trim() && data.start_time) {\n const created = await createEvent(data);\n if (created?.id) {\n setEditing(prev => ({ ...prev, id: created.id } as any));\n setDraftKey(`draft-activity-${created.id}`);\n try { localStorage.removeItem('draft-activity-new'); } catch {}\n }\n return created;\n }\n }\n throw e;\n }\n }\n // If no ID and has minimal required fields, create as draft\n if (data.title?.trim() && data.start_time) {\n const created = await createEvent(data);\n if (created?.id) {\n setEditing(prev => ({ ...prev, id: created.id } as any));\n setDraftKey(`draft-activity-${created.id}`);\n try { localStorage.removeItem('draft-activity-new'); } catch {}\n }\n return created;\n }\n // Don't save if no title or start time\n return {};\n },\n debounceMs: 2000,\n enabled: isOpen && editing !== null,\n });\n\n // Load local new-draft and expose in list (no popup)\n const refreshLocalDraft = React.useCallback(() => {\n try {\n const key = 'draft-activity-new';\n const metadata = getDraftMetadata(key);\n if (metadata && metadata.age < 1440) {\n const d = loadDraft<Partial<Event>>(key);\n if (d) {\n const restored: any = { ...d };\n if (restored.id) delete restored.id;\n setLocalDraft(restored);\n return;\n }\n }\n } catch {}\n setLocalDraft(null);\n }, []);\n\n React.useEffect(() => {\n refreshLocalDraft();\n }, [refreshLocalDraft]);\n\n const { data, isLoading } = useQuery({\n queryKey: ['admin-events'],\n queryFn: () => getEvents(),\n });\n const events = data || [];\n\n const [listDateFrom, setListDateFrom] = useState<string>('');\n const [listDateTo, setListDateTo] = useState<string>('');\n\n const filteredEvents = React.useMemo(() => {\n return events.filter((ev: Event) => {\n const raw: any = ev.start_time as any;\n const ts = raw ? new Date(raw).getTime() : NaN;\n if (isNaN(ts)) return true;\n if (listDateFrom) {\n const fromTs = new Date(listDateFrom + 'T00:00:00').getTime();\n if (!isNaN(fromTs) && ts < fromTs) return false;\n }\n if (listDateTo) {\n const toTs = new Date(listDateTo + 'T23:59:59').getTime();\n if (!isNaN(toTs) && ts > toTs) return false;\n }\n return true;\n });\n }, [events, listDateFrom, listDateTo]);\n\n // Localized label for event type\n const typeLabel = (t?: string) => {\n const v = String(t || '').trim() as any;\n const found = types.find((x) => x.value === v);\n return found ? found.label : 'Jiné';\n };\n\n const handleGenerateMainImage = async () => {\n if (!editing || !editing.title || !editing.title.trim()) {\n toast({ title: 'Chybí název aktivity', description: 'Nejprve zadejte název, aby AI věděla, co má zobrazit.', status: 'warning', duration: 4000 });\n return;\n }\n try {\n setMainImageLoading(true);\n const categoryName = (editing as any)?.category_name || '';\n const clubName = (settingsQ.data as any)?.club_name || '';\n const primaryColor = (settingsQ.data as any)?.primary_color || '';\n const secondaryColor = (settingsQ.data as any)?.secondary_color || '';\n const resp = await generateMainImageAI({\n subject: 'event',\n title: editing.title as string,\n category: categoryName,\n club_name: clubName,\n primary_color: primaryColor,\n secondary_color: secondaryColor,\n });\n if (!resp || !resp.url) {\n toast({ title: 'AI nevrátila obrázek', description: 'Zkuste to prosím znovu nebo nastavte obrázek ručně.', status: 'warning', duration: 5000 });\n return;\n }\n setEditing((prev) => ({ ...(prev || {}), image_url: resp.url } as any));\n toast({ title: 'Obrázek aktivity vygenerován', description: 'Obrázek byl nastaven k aktivitě.', status: 'success', duration: 4000 });\n } catch (e: any) {\n toast({ title: 'Generování obrázku selhalo', description: e?.response?.data?.error || e?.message || 'Zkuste to prosím znovu.', status: 'error', duration: 5000 });\n } finally {\n setMainImageLoading(false);\n }\n };\n\n // Load club YouTube videos\n useEffect(() => {\n (async () => {\n try {\n const ytData = await getCachedYouTube();\n if (ytData?.videos) {\n setClubVideos(ytData.videos.slice(0, 20)); // Limit to 20 most recent\n }\n } catch (err) {\n console.error('Failed to load YouTube videos:', err);\n }\n })();\n }, []);\n\n // Settings for logo fetch (for placeholder image)\n const settingsQ = useQuery({\n queryKey: ['public-settings'],\n queryFn: getPublicSettings,\n staleTime: 5 * 60_000,\n });\n\n useEffect(() => {\n try {\n const raw = localStorage.getItem('admin_saved_locations');\n const base: Array<{ id: string; label: string; address: string; lat?: number; lng?: number }> = raw ? JSON.parse(raw) : [];\n const s: any = settingsQ.data || {};\n const clubAddrParts = [s.contact_address, s.contact_city, s.contact_zip].filter((x: any) => String(x || '').trim());\n const clubAddr = clubAddrParts.join(', ');\n const hasCoords = typeof s.location_latitude === 'number' && typeof s.location_longitude === 'number' && !isNaN(s.location_latitude) && !isNaN(s.location_longitude);\n const label = s.club_name ? `Klub ${s.club_name}` : 'Klub Hlavní místo';\n if (clubAddr || hasCoords) {\n const exists = base.some((it) => (clubAddr && it.address === clubAddr) || (hasCoords && it.lat === s.location_latitude && it.lng === s.location_longitude));\n if (!exists) {\n base.unshift({ id: 'club-main', label, address: clubAddr || (s.contact_city || 'Klub'), lat: hasCoords ? s.location_latitude : undefined, lng: hasCoords ? s.location_longitude : undefined });\n }\n }\n setSavedLocations(base);\n } catch {\n setSavedLocations([]);\n }\n }, [settingsQ.data]);\n\n const persistSavedLocations = (list: Array<{ id: string; label: string; address: string; lat?: number; lng?: number }>) => {\n try { localStorage.setItem('admin_saved_locations', JSON.stringify(list)); } catch {}\n setSavedLocations(list);\n };\n\n const addCurrentLocationToSaved = () => {\n const address = String(editing?.location || '').trim();\n const hasCoords = typeof locationLat === 'number' || typeof locationLng === 'number';\n if (!address && !hasCoords) {\n toast({ title: 'Nelze uložit místo', description: 'Zadejte název/adresu nebo vyberte souřadnice.', status: 'warning' });\n return;\n }\n const id = String(Date.now());\n const label = address || 'Uložené místo';\n const next = [...savedLocations, { id, label, address, lat: locationLat, lng: locationLng }];\n persistSavedLocations(next);\n setSelectedSavedId(id);\n toast({ title: 'Místo uloženo', status: 'success', duration: 2000 });\n };\n\n const applySavedLocation = (id: string) => {\n setSelectedSavedId(id);\n const item = savedLocations.find((x) => x.id === id);\n if (!item) return;\n setLocationLat(item.lat);\n setLocationLng(item.lng);\n setEditing(prev => ({ ...(prev || {}), location: item.address, latitude: item.lat as any, longitude: item.lng as any } as any));\n toast({ title: 'Místo vybráno', description: item.label, status: 'success', duration: 1500 });\n };\n\n const deleteSelectedSaved = () => {\n if (!selectedSavedId) return;\n if (selectedSavedId === 'club-main') { toast({ title: 'Nelze smazat klubové místo', status: 'info' }); return; }\n const next = savedLocations.filter((x) => x.id !== selectedSavedId);\n persistSavedLocations(next);\n setSelectedSavedId('');\n toast({ title: 'Uložené místo smazáno', status: 'success', duration: 1500 });\n };\n\n const openCreate = () => {\n const key = 'draft-activity-new';\n setDraftKey(key);\n if (localDraft) {\n setEditing(localDraft);\n } else {\n setEditing({ title: '', description: '', type: 'other', is_public: true } as any);\n }\n setLocationLat(undefined);\n setLocationLng(undefined);\n onOpen();\n };\n const openEdit = (ev: Event) => {\n // Set unique draft key for this event\n const key = `draft-activity-${ev.id}`;\n setDraftKey(key);\n \n setEditing({ ...ev });\n // Initialize map coordinates from event\n if ((ev as any).latitude && (ev as any).longitude) {\n setLocationLat((ev as any).latitude);\n setLocationLng((ev as any).longitude);\n } else {\n setLocationLat(undefined);\n setLocationLng(undefined);\n }\n onOpen();\n };\n const closeModal = () => {\n setEditing(null);\n setLocationLat(undefined);\n setLocationLng(undefined);\n onClose();\n refreshLocalDraft();\n };\n\n\n const createMut = useMutation({\n mutationFn: (payload: Partial<Event>) => createEvent(payload),\n onSuccess: () => { toast({ title: 'Událost vytvořena', status: 'success' }); qc.invalidateQueries({ queryKey: ['admin-events'] }); closeModal(); },\n onError: (e: any) => toast({ title: 'Chyba při vytváření', description: e?.message || 'Došlo k chybě', status: 'error' }),\n });\n const updateMut = useMutation({\n mutationFn: ({ id, payload }: { id: number|string; payload: Partial<Event> }) => updateEvent(id, payload),\n onSuccess: () => { toast({ title: 'Událost upravena', status: 'success' }); qc.invalidateQueries({ queryKey: ['admin-events'] }); closeModal(); },\n onError: (e: any) => toast({ title: 'Chyba při ukládání', description: e?.message || 'Došlo k chybě', status: 'error' }),\n });\n const deleteMut = useMutation({\n mutationFn: (id: number) => deleteEvent(id),\n onSuccess: () => { toast({ title: 'Smazáno', status: 'success' }); qc.invalidateQueries({ queryKey: ['admin-events'] }); },\n onError: (e: any) => toast({ title: 'Smazání selhalo', description: e?.message || 'Došlo k chybě', status: 'error' }),\n });\n\n // Competitions list for category selection (like Articles)\n const [competitions, setCompetitions] = useState<Array<{ code?: string; name: string }>>([]);\n const [aliasesMap, setAliasesMap] = useState<Record<string, string>>({});\n useEffect(() => {\n (async () => {\n try {\n const settings = await getPublicSettings();\n const clubId = (settings as any)?.club_id || '';\n const clubType = ((settings as any)?.club_type || 'football') as 'football' | 'futsal';\n const comps: Array<{ code?: string; name: string }> = [];\n if (clubId) {\n try {\n const club = await facrApi.getClub(String(clubId), clubType);\n const arr = Array.isArray((club as any)?.competitions) ? (club as any).competitions : [];\n arr.forEach((c: any) => comps.push({ code: c.code, name: c.name || c.code }));\n } catch {}\n }\n let amap: Record<string, string> = {};\n try {\n const list = await getCompetitionAliasesPublic();\n list.forEach((a) => { if (a.code && a.alias) amap[a.code] = a.alias; });\n } catch {}\n const withAliases = comps.map((c) => ({ code: c.code, name: (c.code && amap[c.code]) ? amap[c.code] : c.name }));\n setAliasesMap(amap);\n setCompetitions(withAliases);\n } catch {}\n })();\n }, []);\n\n // AI generation for activity title/description (uses blog generator to produce quality Czech copy)\n const generateWithAI = async () => {\n try {\n setAiLoading(true);\n setAiProgress(0);\n setAiStartTime(Date.now());\n \n // Start progress simulation\n const progressInterval = setInterval(() => {\n setAiProgress(prev => {\n if (prev === undefined || prev >= 95) return prev;\n return Math.min(prev + Math.random() * 15 + 5, 95);\n });\n }, 2000);\n \n const e = editing || {};\n const stripHtml = (s: string) => String(s || '').replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim();\n const lines: string[] = [];\n const clubName = String(settingsQ?.data?.club_name || '').trim();\n if (clubName) lines.push(`Klub: ${clubName}`);\n if (e.type) lines.push(`Typ: ${e.type}`);\n if (!aiOverwrite && e.description) {\n const plain = stripHtml(e.description as any);\n if (plain) lines.push(`Stávající text (pro kontext): ${plain}`);\n }\n const base = lines.join('\\n');\n const toneText = aiTone === 'informative'\n ? 'neutrálním, věcným a stručným stylem (bez nadsázky)'\n : aiTone === 'formal'\n ? 'formálním a profesionálním stylem (bez příkras)'\n : 'přátelským, ale věcným a stručným stylem (bez nadsázky)';\n const safeUserPrompt = (aiPrompt || 'Napiš krátkou neutrální pozvánku na klubovou aktivitu.').trim();\n const constraints = 'Nevkládej datum ani místo (lokalitu) do textu. Neuváděj konkrétní čas nebo adresu. Vyhýbej se superlativům, hyperbolám a marketingovým frázím. Nepoužívej slova jako „neopakovatelný“, „epický“, „úchvatný“ apod. Preferuj 23 krátké odstavce NEBO stručný seznam s odrážkami. Používej HTML značky ul/li pro odrážky a strong pro zvýraznění. Bez nadpisů (nepoužívej H1/H2). Dbej na věcný a střízlivý tón.';\n const prompt = `${safeUserPrompt}\\n\\nPiš ${toneText}, česky, s důrazem na jasnost a pozvánku k účasti. ${constraints}\\nCílová délka: 80120 slov.\\nDetaily:\\n${base}`.trim();\n const { data } = await api.post('/ai/blog/generate', {\n prompt,\n audience: clubName ? `Fanoušci klubu ${clubName}, oznámení/pozvánka` : 'Fanoušci klubu, oznámení/pozvánka',\n min_words: 100,\n model: aiModelId,\n });\n \n clearInterval(progressInterval);\n setAiProgress(100);\n \n // Handle potential JSON string response from AI (defensive parsing)\n let parsedData = data;\n if (typeof data === 'string') {\n try {\n parsedData = JSON.parse(data);\n } catch {\n throw new Error('AI vrátila neplatný formát odpovědi');\n }\n }\n \n const title = cleanAIText(String(parsedData?.title || '').trim());\n const html = processAIContent(String(parsedData?.html || '').trim(), { cleanText: true, preserveHtmlTags: true });\n if (!title && !html) throw new Error('AI nevrátila obsah');\n \n setEditing(prev => ({\n ...(prev || {}),\n title: aiOverwrite ? (title || (prev?.title || '')) : (prev?.title || title || ''),\n description: aiOverwrite ? (html || (prev?.description || '')) : `${(prev?.description || '')}${(prev?.description ? '\\n\\n' : '')}${html}`,\n }));\n toast({ title: 'Vygenerováno pomocí AI', status: 'success', duration: 3000 });\n } catch (e: any) {\n console.error('AI generation error:', e);\n toast({ title: 'AI generování selhalo', description: e?.response?.data?.error || e?.message || 'Zkuste doplnit více detailů a opakovat.', status: 'error', duration: 5000 });\n } finally {\n setTimeout(() => {\n setAiLoading(false);\n setAiProgress(undefined);\n setAiStartTime(null);\n }, 1000); // Brief moment to show 100% completion\n }\n };\n\n\n // Quick translation handler for activities list\n const handleQuickTranslateActivity = async (activity: Event) => {\n if (!activity.title || !activity.description) {\n toast({\n title: 'Nelze přeložit',\n description: 'Aktivita musí mít název a popis.',\n status: 'error',\n duration: 3000,\n });\n return;\n }\n\n try {\n const sourceLang = detectLanguage(activity.title + ' ' + activity.description);\n const targetLang = sourceLang === 'cs' ? 'en' : 'cs';\n\n if (sourceLang === targetLang) {\n toast({\n title: 'Překlad není potřeba',\n description: 'Aktivita je již v cílovém jazyce.',\n status: 'info',\n duration: 3000,\n });\n return;\n }\n\n const result = await translateBlogContent(activity.title, activity.description, sourceLang, targetLang);\n \n // Update the activity with translated content\n await updateEvent(activity.id, {\n title: result.translatedTitle,\n description: result.translatedContent,\n });\n\n // Refresh the activities list\n qc.invalidateQueries({ queryKey: ['admin-events'] });\n qc.invalidateQueries({ queryKey: ['events'] });\n\n toast({\n title: 'Aktivita přeložena',\n description: `Aktivita byla přeložena z ${sourceLang === 'cs' ? 'češtiny' : 'angličtiny'} do ${targetLang === 'cs' ? 'češtiny' : 'angličtiny'}.`,\n status: 'success',\n duration: 3000,\n });\n } catch (error: any) {\n toast({\n title: 'Chyba při překladu',\n description: error?.message || 'Nepodařilo se přeložit aktivitu.',\n status: 'error',\n duration: 3000,\n });\n }\n };\n const [startDate, setStartDate] = useState<string>('');\n const [startTime, setStartTime] = useState<string>('');\n const [endDate, setEndDate] = useState<string>('');\n const [endTime, setEndTime] = useState<string>('');\n\n // Sync segmented date/time when editing changes\n useEffect(() => {\n const s = editing?.start_time ? new Date(editing.start_time as any) : null;\n if (s) {\n const yyyy = s.getFullYear();\n const mm = String(s.getMonth() + 1).padStart(2, '0');\n const dd = String(s.getDate()).padStart(2, '0');\n const hh = String(s.getHours()).padStart(2, '0');\n const min = String(s.getMinutes()).padStart(2, '0');\n setStartDate(`${yyyy}-${mm}-${dd}`);\n setStartTime(`${hh}:${min}`);\n } else {\n setStartDate(''); setStartTime('');\n }\n const e = editing?.end_time ? new Date(editing.end_time as any) : null;\n if (e) {\n const yyyy = e.getFullYear();\n const mm = String(e.getMonth() + 1).padStart(2, '0');\n const dd = String(e.getDate()).padStart(2, '0');\n const hh = String(e.getHours()).padStart(2, '0');\n const min = String(e.getMinutes()).padStart(2, '0');\n setEndDate(`${yyyy}-${mm}-${dd}`);\n setEndTime(`${hh}:${min}`);\n } else {\n setEndDate(''); setEndTime('');\n }\n }, [editing?.start_time, editing?.end_time]);\n\n const toISO = (d?: string, t?: string) => {\n if (!d || !t) return null as any;\n const val = new Date(`${d}T${t}:00`);\n if (isNaN(val.getTime())) return null as any;\n return val.toISOString() as any;\n };\n\n const missingTitle = !String(editing?.title || '').trim();\n const missingStart = !startDate || !startTime;\n\n const ensurePlaceholderImage = async (): Promise<string | undefined> => {\n try {\n const logoUrl = String(settingsQ.data?.club_logo_url || '/dist/img/logo-club-empty.svg');\n const canvas = document.createElement('canvas');\n const W = 1200, H = 630;\n canvas.width = W; canvas.height = H;\n const ctx = canvas.getContext('2d');\n if (!ctx) return undefined;\n // White background\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, W, H);\n // Border for visibility\n ctx.strokeStyle = '#000000';\n ctx.lineWidth = 6;\n ctx.strokeRect(3, 3, W - 6, H - 6);\n // Draw club logo centered\n const img = new Image();\n img.crossOrigin = 'anonymous';\n const loadImg = () => new Promise<HTMLImageElement>((resolve, reject) => {\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = logoUrl;\n });\n try { await loadImg(); } catch { /* fallback */ }\n const boxW = Math.round(W * 0.5);\n const boxH = Math.round(H * 0.5);\n const x = Math.round((W - boxW) / 2);\n const y = Math.round((H - boxH) / 2);\n try { ctx.drawImage(img, x, y, boxW, boxH); } catch {}\n // Export and upload\n const blob: Blob | null = await new Promise(resolve => canvas.toBlob(b => resolve(b), 'image/jpeg', 0.92));\n if (!blob) return undefined;\n const file = new File([blob], 'activity-cover.jpg', { type: 'image/jpeg' });\n const res = await uploadFile(file);\n return (res as any)?.url || undefined;\n } catch { return undefined; }\n };\n\n const onSubmit = async () => {\n if (!editing) return;\n // Validation to avoid 400s\n if (missingTitle) { toast({ title: 'Zadejte název', status: 'warning' }); return; }\n if (missingStart) { toast({ title: 'Vyplňte datum a čas začátku', status: 'warning' }); return; }\n const startISO = toISO(startDate, startTime);\n const endISO = endDate && endTime ? toISO(endDate, endTime) : null;\n if (endISO && startISO && new Date(endISO).getTime() < new Date(startISO).getTime()) {\n toast({ title: 'Konec musí být po začátku', status: 'warning' });\n return;\n }\n\n const payload: Partial<Event> = {\n title: (editing.title || '').trim(),\n description: (editing.description || '').trim(),\n start_time: startISO as any,\n end_time: (endISO as any) || null,\n location: (editing.location || '').trim(),\n type: (editing.type || 'other') as any,\n is_public: true,\n image_url: (editing as any).image_url || undefined,\n file_url: (editing as any).file_url || undefined,\n category_name: (editing as any)?.category_name || undefined,\n attachments: Array.isArray((editing as any)?.attachments) ? ((editing as any).attachments as any[]).map((a: any) => ({ name: a.name, url: a.url, mime_type: a.mime_type, size: a.size })) : undefined,\n youtube_url: (editing as any)?.youtube_url || undefined,\n latitude: (editing as any)?.latitude || locationLat || undefined,\n longitude: (editing as any)?.longitude || locationLng || undefined,\n };\n\n if ((editing as any).id) {\n await updateMut.mutateAsync({ id: (editing as any).id, payload });\n } else {\n await createMut.mutateAsync(payload);\n }\n };\n\n const uploadAttachmentFile = async (file: File): Promise<UploadPanelFile> => {\n const allowedTypes = [\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'text/plain',\n 'application/zip',\n 'application/x-zip-compressed',\n 'application/x-rar-compressed',\n 'application/vnd.rar',\n ];\n const isAllowed =\n allowedTypes.includes(file.type) ||\n !!file.name.match(/\\.(pdf|docx?|xlsx?|pptx?|jpe?g|png|gif|webp|txt|zip|rar)$/i);\n if (!isAllowed) {\n throw new Error(`Soubor \"${file.name}\" nelze nahrát (nepodporovaný formát).`);\n }\n const res = await uploadFile(file);\n return {\n url: (res as any).url,\n name: file.name,\n type: file.type || (res as any).type || 'application/octet-stream',\n size: file.size || (res as any).size || 0,\n };\n };\n\n return (\n <AdminLayout requireAdmin={false}>\n <Box>\n <HStack justify=\"space-between\" mb={4}>\n <Heading size=\"lg\">Aktivity (Události)</Heading>\n <Button leftIcon={<FiPlus />} colorScheme=\"blue\" onClick={openCreate}>Nová aktivita</Button>\n </HStack>\n <Wrap mb={4} spacing={3} align=\"center\">\n <WrapItem>\n <DateRangePicker\n from={listDateFrom || undefined}\n to={listDateTo || undefined}\n onChange={(fromValue, toValue) => {\n setListDateFrom(fromValue);\n setListDateTo(toValue);\n }}\n size=\"sm\"\n />\n </WrapItem>\n {(listDateFrom || listDateTo) && (\n <WrapItem>\n <Button\n size=\"sm\"\n variant=\"outline\"\n colorScheme=\"red\"\n onClick={() => { setListDateFrom(''); setListDateTo(''); }}\n borderRadius=\"md\"\n >\n Vymazat filtr\n </Button>\n </WrapItem>\n )}\n </Wrap>\n <Box bg={cardBg} borderWidth=\"1px\" borderRadius=\"lg\" overflowX=\"auto\" boxShadow=\"sm\" mb={6}>\n <Table size=\"sm\">\n <Thead>\n <Tr>\n <Th>Náhled</Th>\n <Th>Název</Th>\n <Th>Typ</Th>\n <Th>Začátek</Th>\n <Th>Konec</Th>\n <Th>Místo</Th>\n <Th w=\"140px\">Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {isLoading && (\n <Tr><Td colSpan={8}>Načítání…</Td></Tr>\n )}\n {!isLoading && localDraft && (\n <Tr key=\"local-draft\" opacity={0.6}>\n <Td>\n {(localDraft as any).image_url ? (\n <ThumbnailPreview \n src={assetUrl((localDraft as any).image_url) || (localDraft as any).image_url}\n alt={(localDraft as any).title || 'Koncept'}\n size=\"48px\"\n previewSize=\"350px\"\n />\n ) : (\n <ChakraImage \n src={assetUrl(settingsQ.data?.club_logo_url) || assetUrl('/dist/img/logo-club-empty.svg') || '/dist/img/logo-club-empty.svg'}\n alt=\"No image\"\n boxSize=\"48px\"\n objectFit=\"contain\"\n opacity={0.3}\n />\n )}\n </Td>\n <Td>\n <VStack align=\"start\" spacing={0}>\n <Text fontWeight=\"medium\">{(localDraft as any).title || 'Bez názvu (koncept)'}</Text>\n <Text fontSize=\"xs\" color=\"gray.500\">Koncept (lokálně uložený)</Text>\n </VStack>\n </Td>\n <Td>\n <Badge colorScheme=\"gray\" fontSize=\"xs\">{(localDraft as any).type ? typeLabel((localDraft as any).type as any) : '—'}</Badge>\n </Td>\n <Td>—</Td>\n <Td>—</Td>\n <Td>{(localDraft as any).location || '—'}</Td>\n <Td><Badge colorScheme=\"gray\">Koncept</Badge></Td>\n <Td isNumeric>\n <HStack spacing={1} justify=\"flex-end\">\n <IconButton aria-label=\"Upravit koncept\" size=\"sm\" icon={<FiEdit2 />} onClick={openCreate} />\n <IconButton \n aria-label=\"Smazat koncept\" \n size=\"sm\" \n colorScheme=\"red\" \n icon={<FiTrash2 />} \n onClick={() => { try { localStorage.removeItem('draft-activity-new'); } catch {} setLocalDraft(null); toast({ title: 'Koncept odstraněn', status: 'success', duration: 2000 }); }} \n />\n </HStack>\n </Td>\n </Tr>\n )}\n {!isLoading && filteredEvents.map(ev => (\n <Tr key={ev.id}>\n <Td>\n {(ev as any).image_url ? (\n <ThumbnailPreview \n src={assetUrl((ev as any).image_url) || (ev as any).image_url} \n alt={ev.title} \n size=\"48px\"\n previewSize=\"350px\"\n />\n ) : (\n <ChakraImage \n src={assetUrl(settingsQ.data?.club_logo_url) || assetUrl('/dist/img/logo-club-empty.svg') || '/dist/img/logo-club-empty.svg'} \n alt=\"No image\" \n boxSize=\"48px\" \n objectFit=\"contain\" \n opacity={0.3}\n />\n )}\n </Td>\n <Td>\n <VStack align=\"start\" spacing={0}>\n <Text fontWeight=\"medium\">{ev.title}</Text>\n <Text fontSize=\"xs\" color=\"gray.500\">{ev.is_public ? '✓ Veřejná' : '○ Koncept'}</Text>\n </VStack>\n </Td>\n <Td>{typeLabel(ev.type as any)}</Td>\n <Td>{new Date(ev.start_time).toLocaleString()}</Td>\n <Td>{ev.end_time ? new Date(ev.end_time).toLocaleString() : '-'}</Td>\n <Td>{ev.location || '-'}</Td>\n <Td>\n <HStack>\n <IconButton aria-label=\"Upravit\" size=\"sm\" icon={<FiEdit2 />} onClick={() => openEdit(ev)} />\n <IconButton \n aria-label=\"Přeložit\" \n size=\"sm\" \n colorScheme=\"blue\" \n icon={<FiGlobe />} \n title=\"Přeložit aktivitu\"\n onClick={() => handleQuickTranslateActivity(ev)} \n />\n <IconButton aria-label=\"Smazat\" size=\"sm\" colorScheme=\"red\" icon={<FiTrash2 />} onClick={() => deleteMut.mutate(ev.id)} />\n <IconButton\n aria-label=\"Zkrátit odkaz\"\n size=\"sm\"\n icon={<FiLink />}\n title=\"Zkrátit odkaz pro sdílení\"\n onClick={async () => {\n try {\n const origin = window.location.origin;\n const target = `${origin}/aktivita/${ev.id}`;\n const res = await createShortLink({ target_url: target, title: ev.title, source_type: 'event', source_id: ev.id as any, code: `e${ev.id}` });\n await navigator.clipboard.writeText(res.short_url);\n toast({ title: 'Zkrácený odkaz zkopírován', description: res.short_url, status: 'success', duration: 4000 });\n } catch (e: any) {\n toast({ title: 'Vytvoření odkazu selhalo', description: e?.message || 'Zkuste to znovu', status: 'error' });\n }\n }}\n />\n </HStack>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n\n {/* Modal */}\n <Modal isOpen={isOpen} onClose={closeModal} isCentered scrollBehavior=\"inside\">\n <ModalOverlay backdropFilter=\"blur(3px)\" />\n <ModalContent maxW={{ base: '96vw', md: '920px' }} maxH={{ base: '90vh', md: '86vh' }} borderRadius=\"2xl\" overflow=\"hidden\" boxShadow=\"2xl\">\n <ModalHeader>\n <HStack justify=\"space-between\" align=\"start\" w=\"full\" pr={8}>\n <VStack align=\"start\" spacing={1} flex={1}>\n <Heading size=\"md\">{(editing as any)?.id ? 'Upravit aktivitu' : 'Nová aktivita'}</Heading>\n <Text fontSize=\"sm\" color=\"gray.500\">Plánujte klubové akce, sdílejte s fanoušky a týmem.</Text>\n </VStack>\n <SaveStatusIndicator status={saveStatus} lastSaved={lastSaved} compact />\n </HStack>\n </ModalHeader>\n <ModalCloseButton />\n <ModalBody overflowY=\"auto\" maxH={{ base: '76vh', md: '70vh' }}>\n <Box borderWidth=\"1px\" borderRadius=\"lg\" p={4} mb={5} bg={useColorModeValue('gray.50', 'gray.900')}>\n <HStack justify=\"space-between\" align=\"start\" mb={2}>\n <Heading size=\"sm\">AI generování</Heading>\n <HStack spacing={2} align=\"center\">\n <Badge colorScheme=\"purple\" variant=\"subtle\">Beta</Badge>\n <HelpTooltipCard\n label=\"Jak AI píše text\"\n title=\"Jak funguje AI generování popisu\"\n items={[\n 'AI pomáhá s titulkem a popisem aktivity, ale nemění datum, čas ani místo ty nastavujete ručně.',\n 'Do promptu uveďte typ akce, cílovou skupinu a důležité body programu. AI použije klubové informace z nastavení.',\n 'Přepínač „Přepsat existující obsah\" určuje, zda AI může přepsat už vyplněný titulek a popis, nebo je jen doplní.',\n ]}\n />\n </HStack>\n </HStack>\n <Text fontSize=\"sm\" color=\"gray.600\" mb={2}>Zadejte instrukce pro AI nebo klikněte na předlohy níže. AI může vytvořit nebo doplnit titulek a popis události.</Text>\n <AIPromptInput\n value={aiPrompt}\n onChange={setAiPrompt}\n onSubmit={(_, modelId) => {\n setAiModelId(modelId);\n return generateWithAI();\n }}\n isSubmitting={aiLoading}\n placeholder=\"Např.: Trénink A-týmu, hřiště TJ Dvorce, 18:0019:30, pro všechny hráče.\"\n helperText=\"AI popíše aktivitu bez data, času a přesného místa.\"\n />\n <Wrap spacing={2} mt={2}>\n {[\n 'Pozvánka na trénink se zaměřením na kondici',\n 'Oznámení přátelského zápasu pro fanoušky',\n 'Rodičovská schůzka mládeže stručný program',\n ].map((t, i) => (\n <WrapItem key={i}>\n <Tag size=\"sm\" variant=\"subtle\" colorScheme=\"blue\" _hover={{ cursor: 'pointer', opacity: 0.9 }} onClick={() => setAiPrompt(t)}>\n <TagLabel>{t}</TagLabel>\n </Tag>\n </WrapItem>\n ))}\n </Wrap>\n <HStack mt={3} spacing={3} align=\"center\">\n <FormControl maxW=\"220px\">\n <FormLabel mb={1}>Tón</FormLabel>\n <Select size=\"sm\" value={aiTone} onChange={(e)=> setAiTone(e.target.value as any)}>\n <option value=\"friendly\">Přátelský</option>\n <option value=\"informative\">Informační</option>\n <option value=\"formal\">Formální</option>\n </Select>\n </FormControl>\n <FormControl display=\"flex\" alignItems=\"center\">\n <FormLabel mb=\"0\">Přepsat existující obsah</FormLabel>\n <Switch isChecked={aiOverwrite} onChange={(e)=> setAiOverwrite(e.target.checked)} />\n </FormControl>\n <Tooltip label=\"AI doplní titul a popis podle zadaných informací.\" hasArrow>\n <Button\n size=\"sm\"\n onClick={generateWithAI}\n isLoading={aiLoading}\n leftIcon={<FiPlus size={14} />}\n bg=\"brand.primary\"\n color=\"text.onPrimary\"\n _hover={{ filter: 'brightness(0.95)' }}\n whiteSpace=\"nowrap\"\n >\n AI text\n </Button>\n </Tooltip>\n </HStack>\n </Box>\n <FormControl isRequired mb={3}>\n <FormLabel>Název</FormLabel>\n <Input value={editing?.title || ''} onChange={(e) => setEditing(prev => ({ ...(prev || {}), title: e.target.value }))} />\n {missingTitle && (\n <Text fontSize=\"sm\" color=\"orange.500\" mt={1}>Vyplňte název aktivity.</Text>\n )}\n </FormControl>\n\n <FormControl mb={3}>\n <FormLabel>Popis (Rich Text Editor)</FormLabel>\n <RichTextEditor\n value={editing?.description || ''}\n onChange={(value) => setEditing(prev => ({ ...(prev || {}), description: value }))}\n height=\"300px\"\n toolbar=\"full\"\n showImageResize={true}\n placeholder=\"Zadejte popis události...\"\n />\n </FormControl>\n\n {/* Activity Translation */}\n {editing?.title && editing?.description && (\n <UniversalTranslator\n title={editing.title}\n content={editing.description}\n contentType=\"activity\"\n onTranslationComplete={(translatedTitle, translatedContent) => {\n setEditing((prev) => ({\n ...(prev as any),\n title: translatedTitle,\n description: translatedContent,\n }));\n toast({\n title: 'Aktivita přeložena',\n description: 'Aktivita byla úspěšně přeložena a uložena do formuláře.',\n status: 'success',\n duration: 3000,\n });\n }}\n />\n )}\n\n <Box mb={3}>\n <FormLabel>YouTube Video (volitelné)</FormLabel>\n <Box borderWidth=\"1px\" borderRadius=\"md\" p={3} bg={useColorModeValue('gray.50', 'gray.900')}>\n <HStack mb={3} spacing={2}>\n <Button\n size=\"sm\"\n leftIcon={<FiYoutube />}\n onClick={() => setYoutubeTab('club')}\n variant={youtubeTab === 'club' ? 'solid' : 'outline'}\n colorScheme={youtubeTab === 'club' ? 'red' : 'gray'}\n >\n Z kanálu klubu ({clubVideos.length})\n </Button>\n <Button\n size=\"sm\"\n leftIcon={<FiLink />}\n onClick={() => setYoutubeTab('custom')}\n variant={youtubeTab === 'custom' ? 'solid' : 'outline'}\n colorScheme={youtubeTab === 'custom' ? 'blue' : 'gray'}\n >\n Vlastní odkaz\n </Button>\n </HStack>\n\n {youtubeTab === 'club' && (\n <Box>\n {clubVideos.length === 0 ? (\n <Text fontSize=\"sm\" color=\"gray.500\">\n Žádná videa z kanálu klubu. Nastavte YouTube kanál v Nastavení.\n </Text>\n ) : (\n <VStack align=\"stretch\" spacing={2} maxH=\"300px\" overflowY=\"auto\">\n {clubVideos.map((video) => {\n const videoUrl = `https://www.youtube.com/watch?v=${video.video_id}`;\n const isSelected = (editing as any)?.youtube_url?.includes(video.video_id);\n return (\n <HStack\n key={video.video_id}\n p={2}\n borderWidth=\"1px\"\n borderRadius=\"md\"\n borderColor={isSelected ? 'red.500' : borderColor}\n bg={isSelected ? useColorModeValue('red.50', 'red.900') : cardBg}\n cursor=\"pointer\"\n _hover={{ borderColor: 'red.300', bg: useColorModeValue('red.50', 'red.900') }}\n onClick={() => {\n setEditing(prev => ({ ...(prev || {}), youtube_url: videoUrl } as any));\n toast({\n title: 'Video vybráno',\n description: video.title,\n status: 'success',\n duration: 2000,\n });\n }}\n >\n <ChakraImage\n src={video.thumbnail_url}\n alt={video.title}\n boxSize=\"60px\"\n objectFit=\"cover\"\n borderRadius=\"md\"\n />\n <VStack align=\"start\" flex={1} spacing={0}>\n <Text fontSize=\"sm\" fontWeight=\"medium\" noOfLines={2}>\n {video.title}\n </Text>\n <HStack fontSize=\"xs\" color=\"gray.500\">\n {video.published_text && <Text>{video.published_text}</Text>}\n {video.views_text && <Text>• {video.views_text}</Text>}\n </HStack>\n </VStack>\n {isSelected && (\n <Badge colorScheme=\"red\">Vybráno</Badge>\n )}\n </HStack>\n );\n })}\n </VStack>\n )}\n </Box>\n )}\n\n {youtubeTab === 'custom' && (\n <VStack align=\"stretch\" spacing={2}>\n <Input \n value={(editing as any)?.youtube_url || ''} \n onChange={(e) => setEditing(prev => ({ ...(prev || {}), youtube_url: e.target.value } as any))} \n placeholder=\"https://www.youtube.com/watch?v=... nebo https://youtu.be/...\"\n />\n <Text fontSize=\"xs\" color=\"gray.500\">\n Vložte odkaz na jakékoliv YouTube video (nemusí být z vašeho kanálu).\n </Text>\n </VStack>\n )}\n \n {(editing as any)?.youtube_url && (\n <HStack mt={2} spacing={2}>\n <Badge colorScheme=\"green\" fontSize=\"xs\">Video nastaveno</Badge>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n colorScheme=\"red\"\n onClick={() => setEditing(prev => ({ ...(prev || {}), youtube_url: '' } as any))}\n >\n Zrušit video\n </Button>\n </HStack>\n )}\n </Box>\n </Box>\n <Box mt={3}>\n <Text fontWeight=\"bold\" mb={2}>Datum a čas</Text>\n <DateRangePicker\n from={startDate || undefined}\n to={endDate || undefined}\n onChange={(fromValue, toValue) => {\n setStartDate(fromValue || '');\n setEndDate(toValue || '');\n // Update start_time when from changes\n if (fromValue && startTime) {\n const iso = toISO(fromValue, startTime);\n setEditing(prev => ({ ...(prev || {}), start_time: iso || (prev as any)?.start_time }));\n }\n // Update end_time when to changes\n if (toValue && endTime) {\n const iso = toISO(toValue, endTime);\n setEditing(prev => ({ ...(prev || {}), end_time: iso as any }));\n }\n }}\n size=\"sm\"\n />\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={3} mt={3}>\n <FormControl isRequired>\n <FormLabel>Čas začátku</FormLabel>\n <Input type=\"time\" step=\"900\" value={startTime} onChange={(e) => {\n const v = e.target.value; setStartTime(v);\n if (startDate) {\n const iso = toISO(startDate, v);\n // Auto-shift end if needed\n setEditing(prev => {\n const nextStart = iso;\n const prevEnd = prev?.end_time ? new Date(prev.end_time as any) : null;\n let nextEndISO = prev?.end_time as any;\n if (prevEnd && nextStart && prevEnd.getTime() < new Date(nextStart).getTime()) {\n nextEndISO = new Date(new Date(nextStart).getTime() + 60*60*1000).toISOString() as any;\n }\n return ({ ...(prev || {}), start_time: nextStart, end_time: nextEndISO });\n });\n }\n }} />\n {missingStart && (\n <Text fontSize=\"sm\" color=\"orange.500\" mt={1}>Vyplňte datum i čas začátku.</Text>\n )}\n </FormControl>\n <FormControl>\n <FormLabel>Čas konce (volitelné)</FormLabel>\n <Input type=\"time\" step=\"900\" value={endTime} onChange={(e) => {\n const v = e.target.value; setEndTime(v);\n if (endDate) {\n const iso = toISO(endDate, v);\n setEditing(prev => ({ ...(prev || {}), end_time: iso as any }));\n }\n }} />\n <HStack mt={2}>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setEditing(prev => {\n if (!prev?.start_time) return prev || {};\n const start = new Date(prev.start_time as any).getTime();\n const end = new Date(start + 60*60*1000).toISOString();\n return ({ ...(prev || {}), end_time: end });\n })}>+60m</Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setEditing(prev => {\n if (!prev?.start_time) return prev || {};\n const start = new Date(prev.start_time as any).getTime();\n const end = new Date(start + 90*60*1000).toISOString();\n return ({ ...(prev || {}), end_time: end });\n })}>+90m</Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setEditing(prev => {\n if (!prev?.start_time) return prev || {};\n const start = new Date(prev.start_time as any).getTime();\n const end = new Date(start + 120*60*1000).toISOString();\n return ({ ...(prev || {}), end_time: end });\n })}>+120m</Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => { setEndDate(''); setEndTime(''); setEditing(prev => ({ ...(prev || {}), end_time: null })); }}>Zrušit</Button>\n </HStack>\n </FormControl>\n </SimpleGrid>\n {/* Quick presets for start time */}\n <HStack mt={2} spacing={2}>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setEditing(prev => {\n const now = new Date();\n const m = now.getMinutes();\n const rounded = new Date(now.getTime() + ((15 - (m % 15)) % 15) * 60000);\n const yyyy = rounded.getFullYear();\n const mm = String(rounded.getMonth() + 1).padStart(2, '0');\n const dd = String(rounded.getDate()).padStart(2, '0');\n const hh = String(rounded.getHours()).padStart(2, '0');\n const min = String(rounded.getMinutes()).padStart(2, '0');\n setStartDate(`${yyyy}-${mm}-${dd}`);\n setStartTime(`${hh}:${min}`);\n return ({ ...(prev || {}), start_time: rounded.toISOString() as any });\n })}>Nyní (zaokrouhlit 15m)</Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setEditing(prev => {\n const d = new Date(); d.setHours(18,0,0,0);\n const yyyy = d.getFullYear();\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const dd = String(d.getDate()).padStart(2, '0');\n setStartDate(`${yyyy}-${mm}-${dd}`);\n setStartTime(`18:00`);\n return ({ ...(prev || {}), start_time: d.toISOString() as any });\n })}>Dnes 18:00</Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setEditing(prev => {\n const d = new Date(); d.setDate(d.getDate()+1); d.setHours(18,0,0,0);\n const yyyy = d.getFullYear();\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const dd = String(d.getDate()).padStart(2, '0');\n setStartDate(`${yyyy}-${mm}-${dd}`);\n setStartTime(`18:00`);\n return ({ ...(prev || {}), start_time: d.toISOString() as any });\n })}>Zítra 18:00</Button>\n <Tooltip label=\"Rychlé nastavení zítřejšího rána\" hasArrow>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setEditing(prev => {\n const d = new Date(); d.setDate(d.getDate()+1); d.setHours(9,0,0,0);\n const yyyy = d.getFullYear();\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const dd = String(d.getDate()).padStart(2, '0');\n setStartDate(`${yyyy}-${mm}-${dd}`);\n setStartTime(`09:00`);\n return ({ ...(prev || {}), start_time: d.toISOString() as any });\n })}>Zítra 9:00</Button>\n </Tooltip>\n </HStack>\n <Text mt={2} fontSize=\"xs\" color=\"gray.500\">Časová zóna: {Intl.DateTimeFormat().resolvedOptions().timeZone}</Text>\n </Box>\n <Box mt={4}>\n <Heading size=\"sm\" mb={3}>Místo konání</Heading>\n \n <Box bg={useColorModeValue('gray.50', 'gray.900')} p={4} borderRadius=\"md\" borderWidth=\"1px\" mb={3}>\n <FormControl>\n <FormLabel fontSize=\"sm\">Uložená místa (rychlý výběr)</FormLabel>\n <HStack spacing={2} align=\"center\">\n <Select\n size=\"sm\"\n placeholder=\"Vyberte uložené místo...\"\n value={selectedSavedId}\n onChange={(e) => applySavedLocation(e.target.value)}\n flex={1}\n >\n {savedLocations.map((loc) => (\n <option key={loc.id} value={loc.id}>\n {loc.label}{loc.address ? ` — ${loc.address}` : ''}\n </option>\n ))}\n </Select>\n <Button size=\"sm\" variant=\"outline\" onClick={addCurrentLocationToSaved}>Uložit aktuální</Button>\n <Button size=\"sm\" variant=\"ghost\" colorScheme=\"red\" onClick={deleteSelectedSaved} isDisabled={!selectedSavedId || selectedSavedId === 'club-main'}>Smazat</Button>\n </HStack>\n <Text fontSize=\"xs\" color={textSecondary} mt={1}>Vyberte klubové nebo dříve uložené místo. „Uložit aktuální“ přidá současný název/adresu a souřadnice.</Text>\n </FormControl>\n </Box>\n \n {/* MapLinkImporter */}\n <Box bg={useColorModeValue('gray.50', 'gray.900')} p={4} borderRadius=\"md\" borderWidth=\"1px\" mb={3}>\n <Text fontSize=\"sm\" fontWeight=\"semibold\" mb={2}>Importovat z odkazu na mapu</Text>\n <MapLinkImporter\n currentLatitude={locationLat}\n currentLongitude={locationLng}\n mapStyle={settingsQ.data?.map_style || 'positron'}\n clubPrimaryColor={settingsQ.data?.primary_color}\n clubSecondaryColor={settingsQ.data?.accent_color}\n clubName={editing?.title || editing?.location || 'Místo události'}\n onImport={(coords: MapCoordinates) => {\n setLocationLat(coords.latitude);\n setLocationLng(coords.longitude);\n \n // Build location string from address data\n let locationString = '';\n if (coords.address) {\n // Use full address if available\n locationString = coords.address;\n } else {\n // Build address from parts\n const parts: string[] = [];\n if (coords.street) parts.push(coords.street);\n if (coords.city) parts.push(coords.city);\n if (coords.zip) parts.push(coords.zip);\n locationString = parts.join(', ');\n }\n \n // Save coordinates and location to the event\n setEditing(prev => ({\n ...(prev || {}),\n latitude: coords.latitude,\n longitude: coords.longitude,\n location: locationString || prev?.location || '',\n } as any));\n \n toast({\n title: 'Místo importováno',\n description: locationString || `Lat: ${coords.latitude.toFixed(6)}, Lng: ${coords.longitude.toFixed(6)}`,\n status: 'success',\n duration: 3000,\n });\n }}\n />\n </Box>\n\n <HStack spacing={3} align=\"start\" mt={3}>\n <FormControl flex={2}>\n <FormLabel>Název místa / Adresa</FormLabel>\n <Input \n value={editing?.location || ''} \n onChange={(e) => setEditing(prev => ({ ...(prev || {}), location: e.target.value }))} \n placeholder=\"např. Sportovní hala TJ Sokol\"\n />\n <Text fontSize=\"xs\" color=\"gray.500\" mt={1}>Zobrazí se návštěvníkům (s možnou mapou)</Text>\n </FormControl>\n <FormControl flex={1}>\n <FormLabel>Typ</FormLabel>\n <Select value={(editing?.type as any) || 'other'} onChange={(e) => setEditing(prev => ({ ...(prev || {}), type: e.target.value as any }))}>\n {types.map(t => (<option key={t.value} value={t.value}>{t.label}</option>))}\n </Select>\n </FormControl>\n </HStack>\n </Box>\n <FormControl mt={3}>\n <FormLabel>Kategorie (soutěž)</FormLabel>\n <Select\n placeholder=\"Vyberte kategorii (volitelné)\"\n value={(editing as any)?.category_name || ''}\n onChange={(e) => setEditing(prev => ({ ...(prev || {}), category_name: e.target.value } as any))}\n >\n {competitions.map((c, idx) => (\n <option key={(c.code || c.name) + '_' + idx} value={(c.code && aliasesMap[c.code]) ? aliasesMap[c.code] : c.name}>\n {(c.code && aliasesMap[c.code]) ? aliasesMap[c.code] : c.name}\n </option>\n ))}\n </Select>\n </FormControl>\n\n {/* UploadPanel for activity cover image */}\n <FormControl mt={3}>\n <FormLabel>Obrázek/náhled</FormLabel>\n <VStack align=\"stretch\" spacing={3}>\n <UploadPanel\n label=\"Obrázek aktivity\"\n description=\"Nahrajte nebo přetáhněte obrázek/náhled pro aktivitu.\"\n accept=\"image/*\"\n multiple={false}\n maxFiles={1}\n allowUrlImport\n urlPlaceholder=\"/uploads/... nebo https://example.com/obrazek.jpg\"\n onChange={(files) => {\n const last = files[files.length - 1];\n setEditing((prev) => ({\n ...(prev || {}),\n image_url: last?.url || (prev as any)?.image_url || '',\n } as any));\n }}\n />\n <HStack align=\"center\" spacing={3}>\n <Box boxSize=\"80px\" borderRadius=\"md\" overflow=\"hidden\" bg=\"gray.100\">\n {editing?.image_url ? (\n <ThumbnailPreview\n src={assetUrl(editing.image_url as any) || editing.image_url}\n alt={editing.title || 'Náhled aktivity'}\n size=\"80px\"\n previewSize=\"350px\"\n />\n ) : (\n <ChakraImage\n src={assetUrl(settingsQ.data?.club_logo_url) || assetUrl('/dist/img/logo-club-empty.svg') || '/dist/img/logo-club-empty.svg'}\n alt=\"No image\"\n boxSize=\"80px\"\n objectFit=\"contain\"\n opacity={0.4}\n />\n )}\n </Box>\n <Input\n value={(editing as any)?.image_url || ''}\n onChange={(e) => setEditing(prev => ({ ...(prev || {}), image_url: e.target.value } as any))}\n placeholder=\"/uploads/...jpg\"\n />\n </HStack>\n <Text fontSize=\"xs\" color=\"gray.500\">\n Doporučený poměr stran 16:9, minimálně 1200×675 px.\n </Text>\n </VStack>\n </FormControl>\n\n {/* Attachments */}\n <FormControl mt={4}>\n <FormLabel>Přílohy (dokumenty, obrázky, ZIP)</FormLabel>\n <FormHelperText mb={2}>\n Přidejte dokumenty k aktivitě (PDF, Word, Excel, PowerPoint, obrázky, ZIP). Přílohy se zobrazí pod textem události.\n </FormHelperText>\n <UploadPanel\n label=\"Přílohy aktivity\"\n description=\"Nahrajte dokumenty, obrázky nebo archivy jako přílohy k aktivitě.\"\n accept=\".pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.jpg,.jpeg,.png,.gif,.webp,.txt,.zip,.rar\"\n multiple\n maxFiles={30}\n uploadFn={uploadAttachmentFile}\n onUploadFinished={(uploaded) => {\n if (!uploaded || uploaded.length === 0) return;\n setEditing((prev) => {\n const prevAtts = Array.isArray((prev as any)?.attachments)\n ? (prev as any).attachments\n : [];\n const mapped = uploaded.map((f) => ({\n name: f.name,\n url: f.url,\n mime_type: f.type,\n size: f.size,\n }));\n return {\n ...(prev || {}),\n attachments: [...prevAtts, ...mapped],\n } as any;\n });\n }}\n />\n <Box mt={2}>\n {Array.isArray((editing as any)?.attachments) && (editing as any).attachments.length > 0 ? (\n <Table size=\"sm\" variant=\"simple\">\n <Thead>\n <Tr>\n <Th>Název</Th>\n <Th>Velikost</Th>\n <Th>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {((editing as any).attachments as any[]).map((att: any, idx: number) => (\n <Tr key={idx}>\n <Td colSpan={3} p={2}>\n <HStack justify=\"space-between\" w=\"full\">\n <Box flex={1}>\n <FilePreview\n url={att.url}\n name={att.name}\n mimeType={att.mime_type}\n size={att.size}\n />\n </Box>\n <Button\n size=\"xs\"\n variant=\"outline\"\n colorScheme=\"red\"\n flexShrink={0}\n ml={2}\n onClick={() =>\n setEditing((prev) => ({\n ...(prev as any),\n attachments: ((prev as any).attachments || []).filter((_: any, i: number) => i !== idx),\n }))\n }\n >\n Odebrat\n </Button>\n </HStack>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n ) : (\n <Box color=\"gray.500\">Žádné přílohy</Box>\n )}\n </Box>\n </FormControl>\n\n {/* Poll Section */}\n <Box mt={6} pt={4} borderTopWidth=\"1px\" borderColor={borderColor}>\n <Heading size=\"sm\" mb={3}>Anketa</Heading>\n {isAdmin && editing?.id ? (\n <PollLinker eventId={editing.id} />\n ) : (\n <Box bg={useColorModeValue('blue.50', 'blue.900')} p={4} borderRadius=\"md\" borderWidth=\"1px\" borderColor=\"blue.200\">\n <Text fontSize=\"sm\" color={useColorModeValue('blue.700', 'blue.200')}>\n 💡 Nejprve uložte aktivitu, poté budete moci vytvořit nebo připojit anketu přímo zde.\n </Text>\n </Box>\n )}\n </Box>\n </ModalBody>\n <ModalFooter>\n <HStack w=\"100%\" justify=\"space-between\">\n <Text fontSize=\"xs\" color=\"gray.500\">\n Ukládáním souhlasíte s publikací podle nastavení „Veřejná“.\n </Text>\n <HStack>\n <Button variant=\"ghost\" mr={1} onClick={closeModal}>Zrušit</Button>\n <Button bg=\"brand.primary\" color=\"text.onPrimary\" _hover={{ filter: 'brightness(0.95)' }} onClick={onSubmit} isLoading={createMut.isLoading || updateMut.isLoading}>Uložit</Button>\n </HStack>\n </HStack>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n \n <AILoadingModal\n isOpen={aiLoading}\n onClose={() => {}} // Can't close while AI is working\n title=\"AI generuje aktivitu\"\n message=\"AI pracuje na generování obsahu pro aktivitu...\"\n progress={aiProgress}\n estimatedTime={aiStartTime ? 30 : undefined} // 30 seconds estimated\n />\n\n </Box>\n </AdminLayout>\n );\n};\n\nexport default AdminActivitiesPage;\n","import React, { useState } from 'react';\nimport {\n Box,\n VStack,\n HStack,\n Text,\n Button,\n Radio,\n RadioGroup,\n Checkbox,\n CheckboxGroup,\n Progress,\n Badge,\n useToast,\n Image,\n Heading,\n useColorModeValue,\n Input,\n FormControl,\n FormLabel,\n Link,\n} from '@chakra-ui/react';\nimport { useMutation, useQueryClient, useQuery } from '@tanstack/react-query';\nimport { CheckIcon, StarIcon } from '@chakra-ui/icons';\nimport {\n Poll,\n PollOption,\n PollResultsResponse,\n votePoll,\n getPollResults,\n generateSessionToken,\n} from '../../services/polls';\nimport { useUmami } from '../../hooks/useUmami';\nimport { useAuth } from '../../contexts/AuthContext';\nimport { Link as RouterLink, useLocation } from 'react-router-dom';\nimport { useTranslation } from 'react-i18next';\n\ninterface PollCardProps {\n poll: Poll;\n hasVoted: boolean;\n isActive: boolean;\n canShowResults: boolean;\n onVoteSuccess?: () => void;\n // When true, render transparent card without own bg/border/shadow\n flat?: boolean;\n}\n\nconst PollCard: React.FC<PollCardProps> = ({\n poll,\n hasVoted: initialHasVoted,\n isActive,\n canShowResults: initialCanShowResults,\n onVoteSuccess,\n flat = false,\n}) => {\n const { t } = useTranslation();\n const toast = useToast();\n const queryClient = useQueryClient();\n const { trackEvent } = useUmami();\n const { isAuthenticated, user } = useAuth();\n const location = useLocation();\n const [selectedOptions, setSelectedOptions] = useState<number[]>([]);\n const [hasVoted, setHasVoted] = useState(initialHasVoted);\n const [canShowResults, setCanShowResults] = useState(initialCanShowResults);\n const [results, setResults] = useState<any[]>([]);\n const [showingResults, setShowingResults] = useState(initialCanShowResults);\n const [voterName, setVoterName] = useState('');\n const [voterEmail, setVoterEmail] = useState('');\n const isRating = poll.type === 'rating';\n const ratingOptionsSorted = [...poll.options].sort((a, b) => (a.display_order || 0) - (b.display_order || 0));\n const maxRating = ratingOptionsSorted.length > 0\n ? Math.max(...ratingOptionsSorted.map(o => (o.display_order || 0))) || ratingOptionsSorted.length\n : 5;\n const [ratingValue, setRatingValue] = useState<number | null>(null);\n const selectedStyle = (poll as any).style || 'auto';\n const resolvedStyle = (() => {\n if (selectedStyle !== 'auto') return selectedStyle;\n if (isRating) return maxRating <= 5 ? 'rating-stars' : 'rating-scale';\n return 'choices-list';\n })();\n\n const selectOptionForRating = (value: number) => {\n setRatingValue(value);\n const byOrder = ratingOptionsSorted.find(o => (o.display_order || 0) === value);\n const fallback = ratingOptionsSorted[value - 1];\n const opt = byOrder || fallback;\n if (opt) {\n setSelectedOptions([opt.id]);\n }\n };\n\n const bgCard = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.600');\n const hoverBg = useColorModeValue('gray.50', 'gray.700');\n\n // Live results polling when results are visible and allowed\n const showLiveResults = canShowResults && showingResults;\n const { data: liveResultsData } = useQuery<PollResultsResponse>({\n queryKey: ['poll-results', poll.id],\n queryFn: () => getPollResults(poll.id),\n enabled: showLiveResults,\n refetchInterval: 30000,\n refetchOnWindowFocus: false,\n });\n\n // Vote mutation\n const voteMutation = useMutation({\n mutationFn: () => {\n const sessionToken = generateSessionToken();\n return votePoll(poll.id, {\n option_ids: selectedOptions,\n session_token: sessionToken,\n voter_name: voterName || (isAuthenticated ? (user as any)?.name : undefined),\n voter_email: voterEmail || (isAuthenticated ? user?.email : undefined),\n });\n },\n onSuccess: async () => {\n setHasVoted(true);\n setCanShowResults(true);\n setShowingResults(true);\n \n // Fetch results\n try {\n const resultsData = await getPollResults(poll.id);\n setResults(resultsData.results);\n } catch (error) {\n console.error('Failed to fetch results:', error);\n }\n\n queryClient.invalidateQueries({ queryKey: ['polls'] });\n queryClient.invalidateQueries({ queryKey: ['poll', poll.id] });\n queryClient.invalidateQueries({ queryKey: ['poll-results', poll.id] });\n\n toast({\n title: 'Hlas zaznamenán!',\n description: 'Děkujeme za vaši účast v anketě.',\n status: 'success',\n duration: 3000,\n });\n\n // Analytics tracking (Umami + backend)\n try {\n trackEvent('Poll Vote', {\n poll_id: poll.id,\n poll_title: poll.title,\n type: poll.type,\n option_ids: selectedOptions,\n rating: ratingValue || undefined,\n });\n } catch (e) {\n // swallow\n }\n\n if (onVoteSuccess) {\n onVoteSuccess();\n }\n\n try {\n window.dispatchEvent(new CustomEvent('engagement:refresh'));\n } catch {}\n },\n onError: (error: any) => {\n toast({\n title: 'Chyba',\n description: error.response?.data?.error || 'Nepodařilo se zaznamenat váš hlas',\n status: 'error',\n duration: 5000,\n });\n },\n });\n\n const handleVote = () => {\n if (selectedOptions.length === 0) {\n toast({\n title: 'Vyberte možnost',\n description: 'Před hlasováním vyberte alespoň jednu možnost.',\n status: 'warning',\n duration: 3000,\n });\n return;\n }\n\n if (poll.allow_multiple && selectedOptions.length > poll.max_choices) {\n toast({\n title: 'Příliš mnoho voleb',\n description: `Můžete vybrat maximálně ${poll.max_choices} možností.`,\n status: 'warning',\n duration: 3000,\n });\n return;\n }\n\n voteMutation.mutate();\n };\n\n const handleSingleChoice = (value: string) => {\n setSelectedOptions([parseInt(value)]);\n };\n\n const handleMultipleChoice = (values: (string | number)[]) => {\n const numValues = values.map((v) => (typeof v === 'string' ? parseInt(v) : v));\n if (numValues.length <= poll.max_choices) {\n setSelectedOptions(numValues);\n }\n };\n\n const handleOptionClick = (optionId: number) => {\n if (poll.allow_multiple) {\n const isSelected = selectedOptions.includes(optionId);\n if (isSelected) {\n setSelectedOptions(selectedOptions.filter((id) => id !== optionId));\n } else {\n if (selectedOptions.length >= poll.max_choices) {\n toast({\n title: 'Příliš mnoho voleb',\n description: `Můžete vybrat maximálně ${poll.max_choices} možností.`,\n status: 'warning',\n duration: 3000,\n });\n return;\n }\n setSelectedOptions([...selectedOptions, optionId]);\n }\n } else {\n setSelectedOptions([optionId]);\n }\n };\n\n const loadResults = async () => {\n try {\n const resultsData = await getPollResults(poll.id);\n setResults(resultsData.results);\n setShowingResults(true);\n } catch (error: any) {\n toast({\n title: 'Chyba',\n description: 'Nepodařilo se načíst výsledky',\n status: 'error',\n duration: 3000,\n });\n }\n };\n\n const calculatePercentage = (voteCount: number) => {\n if (poll.total_votes === 0) return 0;\n return (voteCount / poll.total_votes) * 100;\n };\n\n // Show results if available\n if (showingResults && canShowResults) {\n const totalVotesToShow = liveResultsData?.total_votes ?? poll.total_votes;\n const displayResults = liveResultsData?.results || (results.length > 0 ? results : poll.options.map(opt => ({\n option_id: opt.id,\n text: opt.text,\n vote_count: opt.vote_count,\n percentage: totalVotesToShow ? (opt.vote_count / totalVotesToShow) * 100 : 0,\n image_url: opt.image_url,\n })));\n\n return (\n <Box\n className={flat ? undefined : 'card'}\n bg={flat ? 'transparent' : bgCard}\n borderWidth={flat ? '0' : '1px'}\n borderColor={flat ? 'transparent' : borderColor}\n p={flat ? 0 : 6}\n >\n <VStack spacing={4} align=\"stretch\">\n {poll.image_url && (\n <Image\n src={poll.image_url}\n alt={poll.title}\n borderRadius=\"lg\"\n maxH=\"200px\"\n objectFit=\"cover\"\n />\n )}\n\n <HStack justify=\"space-between\" align=\"start\">\n <Heading size=\"md\">{poll.title}</Heading>\n {hasVoted && (\n <Badge colorScheme=\"green\" fontSize=\"sm\">\n <HStack spacing={1}>\n <CheckIcon boxSize={3} />\n <Text>Hlasováno</Text>\n </HStack>\n </Badge>\n )}\n </HStack>\n\n {poll.description && (\n <Text fontSize=\"sm\" color=\"gray.600\">\n {poll.description}\n </Text>\n )}\n\n <VStack spacing={3} align=\"stretch\">\n <Text fontWeight=\"bold\" fontSize=\"sm\" color=\"gray.500\">\n Výsledky ({totalVotesToShow} hlasů)\n </Text>\n {displayResults.map((result) => (\n <Box key={result.option_id}>\n <HStack justify=\"space-between\" mb={1}>\n <Text fontWeight=\"medium\">{result.text}</Text>\n <Text fontSize=\"sm\" color=\"gray.500\">\n {result.vote_count} ({result.percentage.toFixed(1)}%)\n </Text>\n </HStack>\n <Progress\n value={result.percentage}\n colorScheme=\"blue\"\n borderRadius=\"full\"\n size=\"sm\"\n />\n </Box>\n ))}\n </VStack>\n </VStack>\n </Box>\n );\n }\n\n // Show voting form\n return (\n <Box\n className={flat ? undefined : 'card'}\n bg={flat ? 'transparent' : bgCard}\n borderWidth={flat ? '0' : '1px'}\n borderColor={flat ? 'transparent' : borderColor}\n p={flat ? 0 : 6}\n >\n <VStack spacing={4} align=\"stretch\">\n {poll.image_url && (\n <Image\n src={poll.image_url}\n alt={poll.title}\n borderRadius=\"lg\"\n maxH=\"200px\"\n objectFit=\"cover\"\n />\n )}\n\n <Heading size=\"md\">{poll.title}</Heading>\n\n {poll.description && (\n <Text fontSize=\"sm\" color=\"gray.600\">\n {poll.description}\n </Text>\n )}\n\n {!isActive && (\n <Badge colorScheme=\"orange\">Anketa je momentálně uzavřena</Badge>\n )}\n\n {isActive && (\n <>\n {resolvedStyle === 'rating-stars' && (\n <VStack align=\"stretch\" spacing={2}>\n <HStack>\n {Array.from({ length: maxRating }).map((_, i) => (\n <StarIcon\n key={i}\n boxSize={6}\n cursor=\"pointer\"\n color={i < (ratingValue || 0) ? 'yellow.400' : 'gray.300'}\n onClick={() => selectOptionForRating(i + 1)}\n />\n ))}\n <Text ml={2}>{ratingValue ? `${ratingValue}/${maxRating}` : 'Vyberte hodnocení'}</Text>\n </HStack>\n </VStack>\n )}\n {resolvedStyle === 'rating-scale' && (\n <HStack flexWrap=\"wrap\" spacing={2}>\n {Array.from({ length: maxRating }).map((_, i) => (\n <Button\n key={i}\n size=\"sm\"\n variant={ratingValue === i + 1 ? 'solid' : 'outline'}\n colorScheme=\"blue\"\n onClick={() => selectOptionForRating(i + 1)}\n >\n {i + 1}\n </Button>\n ))}\n </HStack>\n )}\n {resolvedStyle === 'choices-chips' && (\n <VStack align=\"stretch\" spacing={2}>\n {poll.allow_multiple && (\n <Text fontSize=\"sm\" color=\"gray.500\">Vyberte až {poll.max_choices} možností</Text>\n )}\n <HStack flexWrap=\"wrap\" spacing={2}>\n {poll.options.map((option) => {\n const isSelected = selectedOptions.includes(option.id);\n return (\n <Button\n key={option.id}\n size=\"sm\"\n borderRadius=\"full\"\n variant={isSelected ? 'solid' : 'outline'}\n colorScheme=\"blue\"\n onClick={() => handleOptionClick(option.id)}\n >\n {option.text}\n </Button>\n );\n })}\n </HStack>\n </VStack>\n )}\n {resolvedStyle === 'choices-cards' && (\n <VStack spacing={3} align=\"stretch\">\n {poll.options.map((option) => {\n const isSelected = selectedOptions.includes(option.id);\n return (\n <Box\n key={option.id}\n p={3}\n borderWidth={isSelected ? '2px' : '1px'}\n borderColor={isSelected ? 'blue.400' : borderColor}\n borderRadius=\"md\"\n _hover={{ bg: hoverBg }}\n cursor=\"pointer\"\n onClick={() => handleOptionClick(option.id)}\n >\n <HStack align=\"start\" spacing={3}>\n {option.image_url && (\n <Image src={option.image_url} alt={option.text} boxSize=\"48px\" objectFit=\"cover\" borderRadius=\"md\" />\n )}\n <VStack align=\"start\" spacing={1} flex={1}>\n <Text fontWeight=\"medium\">{option.text}</Text>\n {option.description && (\n <Text fontSize=\"xs\" color=\"gray.500\">{option.description}</Text>\n )}\n </VStack>\n </HStack>\n </Box>\n );\n })}\n </VStack>\n )}\n {resolvedStyle === 'choices-list' && (\n <>\n {poll.allow_multiple ? (\n <CheckboxGroup\n value={selectedOptions.map(String)}\n onChange={handleMultipleChoice}\n >\n <VStack spacing={2} align=\"stretch\">\n <Text fontSize=\"sm\" color=\"gray.500\">\n Vyberte až {poll.max_choices} možností\n </Text>\n {poll.options.map((option) => (\n <Box\n key={option.id}\n p={3}\n borderWidth=\"1px\"\n borderRadius=\"md\"\n _hover={{ bg: hoverBg }}\n cursor=\"pointer\"\n role=\"button\"\n tabIndex={0}\n onClick={() => handleOptionClick(option.id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleOptionClick(option.id);\n }\n }}\n >\n <Checkbox value={String(option.id)} onClick={(e) => e.stopPropagation()}>\n <VStack align=\"start\" spacing={1}>\n <Text>{option.text}</Text>\n {option.description && (\n <Text fontSize=\"xs\" color=\"gray.500\">\n {option.description}\n </Text>\n )}\n </VStack>\n </Checkbox>\n </Box>\n ))}\n </VStack>\n </CheckboxGroup>\n ) : (\n <RadioGroup\n value={selectedOptions[0]?.toString() || ''}\n onChange={handleSingleChoice}\n >\n <VStack spacing={2} align=\"stretch\">\n {poll.options.map((option) => (\n <Box\n key={option.id}\n p={3}\n borderWidth=\"1px\"\n borderRadius=\"md\"\n _hover={{ bg: hoverBg }}\n cursor=\"pointer\"\n role=\"button\"\n tabIndex={0}\n onClick={() => handleOptionClick(option.id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleOptionClick(option.id);\n }\n }}\n >\n <Radio value={String(option.id)} onClick={(e) => e.stopPropagation()}>\n <VStack align=\"start\" spacing={1}>\n <Text>{option.text}</Text>\n {option.description && (\n <Text fontSize=\"xs\" color=\"gray.500\">\n {option.description}\n </Text>\n )}\n {option.player && (\n <HStack spacing={2}>\n {option.player.image_url && (\n <Image\n src={option.player.image_url}\n alt={`${option.player.first_name} ${option.player.last_name}`}\n boxSize=\"24px\"\n borderRadius=\"full\"\n />\n )}\n <Text fontSize=\"xs\" color=\"gray.500\">\n #{option.player.jersey_number} {option.player.first_name}{' '}\n {option.player.last_name}\n </Text>\n </HStack>\n )}\n </VStack>\n </Radio>\n </Box>\n ))}\n </VStack>\n </RadioGroup>\n )}\n </>\n )}\n\n {isAuthenticated ? (\n <VStack spacing={3} align=\"stretch\">\n <FormControl>\n <FormLabel fontSize=\"sm\">Jméno (volitelné)</FormLabel>\n <Input\n size=\"sm\"\n autoComplete=\"name\"\n value={voterName || ((user as any)?.name || '')}\n onChange={(e) => setVoterName(e.target.value)}\n />\n </FormControl>\n <FormControl>\n <FormLabel fontSize=\"sm\">E-mail (volitelné)</FormLabel>\n <Input\n size=\"sm\"\n type=\"email\"\n autoComplete=\"email\"\n value={voterEmail || (user?.email || '')}\n onChange={(e) => setVoterEmail(e.target.value)}\n />\n </FormControl>\n </VStack>\n ) : (\n <VStack spacing={3} align=\"stretch\">\n <FormControl>\n <FormLabel fontSize=\"sm\">Jméno (volitelné)</FormLabel>\n <Input\n size=\"sm\"\n autoComplete=\"name\"\n value={voterName}\n onChange={(e) => setVoterName(e.target.value)}\n />\n </FormControl>\n <FormControl>\n <FormLabel fontSize=\"sm\">E-mail (volitelné)</FormLabel>\n <Input\n size=\"sm\"\n type=\"email\"\n autoComplete=\"email\"\n value={voterEmail}\n onChange={(e) => setVoterEmail(e.target.value)}\n />\n </FormControl>\n <Text fontSize=\"xs\" color=\"gray.500\">\n Přihlášením se jméno a e-mail doplní automaticky.{' '}\n <Link as={RouterLink} color=\"blue.500\" to=\"/login\" state={{ from: location }}>\n {t('auth.login')}\n </Link>\n </Text>\n </VStack>\n )}\n\n <Button\n colorScheme=\"blue\"\n onClick={handleVote}\n isLoading={voteMutation.isPending}\n isDisabled={!isActive || selectedOptions.length === 0}\n >\n Hlasovat\n </Button>\n </>\n )}\n\n {canShowResults && !showingResults && (\n <Button variant=\"outline\" onClick={loadResults} size=\"sm\">\n Zobrazit výsledky\n </Button>\n )}\n\n <Text fontSize=\"xs\" color=\"gray.500\" textAlign=\"center\">\n Celkem hlasů: {liveResultsData?.total_votes ?? poll.total_votes}\n </Text>\n </VStack>\n </Box>\n );\n};\n\nexport default PollCard;\n","import { getRecentActions } from './actionLog';\n\nexport type FEErrorEvent = {\n origin: 'frontend';\n language?: 'ts' | 'tsx' | string;\n severity?: 'error' | 'warn' | 'fatal';\n message: string;\n stack?: string;\n component?: string;\n file?: string;\n line?: number;\n column?: number;\n url?: string;\n method?: string;\n status?: number;\n request_id?: string;\n user_id?: number;\n session_token?: string;\n tags?: Record<string, string>;\n context?: Record<string, any>;\n env?: string;\n version?: string;\n hostname?: string;\n occurred_at?: string;\n};\n\nfunction readLS(key: string): string | null {\n try { return localStorage.getItem(key); } catch { return null; }\n}\n\nfunction getIngestUrl(): string | null {\n if (process.env.REACT_APP_ERROR_INGEST_URL) return process.env.REACT_APP_ERROR_INGEST_URL as string;\n try {\n if (typeof window !== 'undefined') {\n const host = window.location.hostname || '';\n const isLocal = host === 'localhost' || host === '127.0.0.1' || host === '::1' || /^[0-9.]+$/.test(host) || host.endsWith('.local');\n if (!isLocal) {\n return 'https://errors.tdvorak.dev/api/v1/errors';\n }\n }\n } catch {}\n return '/api/v1/errors';\n}\n\nfunction getIngestToken(): string | null {\n return (process.env.REACT_APP_ERROR_INGEST_TOKEN as string) || null;\n}\n\nlet lastSentAt = 0;\nlet lastHash = '';\n\nfunction fingerprint(ev: FEErrorEvent): string {\n const basis = [ev.message, ev.stack || '', ev.url || '', ev.component || ''].join('|');\n let h = 0;\n for (let i = 0; i < basis.length; i++) {\n h = ((h << 5) - h) + basis.charCodeAt(i);\n h |= 0;\n }\n return String(h);\n}\n\nexport async function reportError(ev: Partial<FEErrorEvent>): Promise<void> {\n const url = getIngestUrl();\n if (!url) return; // disabled until configured\n\n const now = Date.now();\n const full: FEErrorEvent = {\n origin: 'frontend',\n language: ev.language || 'tsx',\n severity: ev.severity || 'error',\n message: ev.message || 'Unknown error',\n stack: ev.stack,\n component: ev.component,\n file: ev.file,\n line: ev.line,\n column: ev.column,\n url: ev.url || (typeof window !== 'undefined' ? window.location.pathname + window.location.search : undefined),\n method: ev.method,\n status: ev.status,\n request_id: ev.request_id,\n user_id: ev.user_id,\n session_token: ev.session_token,\n tags: {\n service: 'frontend',\n instance_env: String(process.env.NODE_ENV || ''),\n instance_host: (typeof window !== 'undefined' && window.location && window.location.hostname) ? window.location.hostname : '',\n ...(ev.tags || {}),\n },\n context: {\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n referrer: typeof document !== 'undefined' ? document.referrer : undefined,\n viewport: typeof window !== 'undefined' ? { w: window.innerWidth, h: window.innerHeight } : undefined,\n recentActions: getRecentActions(18),\n ...ev.context,\n },\n env: ev.env || process.env.NODE_ENV,\n version: ev.version,\n hostname: ev.hostname || (typeof window !== 'undefined' ? window.location.hostname : undefined),\n occurred_at: new Date(now).toISOString(),\n };\n\n const hash = fingerprint(full);\n if (hash === lastHash && (now - lastSentAt) < 1500) {\n return; // basic de-dupe burst\n }\n lastHash = hash;\n lastSentAt = now;\n\n try {\n await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(getIngestToken() ? { 'Authorization': `Bearer ${getIngestToken()}` } : {}),\n },\n body: JSON.stringify(full),\n credentials: 'omit',\n keepalive: true,\n });\n } catch {\n // swallow\n }\n}\n\nexport function installGlobalErrorHandlers() {\n if (typeof window === 'undefined') return;\n // window.onerror\n window.addEventListener('error', (event: ErrorEvent) => {\n const isResourceError = (event as any).message === undefined && event.filename === '';\n const message = (event.message || (isResourceError ? 'Resource load error' : 'Unhandled error')) as string;\n reportError({\n message,\n stack: event.error?.stack,\n file: event.filename,\n line: event.lineno,\n column: event.colno,\n url: window.location.pathname + window.location.search,\n });\n });\n // unhandledrejection\n window.addEventListener('unhandledrejection', (event) => {\n const reason: any = (event as any).reason;\n const message = typeof reason === 'string' ? reason : (reason?.message || 'Unhandled rejection');\n const stack = typeof reason === 'object' ? (reason?.stack || '') : '';\n reportError({ message, stack, url: window.location.pathname + window.location.search });\n });\n}\n","import React, { useState, useEffect } from 'react';\nimport {\n Box,\n Card,\n CardHeader,\n CardBody,\n Heading,\n SimpleGrid,\n Stat,\n StatLabel,\n StatNumber,\n StatHelpText,\n StatArrow,\n Progress,\n Badge,\n Tabs,\n TabList,\n TabPanels,\n Tab,\n TabPanel,\n Table,\n Thead,\n Tbody,\n Tr,\n Th,\n Td,\n Button,\n Icon,\n Text,\n Alert,\n AlertIcon,\n useColorModeValue,\n HStack,\n VStack,\n Divider,\n Flex,\n Spinner,\n useToast,\n} from '@chakra-ui/react';\nimport {\n FiTrendingUp,\n FiTrendingDown,\n FiDollarSign,\n FiCreditCard,\n FiAlertTriangle,\n FiCheckCircle,\n FiClock,\n FiFileText,\n FiUpload,\n FiEye,\n FiDownload,\n FiRefreshCw,\n FiPlus,\n} from 'react-icons/fi';\nimport { useQuery } from '@tanstack/react-query';\nimport { useNavigate } from 'react-router-dom';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport { api } from '../../services/api';\n\ninterface FinancialSummary {\n total_income: number;\n total_expenses: number;\n net_cash_flow: number;\n budget_utilization: number;\n sponsorship_value: number;\n active_sponsors: number;\n pending_expenses: number;\n over_budget_count: number;\n}\n\ninterface BudgetCategory {\n name: string;\n budgeted: number;\n spent: number;\n remaining: number;\n utilization: number;\n status: 'ok' | 'warning' | 'critical';\n}\n\ninterface BudgetDashboard {\n total_budget: number;\n used_budget: number;\n remaining_budget: number;\n utilization: number;\n budget_categories: BudgetCategory[];\n alerts: any[];\n}\n\ninterface SponsorshipDashboard {\n total_value: number;\n received_this_year: number;\n pending_this_year: number;\n active_count: number;\n expiring_count: number;\n contract_types: any[];\n payment_status: any[];\n}\n\ninterface ExpenseCategory {\n name: string;\n amount: number;\n count: number;\n percent: number;\n}\n\ninterface ExpenseDashboard {\n total_expenses: number;\n approved_expenses: number;\n pending_expenses: number;\n rejected_expenses: number;\n with_receipt_rate: number;\n categories: ExpenseCategory[];\n monthly_trend: any[];\n}\n\ninterface CashFlowItem {\n month: string;\n income: number;\n expenses: number;\n net_flow: number;\n cumulative: number;\n}\n\ninterface UpcomingPayment {\n type: string;\n description: string;\n amount: number;\n due_date: string;\n status: string;\n sponsor_name?: string;\n}\n\ninterface RecentActivity {\n type: string;\n description: string;\n amount?: number;\n date: string;\n user?: string;\n}\n\ninterface FinancialDashboard {\n budget_summary: {\n total_budget: number;\n total_spend: number;\n remaining_budget: number;\n budget_count: number;\n over_budget_count: number;\n };\n expense_summary: {\n total_expenses: number;\n pending_expenses: number;\n approved_expenses: number;\n this_month_expenses: number;\n expense_count: number;\n pending_count: number;\n };\n sponsorship_summary: {\n total_sponsors: number;\n active_sponsors: number;\n total_value: number;\n received_this_year: number;\n };\n recent_expenses: any[];\n recent_sponsorships: any[];\n}\n\nconst FinancialDashboard: React.FC = () => {\n const [dashboard, setDashboard] = useState<FinancialDashboard | null>(null);\n const [loading, setLoading] = useState(true);\n const [selectedYear, setSelectedYear] = useState(new Date().getFullYear());\n const toast = useToast();\n const navigate = useNavigate();\n\n const bgColor = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n\n useEffect(() => {\n fetchDashboard();\n }, [selectedYear]);\n\n const fetchDashboard = async () => {\n try {\n setLoading(true);\n const response = await api.get(`/admin/financial/dashboard?year=${selectedYear}`);\n setDashboard(response.data);\n } catch (error) {\n toast({\n title: 'Chyba při načítání dat',\n description: 'Nepodařilo se načíst finanční data',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n } finally {\n setLoading(false);\n }\n };\n\n const formatCurrency = (amount: number) => {\n return new Intl.NumberFormat('cs-CZ', {\n style: 'currency',\n currency: 'CZK',\n }).format(amount);\n };\n\n const getStatusColor = (status: string) => {\n switch (status) {\n case 'ok':\n return 'green';\n case 'warning':\n return 'yellow';\n case 'critical':\n return 'red';\n default:\n return 'gray';\n }\n };\n\n const getProgressColor = (utilization: number) => {\n if (utilization >= 100) return 'red';\n if (utilization >= 80) return 'yellow';\n return 'green';\n };\n\n if (loading) {\n return (\n <Flex justify=\"center\" align=\"center\" minH=\"400px\">\n <VStack spacing={4}>\n <Spinner size=\"xl\" />\n <Text>Načítám finanční data...</Text>\n </VStack>\n </Flex>\n );\n }\n\n if (!dashboard) {\n return (\n <Alert status=\"error\">\n <AlertIcon />\n Nepodařilo se načíst finanční data\n </Alert>\n );\n }\n\n return (\n <AdminLayout>\n <VStack spacing={8} align=\"stretch\" maxW=\"1200px\" mx=\"auto\" p={8}>\n <Box>\n <Flex justify=\"space-between\" align=\"center\" mb={4}>\n <Box>\n <Heading size=\"lg\" mb={2}>Finanční přehled</Heading>\n <HStack spacing={4}>\n <Text color=\"gray.600\">Rok:</Text>\n <select\n value={selectedYear}\n onChange={(e) => setSelectedYear(parseInt(e.target.value))}\n style={{\n padding: '4px 8px',\n borderRadius: '6px',\n border: '1px solid #e2e8f0',\n }}\n >\n {[selectedYear - 2, selectedYear - 1, selectedYear, selectedYear + 1].map(year => (\n <option key={year} value={year}>{year}</option>\n ))}\n </select>\n </HStack>\n </Box>\n <Button\n leftIcon={<FiPlus />}\n colorScheme=\"blue\"\n onClick={() => navigate('/admin/invoices')}\n >\n Nová faktura\n </Button>\n </Flex>\n </Box>\n\n {/* Summary Cards */}\n <SimpleGrid columns={{ base: 1, md: 2, lg: 4 }} spacing={6}>\n <Card bg={bgColor} borderWidth={1} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <StatLabel>Cash Flow</StatLabel>\n <StatNumber>\n {formatCurrency(dashboard.sponsorship_summary.received_this_year - dashboard.expense_summary.total_expenses)}\n </StatNumber>\n <StatHelpText>\n <StatArrow\n type={(dashboard.sponsorship_summary.received_this_year - dashboard.expense_summary.total_expenses) >= 0 ? 'increase' : 'decrease'}\n />\n {(dashboard.sponsorship_summary.received_this_year - dashboard.expense_summary.total_expenses) >= 0 ? 'Příjem' : 'Výdaj'}\n </StatHelpText>\n </Stat>\n </CardBody>\n </Card>\n\n <Card bg={bgColor} borderWidth={1} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <StatLabel>Celkové příjmy</StatLabel>\n <StatNumber>{formatCurrency(dashboard.sponsorship_summary.received_this_year)}</StatNumber>\n <StatHelpText>\n <Icon as={FiTrendingUp} color=\"green.500\" mr={2} />\n Od sponzorů\n </StatHelpText>\n </Stat>\n </CardBody>\n </Card>\n\n <Card bg={bgColor} borderWidth={1} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <StatLabel>Celkové výdaje</StatLabel>\n <StatNumber>{formatCurrency(dashboard.expense_summary.total_expenses)}</StatNumber>\n <StatHelpText>\n <Icon as={FiTrendingDown} color=\"red.500\" mr={2} />\n {dashboard.expense_summary.pending_count > 0 && `${dashboard.expense_summary.pending_count} čeká na schválení`}\n </StatHelpText>\n </Stat>\n </CardBody>\n </Card>\n\n <Card bg={bgColor} borderWidth={1} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <StatLabel>Využití rozpočtu</StatLabel>\n <StatNumber>{dashboard.budget_summary.total_budget > 0 ? ((dashboard.budget_summary.total_spend / dashboard.budget_summary.total_budget) * 100).toFixed(1) : '0'}%</StatNumber>\n <Progress\n value={dashboard.budget_summary.total_budget > 0 ? Math.min((dashboard.budget_summary.total_spend / dashboard.budget_summary.total_budget) * 100, 100) : 0}\n colorScheme={getProgressColor(dashboard.budget_summary.total_budget > 0 ? (dashboard.budget_summary.total_spend / dashboard.budget_summary.total_budget) * 100 : 0)}\n mt={2}\n />\n {dashboard.budget_summary.over_budget_count > 0 && (\n <StatHelpText>\n <Icon as={FiAlertTriangle} color=\"red.500\" mr={2} />\n {dashboard.budget_summary.over_budget_count} rozpočtů překročeno\n </StatHelpText>\n )}\n </Stat>\n </CardBody>\n </Card>\n </SimpleGrid>\n\n {/* Main Content Tabs */}\n <Tabs>\n <TabList>\n <Tab>Rozpočty</Tab>\n <Tab>Sponzoring</Tab>\n <Tab>Výdaje</Tab>\n <Tab>Cash Flow</Tab>\n </TabList>\n\n <TabPanels>\n {/* Budget Overview */}\n <TabPanel>\n <VStack spacing={6} align=\"stretch\">\n <SimpleGrid columns={{ base: 1, md: 3 }} spacing={6}>\n <Card bg={bgColor} borderWidth={1} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <StatLabel>Celkový rozpočet</StatLabel>\n <StatNumber>{formatCurrency(dashboard.budget_summary.total_budget)}</StatNumber>\n </Stat>\n </CardBody>\n </Card>\n\n <Card bg={bgColor} borderWidth={1} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <StatLabel>Využito</StatLabel>\n <StatNumber>{formatCurrency(dashboard.budget_summary.total_spend)}</StatNumber>\n </Stat>\n </CardBody>\n </Card>\n\n <Card bg={bgColor} borderWidth={1} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <StatLabel>Zbývá</StatLabel>\n <StatNumber>{formatCurrency(dashboard.budget_summary.remaining_budget)}</StatNumber>\n </Stat>\n </CardBody>\n </Card>\n </SimpleGrid>\n\n <Alert status=\"info\">\n <AlertIcon />\n Detailní rozpočty a kategorie budou dostupné v další verzi.\n </Alert>\n </VStack>\n </TabPanel>\n\n {/* Sponsorship Overview */}\n <TabPanel>\n <VStack spacing={6} align=\"stretch\">\n <SimpleGrid columns={{ base: 1, md: 2, lg: 4 }} spacing={6}>\n <Card bg={bgColor} borderWidth={1} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <StatLabel>Aktivní sponzoři</StatLabel>\n <StatNumber>{dashboard.sponsorship_summary.active_sponsors}</StatNumber>\n <StatHelpText>\n <Icon as={FiCheckCircle} color=\"green.500\" mr={2} />\n Celková hodnota: {formatCurrency(dashboard.sponsorship_summary.total_value)}\n </StatHelpText>\n </Stat>\n </CardBody>\n </Card>\n\n <Card bg={bgColor} borderWidth={1} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <StatLabel>Přijato tento rok</StatLabel>\n <StatNumber>{formatCurrency(dashboard.sponsorship_summary.received_this_year)}</StatNumber>\n </Stat>\n </CardBody>\n </Card>\n\n <Card bg={bgColor} borderWidth={1} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <StatLabel>Celkem sponzorů</StatLabel>\n <StatNumber>{dashboard.sponsorship_summary.total_sponsors}</StatNumber>\n </Stat>\n </CardBody>\n </Card>\n\n <Card bg={bgColor} borderWidth={1} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <StatLabel>Aktivní smlouvy</StatLabel>\n <StatNumber>{dashboard.sponsorship_summary.active_sponsors}</StatNumber>\n <StatHelpText>\n <Icon as={FiCheckCircle} color=\"green.500\" mr={2} />\n Momentálně aktivní\n </StatHelpText>\n </Stat>\n </CardBody>\n </Card>\n </SimpleGrid>\n\n <Alert status=\"info\">\n <AlertIcon />\n Detailní smlouvy a platby budou dostupné v další verzi.\n </Alert>\n </VStack>\n </TabPanel>\n\n {/* Expense Overview */}\n <TabPanel>\n <VStack spacing={6} align=\"stretch\">\n <SimpleGrid columns={{ base: 1, md: 2, lg: 4 }} spacing={6}>\n <Card bg={bgColor} borderWidth={1} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <StatLabel>Celkem výdaje</StatLabel>\n <StatNumber>{formatCurrency(dashboard.expense_summary.total_expenses)}</StatNumber>\n </Stat>\n </CardBody>\n </Card>\n\n <Card bg={bgColor} borderWidth={1} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <StatLabel>Schváleno</StatLabel>\n <StatNumber>{formatCurrency(dashboard.expense_summary.approved_expenses)}</StatNumber>\n </Stat>\n </CardBody>\n </Card>\n\n <Card bg={bgColor} borderWidth={1} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <StatLabel>Čeká na schválení</StatLabel>\n <StatNumber>{formatCurrency(dashboard.expense_summary.pending_expenses)}</StatNumber>\n </Stat>\n </CardBody>\n </Card>\n\n <Card bg={bgColor} borderWidth={1} borderColor={borderColor}>\n <CardBody>\n <Stat>\n <StatLabel>Tento měsíc</StatLabel>\n <StatNumber>{formatCurrency(dashboard.expense_summary.this_month_expenses)}</StatNumber>\n <StatHelpText>\n <Icon as={FiFileText} color=\"blue.500\" mr={2} />\n {dashboard.expense_summary.expense_count} celkem výdajů\n </StatHelpText>\n </Stat>\n </CardBody>\n </Card>\n </SimpleGrid>\n\n <Alert status=\"info\">\n <AlertIcon />\n Detailní kategorie a trendy budou dostupné v další verzi.\n </Alert>\n </VStack>\n </TabPanel>\n\n {/* Cash Flow */}\n <TabPanel>\n <VStack spacing={6} align=\"stretch\">\n <Alert status=\"info\">\n <AlertIcon />\n Měsíční cash flow přehled bude dostupný v další verzi.\n </Alert>\n </VStack>\n </TabPanel>\n </TabPanels>\n </Tabs>\n\n {/* Recent Activity */}\n <Card bg={bgColor} borderWidth={1} borderColor={borderColor}>\n <CardHeader>\n <Heading size=\"md\">Nedávná aktivita</Heading>\n </CardHeader>\n <CardBody>\n <VStack spacing={3} align=\"stretch\">\n {dashboard.recent_expenses?.slice(0, 5).map((expense, index) => (\n <HStack key={index} justify=\"space-between\">\n <VStack align=\"start\" spacing={1}>\n <HStack>\n <Icon as={FiCreditCard} color=\"red.500\" />\n <Text>{expense.title}</Text>\n </HStack>\n <Text fontSize=\"sm\" color=\"gray.600\">\n {new Date(expense.created_at).toLocaleDateString('cs-CZ')}\n </Text>\n </VStack>\n <Text fontWeight=\"bold\">\n {formatCurrency(expense.total_amount)}\n </Text>\n </HStack>\n ))}\n {(!dashboard.recent_expenses || dashboard.recent_expenses.length === 0) && (\n <Text color=\"gray.500\" textAlign=\"center\">\n Žádná nedávná aktivita\n </Text>\n )}\n </VStack>\n </CardBody>\n </Card>\n </VStack>\n </AdminLayout>\n );\n};\n\nexport default FinancialDashboard;\n","import api from './api';\n\nexport interface CategoryItem {\n id: number;\n name: string;\n description?: string;\n}\n\nexport async function getCategories(): Promise<CategoryItem[]> {\n const res = await api.get<CategoryItem[] | { items?: CategoryItem[]; data?: CategoryItem[] }>(\n '/categories'\n );\n const d: any = res.data;\n if (Array.isArray(d)) return d as CategoryItem[];\n if (d && Array.isArray(d.items)) return d.items as CategoryItem[];\n if (d && Array.isArray(d.data)) return d.data as CategoryItem[];\n return [];\n}\n\nexport async function createCategory(payload: { name: string; description?: string }): Promise<CategoryItem> {\n const res = await api.post<CategoryItem>('/admin/categories', payload);\n return res.data;\n}\n\nexport async function updateCategory(id: number | string, payload: { name?: string; description?: string }): Promise<CategoryItem> {\n const res = await api.put<CategoryItem>(`/admin/categories/${id}`, payload);\n return res.data;\n}\n\nexport async function deleteCategory(id: number | string): Promise<void> {\n await api.delete(`/admin/categories/${id}`);\n}\n","export type AuthContext = 'register' | 'login' | 'generic';\n\nfunction normalizeMessage(raw?: string): string {\n if (!raw) return '';\n try {\n return String(raw).trim();\n } catch {\n return '';\n }\n}\n\nexport function translateAuthError(error: any, _context: AuthContext = 'generic'): string {\n try {\n const status: number | undefined = error?.response?.status;\n const data = error?.response?.data || {};\n const raw = normalizeMessage(data.error || data.message || error?.message);\n const msg = raw.toLowerCase();\n\n if (!error?.response) {\n if (error?.code === 'ECONNABORTED') {\n return 'Vypršel časový limit požadavku. Zkuste to prosím znovu.';\n }\n return 'Nelze se připojit k serveru. Zkontrolujte připojení a zkuste to znovu.';\n }\n\n if (status === 429) return 'Příliš mnoho pokusů. Zkuste to prosím za chvíli.';\n if (status && status >= 500) return 'Chyba serveru. Zkuste to prosím později.';\n\n if (/first_name/.test(msg) && /last_name/.test(msg)) {\n return 'Zadejte prosím jméno i příjmení.';\n }\n if (msg.includes('invalid email address')) {\n return 'Zadejte platný email.';\n }\n if (/email already (registered|in use)/.test(msg)) {\n return 'Tento email je již registrován. Přihlaste se nebo použijte jiný email.';\n }\n if (msg.includes('invalid credentials')) {\n return 'Nesprávný email nebo heslo.';\n }\n if (msg.includes('email is required')) {\n return 'Zadejte email.';\n }\n if (/password/.test(msg) && (/min/.test(msg) || /at least/.test(msg) || /min=8/.test(msg))) {\n return 'Heslo musí mít alespoň 8 znaků.';\n }\n if (/failed to (hash password|create user|generate token)/.test(msg) || /database error/.test(msg)) {\n return 'Na naší straně došlo k chybě. Zkuste to prosím znovu.';\n }\n\n if (status === 400) return 'Zkontrolujte vyplněná pole.';\n if (status === 401) return 'Nesprávné údaje. Zkuste to znovu.';\n if (status === 403) return 'Přístup byl odepřen.';\n\n if (raw) {\n return raw;\n }\n return 'Něco se nepovedlo. Zkuste to prosím znovu.';\n } catch {\n return 'Něco se nepovedlo. Zkuste to prosím znovu.';\n }\n}\n","import { useState } from 'react';\nimport { useNavigate, useLocation } from 'react-router-dom';\nimport {\n Box,\n Button,\n FormControl,\n FormLabel,\n Input,\n VStack,\n Heading,\n useToast,\n Text,\n Link,\n} from '@chakra-ui/react';\nimport { useAuth } from '../contexts/AuthContext';\nimport api from '../services/api';\nimport { translateAuthError } from '../utils/errorTranslator';\nimport { PasswordHelpTooltip } from '../components/common/HelpTooltipCard';\n\ninterface LocationState {\n from: {\n pathname: string;\n };\n}\n\nconst RegisterPage: React.FC = () => {\n const [name, setName] = useState('');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const { login } = useAuth();\n const navigate = useNavigate();\n const location = useLocation();\n const toast = useToast();\n\n const from = (location.state as LocationState)?.from?.pathname || '/';\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setIsLoading(true);\n\n const nameTrim = name.trim();\n const emailTrim = email.trim().toLowerCase();\n if (!nameTrim || !nameTrim.includes(' ')) {\n toast({ title: 'Registrace selhala', description: 'Zadejte prosím jméno i příjmení.', status: 'error', duration: 5000, isClosable: true });\n setIsLoading(false);\n return;\n }\n if (!emailTrim || !emailTrim.includes('@')) {\n toast({ title: 'Registrace selhala', description: 'Zadejte platný email.', status: 'error', duration: 5000, isClosable: true });\n setIsLoading(false);\n return;\n }\n if (!password || password.length < 8) {\n toast({ title: 'Registrace selhala', description: 'Heslo musí mít alespoň 8 znaků.', status: 'error', duration: 5000, isClosable: true });\n setIsLoading(false);\n return;\n }\n\n try {\n // Backend Register accepts name or first/last\n const response = await api.post('/auth/register', {\n email: emailTrim,\n password,\n name,\n });\n const { token, user } = response.data;\n await login(token, user, true);\n toast({ title: 'Účet vytvořen', status: 'success', duration: 3000 });\n navigate(from, { replace: true });\n } catch (error: any) {\n toast({\n title: 'Registrace selhala',\n description: translateAuthError(error, 'register'),\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <Box minH=\"100vh\" display=\"flex\" alignItems=\"center\" justifyContent=\"center\">\n <Box w=\"100%\" maxW=\"md\" p={8} borderWidth={1} borderRadius={8} boxShadow=\"lg\">\n <VStack as=\"form\" onSubmit={handleSubmit} spacing={4} align=\"stretch\">\n <Heading as=\"h2\" size=\"lg\" textAlign=\"center\" mb={2}>\n Vytvořit účet\n </Heading>\n\n <FormControl id=\"name\" isRequired>\n <FormLabel>Jméno a příjmení</FormLabel>\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"např. Jan Novák\"\n />\n </FormControl>\n\n <FormControl id=\"email\" isRequired>\n <FormLabel>Email</FormLabel>\n <Input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"např. jan@klub.cz\"\n />\n </FormControl>\n\n <FormControl id=\"password\" isRequired>\n <FormLabel display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n <Box>Heslo</Box>\n <PasswordHelpTooltip />\n </FormLabel>\n <Input\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Zadejte heslo (min. 8 znaků)\"\n />\n </FormControl>\n\n <Button type=\"submit\" colorScheme=\"blue\" width=\"full\" mt={2} isLoading={isLoading}>\n Zaregistrovat se\n </Button>\n\n <Text fontSize=\"sm\" textAlign=\"center\">\n Už máte účet?{' '}\n <Link color=\"blue.500\" href=\"/login\">\n Přihlaste se\n </Link>\n </Text>\n </VStack>\n </Box>\n </Box>\n );\n};\n\nexport default RegisterPage;\n","import React, { useState, useEffect } from 'react';\nimport {\n Box,\n Card,\n CardHeader,\n CardBody,\n Heading,\n Button,\n Input,\n Text,\n VStack,\n HStack,\n SimpleGrid,\n Badge,\n useToast,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalFooter,\n ModalBody,\n ModalCloseButton,\n FormControl,\n FormLabel,\n Textarea,\n Divider,\n Alert,\n AlertIcon,\n Spinner,\n Image,\n Flex,\n IconButton,\n Tooltip,\n} from '@chakra-ui/react';\nimport {\n FiDownload,\n FiPlus,\n FiEdit,\n FiTrash2,\n FiCopy,\n FiExternalLink,\n FiCode,\n} from 'react-icons/fi';\nimport { api } from '../../services/api';\nimport AdminLayout from '../../layouts/AdminLayout';\n\ninterface QRCode {\n id: number;\n name: string;\n description?: string;\n target_url: string;\n qr_code_url: string;\n scan_count: number;\n created_at: string;\n updated_at: string;\n is_active: boolean;\n}\n\nconst QRCodesAdminPage: React.FC = () => {\n const [qrCodes, setQRCodes] = useState<QRCode[]>([]);\n const [loading, setLoading] = useState(true);\n const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);\n const [isEditModalOpen, setIsEditModalOpen] = useState(false);\n const [editingQR, setEditingQR] = useState<QRCode | null>(null);\n const [formData, setFormData] = useState({\n name: '',\n description: '',\n target_url: '',\n });\n const [isSubmitting, setIsSubmitting] = useState(false);\n const toast = useToast();\n\n useEffect(() => {\n fetchQRCodes();\n }, []);\n\n const fetchQRCodes = async () => {\n try {\n setLoading(true);\n const response = await api.get<QRCode[]>('/admin/qr-codes');\n setQRCodes(response.data || []);\n } catch (error) {\n console.error('Failed to fetch QR codes:', error);\n toast({\n title: 'Chyba při načítání',\n description: 'Nepodařilo se načíst QR kódy',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n } finally {\n setLoading(false);\n }\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!formData.name || !formData.target_url) {\n toast({\n title: 'Chyba',\n description: 'Název a cílová URL jsou povinné',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n return;\n }\n\n try {\n setIsSubmitting(true);\n if (editingQR) {\n await api.put(`/admin/qr-codes/${editingQR.id}`, formData);\n toast({\n title: 'QR kód aktualizován',\n status: 'success',\n duration: 5000,\n isClosable: true,\n });\n } else {\n await api.post('/admin/qr-codes', formData);\n toast({\n title: 'QR kód vytvořen',\n status: 'success',\n duration: 5000,\n isClosable: true,\n });\n }\n \n setIsCreateModalOpen(false);\n setIsEditModalOpen(false);\n setEditingQR(null);\n setFormData({ name: '', description: '', target_url: '' });\n fetchQRCodes();\n } catch (error) {\n console.error('Failed to save QR code:', error);\n toast({\n title: 'Chyba',\n description: 'Nepodařilo se uložit QR kód',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleEdit = (qr: QRCode) => {\n setEditingQR(qr);\n setFormData({\n name: qr.name,\n description: qr.description || '',\n target_url: qr.target_url,\n });\n setIsEditModalOpen(true);\n };\n\n const handleDelete = async (id: number) => {\n if (!confirm('Opravdu chcete smazat tento QR kód?')) return;\n\n try {\n await api.delete(`/admin/qr-codes/${id}`);\n toast({\n title: 'QR kód smazán',\n status: 'success',\n duration: 5000,\n isClosable: true,\n });\n fetchQRCodes();\n } catch (error) {\n console.error('Failed to delete QR code:', error);\n toast({\n title: 'Chyba',\n description: 'Nepodařilo se smazat QR kód',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n }\n };\n\n const handleDownloadQR = async (qr: QRCode) => {\n try {\n const response = await fetch(qr.qr_code_url);\n if (!response.ok) {\n throw new Error('Failed to fetch QR code image');\n }\n const blob = await response.blob();\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `qr-${qr.name.replace(/[^a-z0-9]/gi, '_').toLowerCase()}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n } catch (error) {\n console.error('Failed to download QR code:', error);\n toast({\n title: 'Chyba',\n description: 'Nepodařilo se stáhnout QR kód',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n }\n };\n\n const copyToClipboard = async (text: string) => {\n try {\n await navigator.clipboard.writeText(text);\n toast({\n title: 'Zkopírováno',\n description: 'URL zkopírována do schránky',\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n } catch (error) {\n toast({\n title: 'Chyba',\n description: 'Nepodařilo se zkopírovat URL',\n status: 'error',\n duration: 3000,\n isClosable: true,\n });\n }\n };\n\n if (loading) {\n return (\n <AdminLayout>\n <Flex justify=\"center\" align=\"center\" minH=\"400px\">\n <VStack spacing={4}>\n <Spinner size=\"xl\" />\n <Text>Načítám QR kódy...</Text>\n </VStack>\n </Flex>\n </AdminLayout>\n );\n }\n\n return (\n <AdminLayout>\n <VStack spacing={6} align=\"stretch\">\n {/* Header */}\n <HStack justify=\"space-between\">\n <Heading size=\"lg\">QR kódy</Heading>\n <Button\n leftIcon={<FiPlus />}\n colorScheme=\"blue\"\n onClick={() => setIsCreateModalOpen(true)}\n >\n Vytvořit QR kód\n </Button>\n </HStack>\n\n {/* Info Alert */}\n <Alert status=\"info\">\n <AlertIcon />\n <Box>\n <Text fontWeight=\"bold\">QR kódy pro rychlý přístup</Text>\n <Text fontSize=\"sm\">\n Vytvářejte QR kódy pro různé stránky vašeho webu - články, kontakty, sponzory atd.\n Uživatelé mohou jednoduše naskenovat kód a okamžitě navštívit cílovou stránku.\n </Text>\n </Box>\n </Alert>\n\n {/* QR Codes Grid */}\n {qrCodes.length === 0 ? (\n <Card>\n <CardBody textAlign=\"center\" py={12}>\n <FiCode size={48} color=\"gray.400\" />\n <VStack spacing={4} mt={6}>\n <Heading size=\"md\" color=\"gray.600\">Žádné QR kódy</Heading>\n <Text color=\"gray.500\">Ještě nebyly vytvořeny žádné QR kódy</Text>\n <Button\n leftIcon={<FiPlus />}\n colorScheme=\"blue\"\n variant=\"outline\"\n onClick={() => setIsCreateModalOpen(true)}\n >\n Vytvořit první QR kód\n </Button>\n </VStack>\n </CardBody>\n </Card>\n ) : (\n <SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} spacing={6}>\n {qrCodes.map((qr) => (\n <Card key={qr.id} borderWidth={1} borderRadius=\"lg\">\n <CardBody>\n <VStack spacing={4}>\n {/* QR Code Image */}\n <Box\n p={4}\n bg=\"white\"\n borderRadius=\"md\"\n borderWidth={1}\n borderColor=\"gray.200\"\n >\n <Image\n src={qr.qr_code_url}\n alt={`QR kód: ${qr.name}`}\n w={150}\n h={150}\n fallback={<Box w={150} h={150} bg=\"gray.100\" />}\n />\n </Box>\n\n {/* QR Info */}\n <VStack spacing={2} align=\"start\" width=\"100%\">\n <HStack justify=\"space-between\" width=\"100%\">\n <Text fontWeight=\"bold\" fontSize=\"lg\" noOfLines={1}>\n {qr.name}\n </Text>\n <Badge colorScheme={qr.is_active ? 'green' : 'gray'}>\n {qr.is_active ? 'Aktivní' : 'Neaktivní'}\n </Badge>\n </HStack>\n \n {qr.description && (\n <Text fontSize=\"sm\" color=\"gray.600\" noOfLines={2}>\n {qr.description}\n </Text>\n )}\n\n <Text fontSize=\"sm\" color=\"blue.600\" noOfLines={1}>\n {qr.target_url}\n </Text>\n\n <HStack spacing={4} fontSize=\"sm\" color=\"gray.500\">\n <Text>📊 {qr.scan_count} skenování</Text>\n <Text>📅 {new Date(qr.created_at).toLocaleDateString('cs-CZ')}</Text>\n </HStack>\n </VStack>\n\n {/* Actions */}\n <VStack spacing={2} width=\"100%\">\n <HStack spacing={2} width=\"100%\">\n <Tooltip label=\"Stáhnout QR kód\">\n <IconButton\n aria-label=\"Stáhnout\"\n icon={<FiDownload />}\n size=\"sm\"\n onClick={() => handleDownloadQR(qr)}\n />\n </Tooltip>\n <Tooltip label=\"Kopírovat URL\">\n <IconButton\n aria-label=\"Kopírovat\"\n icon={<FiCopy />}\n size=\"sm\"\n onClick={() => copyToClipboard(qr.target_url)}\n />\n </Tooltip>\n <Tooltip label=\"Otevřít v novém okně\">\n <IconButton\n aria-label=\"Otevřít\"\n icon={<FiExternalLink />}\n size=\"sm\"\n as=\"a\"\n href={qr.target_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n />\n </Tooltip>\n <Box flex={1} />\n <Tooltip label=\"Upravit\">\n <IconButton\n aria-label=\"Upravit\"\n icon={<FiEdit />}\n size=\"sm\"\n onClick={() => handleEdit(qr)}\n />\n </Tooltip>\n <Tooltip label=\"Smazat\">\n <IconButton\n aria-label=\"Smazat\"\n icon={<FiTrash2 />}\n size=\"sm\"\n colorScheme=\"red\"\n variant=\"outline\"\n onClick={() => handleDelete(qr.id)}\n />\n </Tooltip>\n </HStack>\n </VStack>\n </VStack>\n </CardBody>\n </Card>\n ))}\n </SimpleGrid>\n )}\n\n {/* Create Modal */}\n <Modal isOpen={isCreateModalOpen} onClose={() => setIsCreateModalOpen(false)} size=\"md\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Vytvořit QR kód</ModalHeader>\n <ModalCloseButton />\n <form onSubmit={handleSubmit}>\n <ModalBody>\n <VStack spacing={4}>\n <FormControl isRequired>\n <FormLabel>Název</FormLabel>\n <Input\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n placeholder=\"Např. Kontaktní stránka\"\n />\n </FormControl>\n\n <FormControl>\n <FormLabel>Popis</FormLabel>\n <Textarea\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n placeholder=\"Krátký popis účelu QR kódu\"\n rows={3}\n />\n </FormControl>\n\n <FormControl isRequired>\n <FormLabel>Cílová URL</FormLabel>\n <Input\n value={formData.target_url}\n onChange={(e) => setFormData({ ...formData, target_url: e.target.value })}\n placeholder=\"https://vasweb.cz/stranka\"\n type=\"url\"\n />\n </FormControl>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button\n variant=\"outline\"\n mr={3}\n onClick={() => setIsCreateModalOpen(false)}\n >\n Zrušit\n </Button>\n <Button\n type=\"submit\"\n colorScheme=\"blue\"\n isLoading={isSubmitting}\n >\n Vytvořit\n </Button>\n </ModalFooter>\n </form>\n </ModalContent>\n </Modal>\n\n {/* Edit Modal */}\n <Modal isOpen={isEditModalOpen} onClose={() => setIsEditModalOpen(false)} size=\"md\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Upravit QR kód</ModalHeader>\n <ModalCloseButton />\n <form onSubmit={handleSubmit}>\n <ModalBody>\n <VStack spacing={4}>\n <FormControl isRequired>\n <FormLabel>Název</FormLabel>\n <Input\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n placeholder=\"Např. Kontaktní stránka\"\n />\n </FormControl>\n\n <FormControl>\n <FormLabel>Popis</FormLabel>\n <Textarea\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n placeholder=\"Krátký popis účelu QR kódu\"\n rows={3}\n />\n </FormControl>\n\n <FormControl isRequired>\n <FormLabel>Cílová URL</FormLabel>\n <Input\n value={formData.target_url}\n onChange={(e) => setFormData({ ...formData, target_url: e.target.value })}\n placeholder=\"https://vasweb.cz/stranka\"\n type=\"url\"\n />\n </FormControl>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button\n variant=\"outline\"\n mr={3}\n onClick={() => setIsEditModalOpen(false)}\n >\n Zrušit\n </Button>\n <Button\n type=\"submit\"\n colorScheme=\"blue\"\n isLoading={isSubmitting}\n >\n Uložit změny\n </Button>\n </ModalFooter>\n </form>\n </ModalContent>\n </Modal>\n </VStack>\n </AdminLayout>\n );\n};\n\nexport default QRCodesAdminPage;\n","import { api, API_URL as SHARED_API_URL } from './api';\nimport { Event } from '../types/event';\nimport { getToken } from '../utils/auth';\n\n// Use shared API URL, which is already resolved to the full API path (e.g. http://host:port/api/v1)\nconst API_URL = process.env.REACT_APP_API_BASE_URL || process.env.REACT_APP_API_URL || SHARED_API_URL || 'http://localhost:8080/api/v1';\n\nexport const getUpcomingEvents = async (): Promise<Event[]> => {\n const response = await api.get<Event[]>('/events/upcoming');\n return response.data as any;\n};\n\nexport const createEvent = async (eventData: Partial<Event>): Promise<Event> => {\n const token = getToken();\n const response = await api.post<Event>('/events', eventData, {\n headers: token ? { Authorization: `Bearer ${token}` } : undefined,\n });\n return response.data as any;\n};\n\nexport const getEvents = async (): Promise<Event[]> => {\n const response = await api.get<Event[]>('/events');\n return response.data as any;\n};\n\nexport const updateEvent = async (id: number | string, eventData: Partial<Event>): Promise<Event> => {\n const token = getToken();\n const response = await api.put<Event>(`/events/${id}`, eventData, {\n headers: token ? { Authorization: `Bearer ${token}` } : undefined,\n });\n return response.data as any;\n};\n\nexport const deleteEvent = async (id: number | string): Promise<{ ok: boolean } | void> => {\n const token = getToken();\n const response = await api.delete<{ ok: boolean }>(`/events/${id}`, {\n headers: token ? { Authorization: `Bearer ${token}` } : undefined,\n });\n return response.data;\n};\n\nexport const getEvent = async (id: number | string): Promise<Event> => {\n const response = await api.get<Event>(`/events/${id}`);\n return response.data as any;\n};\n","import React, { useEffect, useMemo, useState } from 'react';\nimport MainLayout from '../components/layout/MainLayout';\nimport { Box, Container, Heading, Text, Tabs, TabList, TabPanels, Tab, TabPanel, Flex, Badge, Stack, Spinner, Grid, IconButton, ButtonGroup, Button, Link, Image, useDisclosure, Modal, ModalOverlay, ModalContent, ModalHeader, ModalCloseButton, ModalBody, ModalFooter, useToast, Input, useColorModeValue, Tooltip } from '@chakra-ui/react';\nimport { ChevronLeftIcon, ChevronRightIcon } from '@chakra-ui/icons';\nimport { addMonths, format, isSameDay, isSameMonth, startOfMonth, startOfWeek, addDays, parse } from 'date-fns';\nimport { cs } from 'date-fns/locale';\nimport { getCompetitionAliasesPublic, CompetitionAlias } from '../services/competitionAliases';\nimport { useSearchParams } from 'react-router-dom';\nimport { useCountdown, useMultipleCountdowns } from '../hooks/useCountdown';\nimport NewsletterCTA from '../components/common/NewsletterCTA';\nimport { sortCategoriesWithOrder } from '../utils/categorySort';\nimport ClubModal from '../components/home/ClubModal';\nimport { assetUrl } from '../utils/url';\nimport { API_URL } from '../services/api';\nimport { TeamLogo } from '../components/common/TeamLogo';\nimport { useTranslation } from 'react-i18next';\nimport { MatchWeatherLazy } from '../components/common/MatchWeatherLazy';\nimport { MatchWeather } from '../components/common/MatchWeather';\n\n// Dynamic weekday headers based on language\nconst getWeekdayHeaders = (language: string): string[] => {\n if (language === 'en') {\n return ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\n }\n // Default to Czech\n return ['Po', 'Út', 'St', 'Čt', 'Pá', 'So', 'Ne'];\n};\n\ntype MatchItem = {\n id: number | string;\n date: string; // yyyy-mm-dd\n time: string; // HH:MM\n home: string;\n away: string;\n home_id?: string;\n away_id?: string;\n venue?: string;\n home_logo_url?: string;\n away_logo_url?: string;\n report_url?: string;\n facr_link?: string;\n score?: string; // optional: e.g., \"2:1\" for finished matches\n // enriched when building the \"Všechny soutěže\" tab\n __compId?: string;\n __compName?: string;\n __compDisplayOrder?: number;\n};\n\ntype Competition = {\n id: string;\n name: string;\n code?: string;\n matches: MatchItem[];\n};\n\nconst CalendarPage: React.FC = () => {\n const { t, i18n } = useTranslation();\n const [loading, setLoading] = useState(true);\n const [competitions, setCompetitions] = useState<Competition[]>([]);\n const [error, setError] = useState<string | null>(null);\n const [compLinks, setCompLinks] = useState<Record<string, string>>({});\n const [aliasMap, setAliasMap] = useState<Record<string, { alias: string; original_name?: string; display_order?: number }>>({});\n const [tabIndex, setTabIndex] = useState<number>(0);\n const [searchParams] = useSearchParams();\n const toast = useToast();\n const [clubName, setClubName] = useState<string>('');\n const [clubId, setClubId] = useState<string>('');\n const [clubType, setClubType] = useState<'football' | 'futsal'>('football');\n const [standings, setStandings] = useState<any[]>([]);\n\n // Get weekday headers based on current language\n const weekdayHeaders = getWeekdayHeaders(i18n.language);\n\n // Helper functions inside component to access t()\n const getSentiment = (m: MatchItem): { label: string; color: string } | null => {\n // Don't show sentiment for future matches\n const dt = new Date(`${m.date}T${(m.time || '00:00')}:00`);\n const isPast = Date.now() >= dt.getTime();\n if (!isPast) return null;\n \n const s = parseScore(m.score);\n if (!s) return null;\n \n const ourIsHome = normalize(m.home).includes(normalize(clubName));\n const ourIsAway = normalize(m.away).includes(normalize(clubName));\n \n if (!ourIsHome && !ourIsAway) return null; // unknown perspective\n if (s.h === s.a) return { label: t('calendar.draw'), color: 'blue' };\n const ourGoals = ourIsHome ? s.h : s.a;\n const oppGoals = ourIsHome ? s.a : s.h;\n if (ourGoals > oppGoals) return { label: t('calendar.win'), color: 'green' };\n return { label: t('calendar.loss'), color: 'red' };\n };\n\n // Active competition for current tab (memoized)\n const activeCompetition = useMemo(() => competitions[tabIndex], [competitions, tabIndex]);\n\n // Color mode values for dark/light theme\n const calendarDayBg = useColorModeValue('white', 'gray.800');\n const calendarDayBorder = useColorModeValue('gray.200', 'gray.700');\n const calendarMatchBg = useColorModeValue('gray.50', 'gray.700');\n const calendarMatchHoverBg = useColorModeValue('blue.50', 'blue.900');\n const listGroupBg = useColorModeValue('white', 'gray.800');\n const listGroupBorder = useColorModeValue('gray.200', 'gray.700');\n const listGroupHeaderBg = useColorModeValue('gray.50', 'gray.700');\n const listGroupHeaderBgHighlight = useColorModeValue('blue.50', 'blue.900');\n const listGroupHeaderBorderLeft = useColorModeValue('gray.300', 'gray.600');\n const listGroupHeaderText = useColorModeValue('gray.800', 'gray.100');\n const listMatchBg = useColorModeValue('gray.50', 'gray.700');\n const listMatchBorder = useColorModeValue('gray.200', 'gray.600');\n const listMatchHoverBg = useColorModeValue('blue.50', 'blue.900');\n const listDateText = useColorModeValue('gray.800', 'gray.100');\n const listVenueText = useColorModeValue('gray.600', 'gray.400');\n const listTimeText = useColorModeValue('gray.700', 'gray.300');\n\n // Modal state\n const { isOpen, onOpen, onClose } = useDisclosure();\n const [selected, setSelected] = useState<{ match: MatchItem; comp?: Competition } | null>(null);\n // Removed admin notification form state (moved to admin page)\n // Fan subscribe state\n const [fanEmail, setFanEmail] = useState<string>(\"\");\n const [fanSubscribing, setFanSubscribing] = useState<boolean>(false);\n\n // ClubModal state\n const [isClubModalOpen, setIsClubModalOpen] = useState<boolean>(false);\n const [selectedClub, setSelectedClub] = useState<any | null>(null);\n\n const resolveBackendUrl = (path: string) => {\n try {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (path.startsWith('/cache') || path.startsWith('/uploads') || path.startsWith('/api/')) {\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n return new URL(path, origin).toString();\n }\n return path;\n } catch {\n return path;\n }\n };\n\n // Helper functions shared across effects and render helpers\n const normalize = (s: string) => String(s || '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\n\n const stripPrefixes = (s: string) => {\n let x = normalize(s);\n x = x.replace(/\\b(mestsky|m\\.?f\\.?k\\.?|mfk|tj|sk|sokol|fotbalovy|fotbalový|fotbalovy\\s+klub|fotbalovy\\s+klub)\\b/g, '');\n return x.replace(/\\s+/g, ' ').trim();\n };\n\n const subscribeFan = async () => {\n if (!fanEmail) {\n toast({ title: 'Zadejte email', status: 'warning' });\n return;\n }\n setFanSubscribing(true);\n try {\n const res = await fetch(resolveBackendUrl('/api/v1/newsletter/subscribe'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email: fanEmail })\n });\n if (!res.ok) {\n const jt = await res.json().catch(() => ({} as any));\n throw new Error(jt?.error || `HTTP ${res.status}`);\n }\n toast({ title: 'Přihlášeno k odběru', status: 'success' });\n setFanEmail('');\n } catch (e: any) {\n toast({ title: 'Chyba přihlášení', description: e?.message || String(e), status: 'error' });\n } finally {\n setFanSubscribing(false);\n }\n };\n\n // Handle team click to show team stats in ClubModal\n const handleTeamClick = (teamName: string, teamLogoUrl?: string) => {\n try {\n const normalizedTeamName = normalize(teamName);\n \n // Search through all standings to find the team\n let foundTeam: any = null;\n for (const standing of standings) {\n const table = standing.table || standing.rows || [];\n for (const row of table) {\n const rowTeamName = normalize(row.team_name || row.team || '');\n if (rowTeamName === normalizedTeamName || rowTeamName.includes(normalizedTeamName) || normalizedTeamName.includes(rowTeamName)) {\n foundTeam = row;\n break;\n }\n }\n if (foundTeam) break;\n }\n\n // If team found in standings, show detailed modal\n if (foundTeam) {\n const clubData = {\n team: foundTeam.team_name || foundTeam.team || teamName,\n team_id: foundTeam.team_id || String(foundTeam.position || 0),\n team_logo_url: foundTeam.logo_url ? (assetUrl(foundTeam.logo_url) || foundTeam.logo_url) : teamLogoUrl,\n rank: foundTeam.position || foundTeam.rank || foundTeam.pos,\n played: foundTeam.played || foundTeam.matches,\n wins: foundTeam.wins || foundTeam.win,\n draws: foundTeam.draws || foundTeam.draw,\n losses: foundTeam.losses || foundTeam.loss,\n score: foundTeam.score || ((foundTeam.goals_for || foundTeam.gf) && (foundTeam.goals_against || foundTeam.ga) \n ? `${foundTeam.goals_for || foundTeam.gf}:${foundTeam.goals_against || foundTeam.ga}` \n : undefined),\n points: foundTeam.points || foundTeam.pts,\n };\n setSelectedClub(clubData);\n setIsClubModalOpen(true);\n } else {\n // If not found in standings, show minimal modal with just the name and logo\n const minimalClubData = {\n team: teamName,\n team_id: teamName,\n team_logo_url: teamLogoUrl,\n rank: '-',\n played: '-',\n wins: '-',\n draws: '-',\n losses: '-',\n score: '-',\n points: '-',\n };\n setSelectedClub(minimalClubData);\n setIsClubModalOpen(true);\n }\n } catch {\n // noop\n }\n };\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n setLoading(true);\n setError(null);\n try {\n // Load public competition aliases for display\n let amap: Record<string, { alias: string; original_name?: string; display_order?: number }> = {};\n try {\n const aliases: CompetitionAlias[] = await getCompetitionAliasesPublic();\n (aliases || []).forEach((a) => { if (a?.code && a?.alias) amap[a.code] = { alias: a.alias, original_name: a.original_name, display_order: a.display_order }; });\n } catch {}\n\n // Load team-logo overrides (API + fallback to cached file)\n const now = Date.now();\n let overrides: any = null;\n try {\n const res = await fetch(resolveBackendUrl(`/api/v1/public/team-logo-overrides?t=${now}`), { cache: 'no-cache' });\n if (res.ok) overrides = await res.json();\n } catch {}\n if (!overrides) {\n try {\n const res2 = await fetch(resolveBackendUrl('/cache/prefetch/team_logo_overrides.json'), { cache: 'no-cache' });\n if (res2.ok) overrides = await res2.json();\n } catch {}\n }\n const byName: Record<string, string> = (overrides?.by_name || {}) as any;\n const byId: Record<string, { name?: string; logo_url?: string }> = (overrides?.by_id || {}) as any;\n const byNameNormalized: Record<string, string> = Object.keys(byName || {}).reduce((acc: Record<string, string>, k: string) => { acc[normalize(k)] = byName[k]; return acc; }, {});\n const byNameStrippedPairs: Array<{ keyNorm: string; url: string }> = Object.keys(byName || {}).map((k: string) => ({ keyNorm: stripPrefixes(k), url: byName[k] }));\n const normName = (s?: string) => String(s || '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[\\u2012\\u2013\\u2014\\u2015\\u2212]/g, '-')\n .replace(/\\bn\\.?\\b/g, ' nad ')\n .replace(/\\bp\\.?\\b/g, ' pod ')\n .replace(/[\\,\\s]*(z\\.?\\s*s\\.?|o\\.?\\s*s\\.?)\\s*$/g, '')\n .replace(/[\\.,!;:()\\[\\]{}]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\n const aliasNameIndex: Record<string, string> = (() => {\n const urlToName: Record<string, string> = {};\n for (const v of Object.values(byId || {})) {\n const nm = String((v as any)?.name || '').trim();\n const lg = String((v as any)?.logo_url || '').trim();\n if (nm && lg) urlToName[lg] = nm;\n }\n const idx: Record<string, string> = {};\n for (const [alias, url] of Object.entries(byName || {})) {\n const canon = urlToName[String(url)] || '';\n const key = normName(alias);\n if (canon && key) idx[key] = canon;\n }\n return idx;\n })();\n const nameIndex: Record<string, { id: string; name: string; logo_url: string }> = (() => {\n const idx: Record<string, { id: string; name: string; logo_url: string }> = {};\n for (const [id, v] of Object.entries(byId || {})) {\n const nm = String((v as any)?.name || '').trim();\n const lg = String((v as any)?.logo_url || '').trim();\n if (!nm) continue;\n const key = normName(nm);\n if (!key) continue;\n idx[key] = { id, name: nm, logo_url: lg } as any;\n }\n return idx;\n })();\n const getOverrideName = (teamName?: string, teamId?: string) => {\n const tid = teamId ? String(teamId) : '';\n if (tid && byId?.[tid]?.name && String(byId[tid].name).trim()) {\n return String(byId[tid].name).trim();\n }\n try {\n const n = normName(teamName);\n if (aliasNameIndex[n]) return aliasNameIndex[n];\n let hit: any = nameIndex[n];\n if (!hit) {\n for (const [k, v] of Object.entries(nameIndex)) {\n if (!k) continue;\n if (n.endsWith(k) || k.endsWith(n)) { hit = v; break; }\n }\n }\n if (hit && (hit as any).name) return String((hit as any).name);\n } catch {}\n return String(teamName || '');\n };\n const getOverrideLogo = (teamName?: string, original?: string, teamId?: string) => {\n // Prefer admin override by ID\n if (teamId && byId?.[teamId]?.logo_url) {\n const v = byId[teamId]!.logo_url as string;\n if (typeof v === 'string' && v.startsWith('/')) return resolveBackendUrl(v);\n return v;\n }\n if (!teamName) return original;\n const exact = (byName || {})[teamName];\n const normName = normalize(teamName);\n let candidate = exact || byNameNormalized[normName];\n if (!candidate) {\n const stripped = stripPrefixes(teamName);\n for (const { keyNorm, url } of byNameStrippedPairs) {\n if (!keyNorm) continue;\n if (stripped.endsWith(keyNorm) || keyNorm.endsWith(stripped)) { candidate = url; break; }\n }\n }\n const chosen = candidate || original;\n if (typeof chosen === 'string' && chosen.startsWith('/')) return resolveBackendUrl(chosen);\n return chosen;\n };\n const res = await fetch(resolveBackendUrl('/cache/prefetch/facr_club_info.json'), { cache: 'no-cache' });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const json = await res.json();\n\n const compLinkMap: Record<string,string> = {};\n const baseComps: Competition[] = Array.isArray(json?.competitions)\n ? json.competitions.map((c: any, cIdx: number) => {\n const compId = String(c.id || cIdx);\n if (c.matches_link) compLinkMap[compId] = String(c.matches_link);\n const matches: MatchItem[] = (Array.isArray(c.matches) ? c.matches : []).map((m: any, idx: number) => {\n const dt: string = String(m.date_time || '');\n const [d, t] = dt.includes(' ') ? dt.split(' ') : [dt, ''];\n const [day, month, year] = d.split('.');\n const isoDate = (day && month && year) ? `${year}-${month.padStart(2,'0')}-${day.padStart(2,'0')}` : new Date().toISOString().slice(0,10);\n const time = (t || '00:00').slice(0,5);\n const score = (m.score || m.result || (typeof m.goals_home === 'number' && typeof m.goals_away === 'number' ? `${m.goals_home}:${m.goals_away}` : '') || '').toString();\n const homeName = getOverrideName(m.home, m.home_id);\n const awayName = getOverrideName(m.away, m.away_id);\n return {\n id: m.match_id || `${cIdx}-${idx}`,\n date: isoDate,\n time,\n home: homeName,\n away: awayName,\n home_id: m.home_id,\n away_id: m.away_id,\n venue: m.venue,\n home_logo_url: getOverrideLogo(homeName, m.home_logo_url, m.home_id),\n away_logo_url: getOverrideLogo(awayName, m.away_logo_url, m.away_id),\n report_url: m.report_url,\n facr_link: m.facr_link,\n score: score && /\\d+\\s*:\\s*\\d+/.test(score) ? score.replace(/\\s+/g,'') : undefined,\n };\n })\n .sort((a: MatchItem, b: MatchItem) => new Date(`${a.date}T${a.time}:00`).getTime() - new Date(`${b.date}T${b.time}:00`).getTime());\n return {\n id: compId,\n code: c.code,\n name: (amap?.[c?.code]?.alias) || (amap?.[compId]?.alias) || c.name || c.code || `Soutěž ${cIdx+1}`,\n matches,\n };\n })\n : [];\n\n // Try to enrich competitions missing matches using facr detailed info file\n let enriched: Competition[] = baseComps;\n try {\n const clubId = json?.club_id;\n const clubType = json?.club_type || 'football';\n if (clubId) {\n const infoPath = `/cache/facr/${clubType}_${clubId}_info.json`;\n const res2 = await fetch(resolveBackendUrl(infoPath), { cache: 'no-cache' });\n if (res2.ok) {\n const j2 = await res2.json();\n if (Array.isArray(j2?.competitions)) {\n const mapCompMatches = (c: any, cIdx: number) => {\n const list: MatchItem[] = (Array.isArray(c.matches) ? c.matches : []).map((m: any, idx: number) => {\n const dt: string = String(m.date_time || '');\n const [d, t] = dt.includes(' ') ? dt.split(' ') : [dt, ''];\n const [day, month, year] = d.split('.');\n const isoDate = (day && month && year) ? `${year}-${month.padStart(2,'0')}-${day.padStart(2,'0')}` : new Date().toISOString().slice(0,10);\n const time = (t || '00:00').slice(0,5);\n const score = (m.score || m.result || (typeof m.goals_home === 'number' && typeof m.goals_away === 'number' ? `${m.goals_home}:${m.goals_away}` : '') || '').toString();\n return {\n id: m.match_id || `${cIdx}-${idx}`,\n date: isoDate,\n time,\n home: getOverrideName(m.home, m.home_id),\n away: getOverrideName(m.away, m.away_id),\n home_id: m.home_id,\n away_id: m.away_id,\n venue: m.venue,\n home_logo_url: getOverrideLogo(m.home, m.home_logo_url, m.home_id),\n away_logo_url: getOverrideLogo(m.away, m.away_logo_url, m.away_id),\n report_url: m.report_url,\n score: score && /\\d+\\s*:\\s*\\d+/.test(score) ? score.replace(/\\s+/g,'') : undefined,\n } as MatchItem;\n }).sort((a: MatchItem, b: MatchItem) => new Date(`${a.date}T${a.time}:00`).getTime() - new Date(`${b.date}T${b.time}:00`).getTime());\n return list;\n };\n enriched = baseComps.map((bc) => {\n if (bc.matches.length) return bc;\n const found = j2.competitions.find((c: any) => String(c.id) === String(bc.id) || c.name === bc.name || c.code === bc.name || c.code === bc.id);\n if (!found) return bc;\n const mm = mapCompMatches(found, 0);\n return { ...bc, matches: mm };\n });\n }\n }\n }\n } catch {}\n\n // Sort competitions by age (Muži first, then U19, U17, etc.) and respect custom order\n const sortedEnriched = sortCategoriesWithOrder(\n enriched.map(c => ({\n ...c,\n alias: (amap?.[c?.code || '']?.alias) || (amap?.[c?.id]?.alias),\n display_order: (amap?.[c?.code || '']?.display_order) ?? (amap?.[c?.id]?.display_order),\n }))\n );\n\n // Build unified \"All competitions\" entry as the default tab\n const allMatches: MatchItem[] = (sortedEnriched || [])\n .flatMap((c, idx) => (c.matches || []).map(m => ({ \n ...m, \n __compId: c.id, \n __compName: c.name,\n __compDisplayOrder: c.display_order ?? (1000 + idx) // Use display_order or fallback to sorted index\n } as MatchItem)))\n .sort((a, b) => new Date(`${a.date}T${a.time}:00`).getTime() - new Date(`${b.date}T${b.time}:00`).getTime());\n const allComp: Competition = { id: 'all', name: t('calendar.all_competitions'), matches: allMatches };\n\n // Load standings data\n let standingsData: any[] = [];\n try {\n const tablesRes = await fetch(resolveBackendUrl('/cache/prefetch/facr_tables.json'), { cache: 'no-cache' });\n if (tablesRes.ok) {\n const facrTablesJSON = await tablesRes.json();\n if (facrTablesJSON?.competitions?.length) {\n standingsData = (facrTablesJSON.competitions || []).map((c: any) => ({\n name: (amap?.[c?.code]?.alias) || (amap?.[c?.id]?.alias) || c.name || c.code,\n table: (c.table?.overall || []).map((r: any, idx: number) => {\n const teamName = ((): string => {\n const t = r.team;\n if (typeof t === 'string') return t;\n if (t && typeof t === 'object') {\n return t.name || t.Name || t.team_name || t.TeamName || '-';\n }\n return r.team_name || r.TeamName || '-';\n })();\n const teamId = ((): string | undefined => {\n const t = r.team;\n if (t && typeof t === 'object') {\n return t.id || t.team_id || t.teamId || r.team_id;\n }\n return r.team_id;\n })();\n return {\n position: Number(r.rank || idx + 1),\n team_name: (teamId && byId?.[teamId]?.name && String(byId[teamId].name).trim()) ? String(byId[teamId].name) : teamName,\n team_id: teamId,\n points: Number(r.points || r.pts || 0),\n played: Number(r.played || r.matches || 0),\n wins: Number(r.wins || r.win || 0),\n draws: Number(r.draws || r.draw || 0),\n losses: Number(r.losses || r.loss || 0),\n goals_for: Number(r.goals_for ?? r.gf ?? r.goalsFor ?? r.scored ?? r.goals ?? 0),\n goals_against: Number(r.goals_against ?? r.ga ?? r.goalsAgainst ?? r.conceded ?? 0),\n logo_url: (teamId && byId?.[teamId]?.logo_url) ? String(byId[teamId].logo_url) : (r.team_logo_url || undefined),\n };\n }),\n }));\n }\n }\n } catch {}\n\n if (!cancelled) {\n setAliasMap(amap);\n const comps = [allComp, ...sortedEnriched];\n setCompetitions(comps);\n setCompLinks(compLinkMap);\n setStandings(standingsData);\n if (json?.name) setClubName(String(json.name));\n if (json?.club_internal_id) setClubId(String(json.club_internal_id));\n if (json?.club_type) setClubType(json.club_type);\n // Set active tab from query ?comp=<id>\n const compQ = searchParams.get('comp');\n if (compQ) {\n const idx = comps.findIndex(cmp => String(cmp.id) === String(compQ));\n setTabIndex(idx >= 0 ? idx : 0);\n } else {\n setTabIndex(0);\n }\n }\n } catch (e: any) {\n if (!cancelled) setError(e?.message || 'Nepodařilo se načíst kalendář.');\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => { cancelled = true; };\n }, []);\n\n // Optimized countdown hooks\n const modalCountdown = useCountdown(\n selected ? `${selected.match.date}T${selected.match.time || '00:00'}:00` : null,\n 1000 // Update every second for modal\n );\n\n // Get upcoming matches for live countdowns (only future matches)\n const upcomingMatches = useMemo(() => {\n const list = activeCompetition?.matches || [];\n return list.filter(match => {\n const matchTime = new Date(`${match.date}T${match.time || '00:00'}:00`).getTime();\n return matchTime > Date.now();\n });\n }, [activeCompetition]);\n\n const liveCountdowns = useMultipleCountdowns(upcomingMatches, 30000); // Update every 30 seconds for better performance\n\n const openMatchModal = (match: MatchItem, comp?: Competition) => {\n setSelected({ match, comp });\n onOpen();\n };\n\n // Handle middle click to open in new tab\n const handleMatchMouseDown: React.MouseEventHandler<HTMLAnchorElement | HTMLDivElement> = (e) => {\n // Middle click or Ctrl/Cmd+Click should open link in new tab naturally when using <a>.\n // This handler is a safety net when match is rendered as a div.\n if (e.button === 1) {\n const target = e.currentTarget as HTMLElement & { dataset?: any };\n const href = (target.getAttribute && target.getAttribute('data-href')) || (target as any).dataset?.href;\n if (href) {\n try {\n e.preventDefault();\n e.stopPropagation();\n const link = document.createElement('a');\n link.href = href as string;\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n setTimeout(() => { try { window.focus(); } catch {} }, 0);\n } catch {\n window.open(href as string, '_blank', 'noopener,noreferrer');\n }\n }\n }\n };\n\n const hasData = useMemo(() => competitions.some(c => c.matches.length), [competitions]);\n\n // Month-view state and helpers\n const [monthRef, setMonthRef] = useState<Date>(startOfMonth(new Date()));\n const [viewMode, setViewMode] = useState<'calendar'|'list'>('calendar');\n const [expandedDates, setExpandedDates] = useState<Record<string, boolean>>({});\n const [showPast, setShowPast] = useState<boolean>(false);\n // Compute today's date string in Prague timezone once and reuse\n const pragueTodayStr = useMemo(() => {\n try {\n const parts = new Intl.DateTimeFormat('cs-CZ', {\n timeZone: 'Europe/Prague',\n year: 'numeric', month: '2-digit', day: '2-digit'\n }).formatToParts(new Date());\n const y = parts.find(p => p.type === 'year')?.value;\n const m = parts.find(p => p.type === 'month')?.value;\n const d = parts.find(p => p.type === 'day')?.value;\n if (y && m && d) return `${y}-${m}-${d}`;\n } catch {}\n return format(new Date(), 'yyyy-MM-dd');\n }, []);\n const weeks = useMemo(() => {\n const start = startOfWeek(startOfMonth(monthRef), { weekStartsOn: 1 });\n // Build 6 weeks x 7 days\n const days: Date[] = [];\n for (let i = 0; i < 42; i++) {\n days.push(addDays(start, i));\n }\n return days;\n }, [monthRef]);\n\n const groupByDate = (matches: MatchItem[]) => {\n const map = new Map<string, MatchItem[]>();\n matches.forEach((m) => {\n const key = m.date;\n const arr = map.get(key) || [];\n arr.push(m);\n map.set(key, arr);\n });\n // Sort matches within each day by competition order, then by time\n map.forEach((matchList, dateKey) => {\n matchList.sort((a, b) => {\n // First sort by competition display order (if available)\n const aOrder = a.__compDisplayOrder ?? 9999;\n const bOrder = b.__compDisplayOrder ?? 9999;\n if (aOrder !== bOrder) {\n return aOrder - bOrder;\n }\n // Then sort by time\n const aTime = a.time || '00:00';\n const bTime = b.time || '00:00';\n return aTime.localeCompare(bTime);\n });\n });\n return map;\n };\n\n const getMatchCompInfo = (m: MatchItem, comp?: Competition): { display: string; alias?: string } => {\n try {\n let baseComp: Competition | undefined = comp;\n if ((comp?.id === 'all' || !comp) && m.__compId) {\n baseComp = competitions.find((cc) => String(cc.id) === String(m.__compId));\n }\n const display = (m.__compName) || (baseComp?.name || '');\n const alias = baseComp?.code ? (aliasMap[baseComp.code]?.alias) : undefined;\n return { display, alias };\n } catch {\n return { display: m.__compName || comp?.name || '', alias: undefined };\n }\n };\n\n // Sentiment helpers\n const isClubTeam = (team: string) => {\n try {\n const a = stripPrefixes(team);\n const b = stripPrefixes(clubName || '');\n if (!a || !b) return false;\n // Allow equality or suffix match (handles prefixes like TJ, SK, etc.)\n // Also handle common abbreviations like \"FK\" vs \"Fotbalový klub\"\n const aClean = a.replace(/\\bfk\\b/g, '').replace(/\\bfotbalový\\s+klub\\b/g, '').trim();\n const bClean = b.replace(/\\bfk\\b/g, '').replace(/\\bfotbalový\\s+klub\\b/g, '').trim();\n return a === b || a.endsWith(b) || b.endsWith(a) || aClean === bClean || aClean.endsWith(bClean) || bClean.endsWith(aClean);\n } catch { return false; }\n };\n const parseScore = (score?: string): { h: number; a: number } | null => {\n if (!score) return null;\n const m = score.match(/^(\\d+)\\s*[:\\-]\\s*(\\d+)$/);\n if (!m) return null;\n return { h: parseInt(m[1], 10), a: parseInt(m[2], 10) };\n };\n\n return (\n <MainLayout>\n <Container maxW=\"7xl\" py={{ base: 6, md: 10 }}>\n <Heading as=\"h1\" size=\"xl\" mb={2}>{t('calendar.title')}</Heading>\n <Text color=\"gray.600\" mb={6}>{t('calendar.subtitle')}</Text>\n\n {loading && (\n <Flex align=\"center\" gap={3} color=\"gray.600\" mb={6}>\n <Spinner size=\"sm\" />\n <span>{t('calendar.loading')}</span>\n </Flex>\n )}\n\n {error && (\n <Box color=\"red.600\" mb={4}>{error}</Box>\n )}\n\n {!loading && !hasData && !error && (\n <Box color=\"gray.600\">{t('calendar.no_matches')}</Box>\n )}\n\n {!!competitions.length && (\n <Tabs variant=\"soft-rounded\" colorScheme=\"blue\" index={tabIndex} onChange={(i) => setTabIndex(i)} isLazy lazyBehavior=\"keepMounted\">\n {/* Compact, wrapped TabList with better spacing (no overlap) */}\n <Box mb={3} position=\"relative\" zIndex={1}>\n <TabList\n flexWrap=\"wrap\"\n gap={2}\n justifyContent=\"flex-start\"\n sx={{\n '& > button': {\n minW: 'auto',\n px: { base: 3, md: 4 },\n py: { base: 1.5, md: 2 },\n fontSize: { base: 'xs', md: 'sm' },\n fontWeight: 600,\n borderRadius: 'md',\n transition: 'all 0.2s',\n _selected: {\n bg: 'brand.primary',\n color: 'white',\n transform: 'translateY(-2px)',\n boxShadow: 'md'\n },\n _hover: {\n transform: 'translateY(-1px)',\n boxShadow: 'sm'\n }\n }\n }}\n >\n {competitions.map((c) => (\n <Tab key={c.id}>\n {c.name}\n </Tab>\n ))}\n </TabList>\n </Box>\n <TabPanels>\n {competitions.map((c, idx) => {\n const isActive = idx === tabIndex;\n const byDate = isActive ? groupByDate(c.matches) : (new Map() as Map<string, MatchItem[]>);\n const mkHref = (m: MatchItem) => (m.facr_link || m.report_url || undefined) ?? (`/zapas/${m.id}`);\n // Build latest results (only matches with score)\n const nowTs = isActive ? Date.now() : 0;\n const compareByDateDesc = (a: MatchItem, b: MatchItem) => new Date(`${b.date}T${(b.time||'00:00')}:00`).getTime() - new Date(`${a.date}T${(a.time||'00:00')}:00`).getTime();\n let latestResults: MatchItem[] = [];\n if (isActive) {\n if (c.id === 'all') {\n // For 'all', pick most recent scored match per competition\n const grouped: Record<string, MatchItem[]> = {};\n (c.matches || []).forEach((m) => {\n if (!m.score) return;\n const ts = new Date(`${m.date}T${(m.time||'00:00')}:00`).getTime();\n if (isNaN(ts) || ts > nowTs) return; // future results not allowed\n const key = m.__compId || 'na';\n grouped[key] = grouped[key] || [];\n grouped[key].push(m);\n });\n latestResults = Object.values(grouped)\n .map(list => list.sort(compareByDateDesc)[0])\n .filter(Boolean)\n .sort(compareByDateDesc);\n } else {\n // Single competition: pick the most recent scored match\n latestResults = (c.matches || [])\n .filter(m => !!m.score && new Date(`${m.date}T${(m.time||'00:00')}:00`).getTime() <= nowTs)\n .sort(compareByDateDesc)\n .slice(0, 1);\n }\n }\n return (\n <TabPanel key={c.id} px={0}>\n {/* Latest results header list rendered above both calendar and list modes */}\n {isActive && latestResults.length > 0 && (\n <Box mb={4}>\n <Heading as=\"h3\" size=\"md\" mb={2}>Nejnovější výsledky</Heading>\n <Grid templateColumns={{ base: '1fr', sm: 'repeat(2, 1fr)', lg: 'repeat(3, 1fr)' }} gap={3}>\n {latestResults.map((m) => {\n const href = mkHref(m);\n const info = getMatchCompInfo(m, c);\n return (\n <Tooltip\n key={`latest-${c.id}-${m.id}`}\n label={(\n <Box>\n <Text fontSize=\"xs\">Kategorie: {info.display || '—'}</Text>\n {info.alias && info.alias !== info.display && (\n <Text fontSize=\"xs\">Alias: {info.alias}</Text>\n )}\n </Box>\n )}\n hasArrow\n placement=\"top\"\n openDelay={200}\n >\n <Box position=\"relative\" data-href={href || undefined} onMouseDown={handleMatchMouseDown} onClick={() => openMatchModal(m, c)} borderWidth=\"1px\" borderRadius=\"md\" p={2} _hover={{ textDecoration: 'none', bg: 'rgba(0,0,0,0.03)', borderColor: 'brand.primary', cursor: 'pointer' }}>\n {href && (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(e) => { if (!(e.ctrlKey || e.metaKey || e.shiftKey || e.altKey)) e.preventDefault(); }}\n onMouseDown={(e) => { if (e.button === 1) { e.preventDefault(); e.stopPropagation(); try { const w = window.open(href as string, '_blank', 'noopener,noreferrer'); (w as any)?.blur?.(); setTimeout(() => { try { window.focus(); } catch {} }, 0); } catch {} } }}\n onAuxClick={(e) => { if ((e as any).button === 1) { e.preventDefault(); e.stopPropagation(); try { const w = window.open(href as string, '_blank', 'noopener,noreferrer'); (w as any)?.blur?.(); setTimeout(() => { try { window.focus(); } catch {} }, 0); } catch {} } }}\n style={{ position: 'absolute', inset: 0, zIndex: 1 }}\n aria-hidden\n />\n )}\n <Flex align=\"center\" justify=\"space-between\" mb={2}>\n <Text fontSize=\"sm\" color=\"gray.700\">{m.date} {m.time || ''}</Text>\n <Badge colorScheme=\"purple\">{m.__compName || c.name}</Badge>\n </Flex>\n <Flex align=\"center\" gap={2} justify=\"center\">\n <TeamLogo\n teamId={m.home_id}\n teamName={m.home}\n facrLogo={m.home_logo_url}\n size=\"custom\"\n boxSize=\"18px\"\n alt={m.home}\n borderRadius=\"full\"\n />\n <Text fontSize=\"sm\">{m.home}</Text>\n <Badge colorScheme={getSentiment(m)?.color || 'gray'}>{m.score || 'vs'}</Badge>\n <TeamLogo\n teamId={m.away_id}\n teamName={m.away}\n facrLogo={m.away_logo_url}\n size=\"custom\"\n boxSize=\"18px\"\n alt={m.away}\n borderRadius=\"full\"\n />\n <Text fontSize=\"sm\">{m.away}</Text>\n </Flex>\n {href && <Link href={href} isExternal onClick={(e)=> e.stopPropagation()} display=\"none\"/>}\n </Box>\n </Tooltip>\n );\n })}\n </Grid>\n </Box>\n )}\n <Flex align=\"center\" justify=\"flex-end\" mb={3}>\n <ButtonGroup size=\"sm\" isAttached>\n <Button\n variant={viewMode==='calendar' ? 'solid' : 'outline'}\n bg={viewMode==='calendar' ? 'brand.primary' : undefined}\n color={viewMode==='calendar' ? 'text.onPrimary' : undefined}\n _hover={{ filter: viewMode==='calendar' ? 'brightness(0.95)' : undefined, borderColor: 'brand.primary', color: viewMode==='calendar' ? 'text.onPrimary' : undefined }}\n onClick={() => setViewMode('calendar')}\n >{t('calendar.title')}</Button>\n <Button\n variant={viewMode==='list' ? 'solid' : 'outline'}\n bg={viewMode==='list' ? 'brand.primary' : undefined}\n color={viewMode==='list' ? 'text.onPrimary' : undefined}\n _hover={{ filter: viewMode==='list' ? 'brightness(0.95)' : undefined, borderColor: 'brand.primary', color: viewMode==='list' ? 'text.onPrimary' : undefined }}\n onClick={() => setViewMode('list')}\n >{t('calendar.list_view')}</Button>\n </ButtonGroup>\n </Flex>\n {viewMode === 'calendar' ? (\n <>\n <Flex align=\"center\" justify=\"space-between\" mb={3} gap={2} flexWrap={{ base: 'wrap', md: 'nowrap' }}>\n <IconButton\n aria-label={t('calendar.previous_month')}\n size=\"sm\"\n onClick={() => setMonthRef(addMonths(monthRef, -1))}\n icon={<ChevronLeftIcon />}\n variant=\"outline\"\n _hover={{ bg: 'rgba(0,0,0,0.04)', borderColor: 'brand.primary' }}\n />\n <Button\n size=\"sm\"\n onClick={() => setMonthRef(new Date())}\n variant=\"solid\"\n bg={'brand.primary'}\n color={'text.onPrimary'}\n _hover={{ filter: 'brightness(0.95)' }}\n >{t('calendar.today')}</Button>\n <IconButton\n aria-label={t('calendar.next_month')}\n size=\"sm\"\n onClick={() => setMonthRef(addMonths(monthRef, 1))}\n icon={<ChevronRightIcon />}\n variant=\"outline\"\n _hover={{ bg: 'rgba(0,0,0,0.04)', borderColor: 'brand.primary' }}\n />\n </Flex>\n <Box overflowX=\"auto\">\n <Grid templateColumns=\"repeat(7, 1fr)\" gap={3} minW=\"980px\">\n {weekdayHeaders.map((w: string) => (\n <Box key={w} textAlign=\"center\" fontWeight=\"semibold\" color=\"gray.600\" fontSize={{ base: 'xs', md: 'sm' }}>{w}</Box>\n ))}\n </Grid>\n </Box>\n <Box overflowX=\"auto\">\n <Grid templateColumns=\"repeat(7, 1fr)\" gap={{ base: 1, md: 2 }} minW=\"980px\">\n {weeks.map((day, idx) => {\n const key = format(day, 'yyyy-MM-dd');\n const list = byDate.get(key) || [];\n const faded = !isSameMonth(day, monthRef);\n const today = format(day, 'yyyy-MM-dd') === pragueTodayStr;\n return (\n <Box\n key={idx}\n borderWidth=\"1px\"\n borderRadius=\"md\"\n p={2}\n minH=\"120px\"\n minW=\"130px\"\n bg={today ? 'rgba(59,130,246,0.06)' : calendarDayBg}\n borderColor={today ? 'brand.primary' : calendarDayBorder}\n opacity={faded ? 0.6 : 1}\n >\n <Flex align=\"center\" justify=\"space-between\" mb={2}>\n <Text fontWeight=\"bold\">{format(day, 'd')}</Text>\n {!!list.length && (\n <Badge bg=\"brand.primary\" color=\"text.onPrimary\" borderRadius=\"full\">{list.length}</Badge>\n )}\n </Flex>\n <Stack spacing={2}>\n {(expandedDates[key] ? list : list.slice(0,3)).map((m: MatchItem) => {\n const href = mkHref(m);\n const isPast = new Date(`${m.date}T${(m.time||'00:00')}:00`).getTime() < Date.now();\n const countdown = liveCountdowns[String(m.id)];\n const info = getMatchCompInfo(m, c);\n return (\n <Tooltip\n key={m.id}\n label={(\n <Box>\n <Text fontSize=\"xs\">Kategorie: {info.display || '—'}</Text>\n {info.alias && info.alias !== info.display && (\n <Text fontSize=\"xs\">Alias: {info.alias}</Text>\n )}\n </Box>\n )}\n hasArrow\n placement=\"top\"\n openDelay={200}\n >\n <Box position=\"relative\" _hover={{ textDecoration: 'none' }} data-href={href || undefined} onMouseDown={handleMatchMouseDown} onClick={() => openMatchModal(m, c)}>\n {href && (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(e) => { if (!(e.ctrlKey || e.metaKey || e.shiftKey || e.altKey)) e.preventDefault(); }}\n onMouseDown={(e) => { if (e.button === 1) { e.preventDefault(); e.stopPropagation(); try { const w = window.open(href as string, '_blank', 'noopener,noreferrer'); (w as any)?.blur?.(); setTimeout(() => { try { window.focus(); } catch {} }, 0); } catch {} } }}\n onAuxClick={(e) => { if ((e as any).button === 1) { e.preventDefault(); e.stopPropagation(); try { const w = window.open(href as string, '_blank', 'noopener,noreferrer'); (w as any)?.blur?.(); setTimeout(() => { try { window.focus(); } catch {} }, 0); } catch {} } }}\n style={{ position: 'absolute', inset: 0, zIndex: 1 }}\n aria-hidden\n />\n )}\n <Box p={2} borderWidth=\"1px\" borderRadius=\"md\" bg={calendarMatchBg} _hover={{ bg: calendarMatchHoverBg, borderColor: 'brand.primary', cursor: 'pointer' }} textAlign=\"center\">\n {!isPast && countdown ? (\n <>\n <Flex align=\"center\" justify=\"center\" gap={2} mb={1}>\n {m.home_logo_url && <Image src={m.home_logo_url} alt={m.home} boxSize=\"18px\" borderRadius=\"full\" objectFit=\"cover\" loading=\"lazy\" decoding=\"async\" />}\n <Badge colorScheme=\"orange\">za {countdown}</Badge>\n {m.away_logo_url && <Image src={m.away_logo_url} alt={m.away} boxSize=\"18px\" borderRadius=\"full\" objectFit=\"cover\" loading=\"lazy\" decoding=\"async\" />}\n </Flex>\n <Text fontSize=\"xs\" color=\"text.secondary\">{m.time || '—'}</Text>\n </>\n ) : (\n <>\n <Flex align=\"center\" justify=\"center\" gap={2} mb={1}>\n {m.home_logo_url && <Image src={m.home_logo_url} alt={m.home} boxSize=\"18px\" borderRadius=\"full\" objectFit=\"cover\" loading=\"lazy\" decoding=\"async\" />}\n <Badge colorScheme={isPast && m.score ? (getSentiment(m)?.color || 'gray') : 'gray'}>{isPast && m.score ? m.score : 'vs'}</Badge>\n {m.away_logo_url && <Image src={m.away_logo_url} alt={m.away} boxSize=\"18px\" borderRadius=\"full\" objectFit=\"cover\" loading=\"lazy\" decoding=\"async\" />}\n </Flex>\n <Text fontSize=\"xs\" color=\"text.secondary\">{m.time || '—'}</Text>\n </>\n )}\n </Box>\n {href && (\n <Link href={href} isExternal onClick={(e)=> e.stopPropagation()} display=\"none\"/>\n )}\n </Box>\n </Tooltip>\n );\n })}\n {list.length > 3 && !expandedDates[key] && (\n <Button size=\"xs\" variant=\"link\" colorScheme=\"gray\" onClick={() => setExpandedDates((s) => ({ ...s, [key]: true }))}>\n {t('calendar.show_more', { count: list.length - 3 })}\n </Button>\n )}\n {expandedDates[key] && list.length > 3 && (\n <Button size=\"xs\" variant=\"link\" colorScheme=\"gray\" onClick={() => setExpandedDates((s) => ({ ...s, [key]: false }))}>\n {t('calendar.show_less')}\n </Button>\n )}\n </Stack>\n </Box>\n );\n })}\n </Grid>\n </Box>\n </>\n ) : (\n <Stack spacing={4}>\n {(() => {\n const keys = Array.from(byDate.keys());\n const todayStr = pragueTodayStr;\n const pastKeys = keys.filter(k => k < todayStr).sort().reverse();\n const futureKeys = keys.filter(k => k >= todayStr).sort();\n const renderGroup = (dKey: string, highlight: boolean) => {\n const dayMatches = byDate.get(dKey) || [];\n return (\n <Box key={dKey} borderWidth=\"1px\" borderRadius=\"md\" overflow=\"hidden\" bg={listGroupBg} borderColor={listGroupBorder}>\n <Box\n px={3}\n py={2}\n bg={highlight ? listGroupHeaderBgHighlight : listGroupHeaderBg}\n borderLeftWidth=\"4px\"\n borderLeftColor={highlight ? 'brand.primary' : listGroupHeaderBorderLeft}\n >\n <Flex align=\"center\" gap={2}>\n <Text fontWeight=\"semibold\" color={highlight ? 'brand.primary' : listGroupHeaderText}>\n {format(parse(dKey, 'yyyy-MM-dd', new Date()), 'EEEE d. M. yyyy', { locale: cs })}\n </Text>\n {highlight && (\n <Badge colorScheme=\"blue\" variant=\"subtle\" borderRadius=\"full\">{t('calendar.today')}</Badge>\n )}\n </Flex>\n </Box>\n <Stack spacing={3}>\n {dayMatches.map((m: MatchItem) => {\n const href = mkHref(m);\n const isPast = new Date(`${m.date}T${(m.time||'00:00')}:00`).getTime() < Date.now();\n const sentiment = isPast ? getSentiment(m) : null;\n const countdown = liveCountdowns[String(m.id)];\n const info = getMatchCompInfo(m, c);\n return (\n <Tooltip\n key={m.id}\n label={(\n <Box>\n <Text fontSize=\"xs\">Kategorie: {info.display || '—'}</Text>\n {info.alias && info.alias !== info.display && (\n <Text fontSize=\"xs\">Alias: {info.alias}</Text>\n )}\n </Box>\n )}\n hasArrow\n placement=\"top\"\n openDelay={200}\n >\n <Box position=\"relative\" _hover={{ textDecoration: 'none' }} data-href={href || undefined} onMouseDown={handleMatchMouseDown} onClick={() => openMatchModal(m, c)}>\n {href && (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(e) => { e.preventDefault(); }}\n onMouseDown={(e) => { if (e.button === 1) { e.preventDefault(); e.stopPropagation(); try { const w = window.open(href as string, '_blank', 'noopener,noreferrer'); (w as any)?.blur?.(); setTimeout(() => { try { window.focus(); } catch {} }, 0); } catch {} } }}\n onAuxClick={(e) => { if ((e as any).button === 1) { e.preventDefault(); e.stopPropagation(); try { const w = window.open(href as string, '_blank', 'noopener,noreferrer'); (w as any)?.blur?.(); setTimeout(() => { try { window.focus(); } catch {} }, 0); } catch {} } }}\n style={{ position: 'absolute', inset: 0, zIndex: 1 }}\n aria-hidden\n />\n )}\n <Flex\n align=\"center\"\n justify=\"space-between\"\n p={3}\n borderWidth=\"1px\"\n borderRadius=\"md\"\n bg={listMatchBg}\n borderColor={listMatchBorder}\n _hover={{ bg: listMatchHoverBg, borderColor: 'brand.primary', cursor: 'pointer', transform: 'translateY(-2px)', boxShadow: 'md' }}\n transition=\"all 0.2s\"\n gap={3}\n >\n <Flex direction=\"column\" minW=\"100px\">\n <Text fontWeight=\"semibold\" color={listDateText} fontSize=\"sm\">{m.date}</Text>\n <Text color={listDateText} fontSize=\"sm\">{m.time || '—'}</Text>\n {m.venue && <Text color={listVenueText} fontSize=\"xs\" mt={1}>{m.venue}</Text>}\n </Flex>\n \n <Flex align=\"center\" gap={3} flex=\"1\">\n {/* Home Team */}\n <Flex align=\"center\" gap={2} flex=\"1\" justify=\"flex-end\">\n <Text fontSize=\"sm\" fontWeight=\"medium\" textAlign=\"right\" color={listDateText}>\n {m.home}\n </Text>\n {m.home_logo_url && (\n <Image \n src={m.home_logo_url} \n alt={m.home} \n boxSize=\"32px\" \n borderRadius=\"full\" \n objectFit=\"cover\"\n border=\"2px solid\"\n borderColor=\"gray.200\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n )}\n </Flex>\n \n {/* Score or Countdown */}\n <Flex direction=\"column\" align=\"center\" gap={1} minW=\"80px\">\n {!isPast && countdown ? (\n <Badge colorScheme=\"orange\" fontSize=\"sm\" px={2}>za {countdown}</Badge>\n ) : (\n <Badge colorScheme={isPast && m.score ? (getSentiment(m)?.color || 'gray') : 'gray'} fontSize=\"md\" px={3} py={1}>\n {isPast && m.score ? m.score : 'vs'}\n </Badge>\n )}\n {sentiment && (\n <Text fontSize=\"xs\" color={`${sentiment.color}.600`} fontWeight=\"semibold\">\n {sentiment.label}\n </Text>\n )}\n </Flex>\n \n {/* Away Team */}\n <Flex align=\"center\" gap={2} flex=\"1\" justify=\"flex-start\">\n {m.away_logo_url && (\n <Image \n src={m.away_logo_url} \n alt={m.away} \n boxSize=\"32px\" \n borderRadius=\"full\" \n objectFit=\"cover\"\n border=\"2px solid\"\n borderColor=\"gray.200\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n )}\n <Text fontSize=\"sm\" fontWeight=\"medium\" textAlign=\"left\" color={listDateText}>\n {m.away}\n </Text>\n </Flex>\n </Flex>\n </Flex>\n {href && (\n <Link href={href} isExternal onClick={(e)=> e.stopPropagation()} display=\"none\"/>\n )}\n </Box>\n </Tooltip>\n );\n })}\n </Stack>\n </Box>\n );\n };\n return (\n <>\n {!!pastKeys.length && (\n <Box>\n {!showPast ? (\n <Button size=\"sm\" variant=\"link\" onClick={() => setShowPast(true)}>\n Zobrazit předchozí zápasy ({pastKeys.reduce((acc, k) => acc + (byDate.get(k)?.length || 0), 0)})\n </Button>\n ) : (\n <Button size=\"sm\" variant=\"link\" onClick={() => setShowPast(false)}>\n {t('calendar.hide_past_matches')}\n </Button>\n )}\n {showPast && (\n <Stack spacing={4} mt={2}>\n {pastKeys.map((k) => renderGroup(k, false))}\n </Stack>\n )}\n </Box>\n )}\n <Stack spacing={4}>\n {futureKeys.map((k) => renderGroup(k, k === todayStr))}\n </Stack>\n </>\n );\n })()}\n </Stack>\n )}\n </TabPanel>\n );\n })}\n </TabPanels>\n </Tabs>\n )}\n\n {/* Match details modal */}\n <Modal isOpen={isOpen} onClose={onClose} size=\"lg\" isCentered returnFocusOnClose={false}>\n <ModalContent>\n <ModalHeader>\n {selected ? (selected.match.__compName || selected.comp?.name || 'Detail zápasu') : 'Detail zápasu'}\n </ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n {selected && (\n <Stack spacing={4}>\n {/* Show match status (Výhra/Remíza/Prohra) if determinable; otherwise fall back to competition name */}\n {(() => {\n const s = getSentiment(selected.match);\n if (s) {\n return (\n <Flex justify=\"center\">\n <Badge colorScheme={s.color as any} variant=\"subtle\">{s.label}</Badge>\n </Flex>\n );\n }\n const compName = selected.comp?.name || selected.match.__compName;\n // Don't show \"Všechny soutěže\" badge - only show specific competition names\n if (compName && compName !== 'Všechny soutěže') {\n return (\n <Flex justify=\"center\">\n <Badge colorScheme=\"purple\">{compName}</Badge>\n </Flex>\n );\n }\n return null;\n })()}\n <Flex align=\"center\" justify=\"center\" gap={3}>\n {selected.match.home_logo_url && (\n <Image \n src={selected.match.home_logo_url} \n alt={selected.match.home} \n boxSize=\"40px\" \n borderRadius=\"full\"\n cursor=\"pointer\"\n onClick={() => handleTeamClick(selected.match.home, selected.match.home_logo_url)}\n _hover={{ opacity: 0.8, transform: 'scale(1.1)' }}\n transition=\"all 0.2s\"\n title={`Klikněte pro zobrazení statistik: ${selected.match.home}`}\n />\n )}\n {(() => {\n const dt = new Date(`${selected.match.date}T${(selected.match.time || '00:00')}:00`);\n const isPast = Date.now() >= dt.getTime();\n const hasScore = Boolean(selected.match.score);\n \n // For future matches, always show countdown or \"vs\" - never the score\n if (!isPast) {\n if (modalCountdown.countdownString) {\n return (\n <Badge colorScheme=\"orange\" fontSize=\"md\" px={3} py={1}>za {modalCountdown.countdownString}</Badge>\n );\n }\n return (\n <Badge colorScheme=\"gray\" fontSize=\"md\" px={3} py={1}>vs</Badge>\n );\n }\n \n // For past matches, show score or \"vs\"\n return (\n <Badge colorScheme={hasScore ? (getSentiment(selected.match)?.color || 'gray') : 'gray'} fontSize=\"md\" px={3} py={1}>\n {hasScore ? selected.match.score : 'vs'}\n </Badge>\n );\n })()}\n {selected.match.away_logo_url && (\n <Image \n src={selected.match.away_logo_url} \n alt={selected.match.away} \n boxSize=\"40px\" \n borderRadius=\"full\"\n cursor=\"pointer\"\n onClick={() => handleTeamClick(selected.match.away, selected.match.away_logo_url)}\n _hover={{ opacity: 0.8, transform: 'scale(1.1)' }}\n transition=\"all 0.2s\"\n title={`Klikněte pro zobrazení statistik: ${selected.match.away}`}\n />\n )}\n </Flex>\n {/* Date and Time Display with Countdown */}\n <Box textAlign=\"center\">\n <Text fontSize=\"lg\" fontWeight=\"semibold\" color=\"gray.800\" mb={1}>\n {(() => {\n try {\n return format(parse(selected.match.date, 'yyyy-MM-dd', new Date()), 'EEEE d. MMMM yyyy', { locale: cs });\n } catch {\n return selected.match.date;\n }\n })()}\n </Text>\n <Text fontSize=\"md\" color=\"gray.700\">\n {selected.match.time || '—'}\n </Text>\n </Box>\n \n {/* Enhanced Countdown Display for Upcoming Matches */}\n {(() => {\n const dt = new Date(`${selected.match.date}T${(selected.match.time || '00:00')}:00`);\n const isPast = Date.now() >= dt.getTime();\n const hasScore = Boolean(selected.match.score);\n \n if (!hasScore && !isPast && modalCountdown.isActive && modalCountdown.timeRemaining > 0) {\n const days = Math.floor(modalCountdown.timeRemaining / (24 * 60 * 60 * 1000));\n const hours = Math.floor((modalCountdown.timeRemaining % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000));\n const minutes = Math.floor((modalCountdown.timeRemaining % (60 * 60 * 1000)) / (60 * 1000));\n const seconds = Math.floor((modalCountdown.timeRemaining % (60 * 1000)) / 1000);\n \n return (\n <Box \n mt={4} \n p={4} \n bg=\"orange.50\" \n borderRadius=\"lg\" \n borderWidth=\"2px\" \n borderColor=\"orange.200\"\n >\n <Text fontSize=\"sm\" fontWeight=\"semibold\" color=\"orange.800\" mb={3} textAlign=\"center\">\n Zápas začíná za\n </Text>\n <Grid \n templateColumns={days > 0 ? \"repeat(4, 1fr)\" : \"repeat(3, 1fr)\"} \n gap={3}\n >\n {days > 0 && (\n <Box textAlign=\"center\">\n <Box \n bg=\"white\" \n borderRadius=\"md\" \n p={3} \n borderWidth=\"1px\" \n borderColor=\"orange.300\"\n boxShadow=\"sm\"\n >\n <Text fontSize=\"2xl\" fontWeight=\"bold\" color=\"orange.600\">\n {days}\n </Text>\n </Box>\n <Text fontSize=\"xs\" color=\"gray.600\" mt={1} fontWeight=\"medium\">\n {days === 1 ? 'den' : days < 5 ? 'dny' : 'dní'}\n </Text>\n </Box>\n )}\n <Box textAlign=\"center\">\n <Box \n bg=\"white\" \n borderRadius=\"md\" \n p={3} \n borderWidth=\"1px\" \n borderColor=\"orange.300\"\n boxShadow=\"sm\"\n >\n <Text fontSize=\"2xl\" fontWeight=\"bold\" color=\"orange.600\">\n {String(hours).padStart(2, '0')}\n </Text>\n </Box>\n <Text fontSize=\"xs\" color=\"gray.600\" mt={1} fontWeight=\"medium\">\n {hours === 1 ? 'hodina' : hours < 5 ? 'hodiny' : 'hodin'}\n </Text>\n </Box>\n <Box textAlign=\"center\">\n <Box \n bg=\"white\" \n borderRadius=\"md\" \n p={3} \n borderWidth=\"1px\" \n borderColor=\"orange.300\"\n boxShadow=\"sm\"\n >\n <Text fontSize=\"2xl\" fontWeight=\"bold\" color=\"orange.600\">\n {String(minutes).padStart(2, '0')}\n </Text>\n </Box>\n <Text fontSize=\"xs\" color=\"gray.600\" mt={1} fontWeight=\"medium\">\n {minutes === 1 ? 'minuta' : minutes < 5 ? 'minuty' : 'minut'}\n </Text>\n </Box>\n <Box textAlign=\"center\">\n <Box \n bg=\"white\" \n borderRadius=\"md\" \n p={3} \n borderWidth=\"1px\" \n borderColor=\"orange.300\"\n boxShadow=\"sm\"\n >\n <Text fontSize=\"2xl\" fontWeight=\"bold\" color=\"orange.600\">\n {String(seconds).padStart(2, '0')}\n </Text>\n </Box>\n <Text fontSize=\"xs\" color=\"gray.600\" mt={1} fontWeight=\"medium\">\n {seconds === 1 ? 'sekunda' : seconds < 5 ? 'sekundy' : 'sekund'}\n </Text>\n </Box>\n </Grid>\n </Box>\n );\n }\n return null;\n })()}\n <Box h=\"1px\" bg=\"gray.200\" />\n \n {/* Weather widget for home matches that haven't started */}\n {(() => {\n const dt = new Date(`${selected.match.date}T${(selected.match.time || '00:00')}:00`);\n const isPast = Date.now() >= dt.getTime();\n const isHomeMatch = clubName && selected.match.home && isClubTeam(selected.match.home);\n \n if (isHomeMatch && !isPast) {\n return (\n <Box>\n <MatchWeather\n matchDateTime={`${selected.match.date}T${selected.match.time || '15:00'}:00`}\n venue={undefined} // Home matches use club location\n isHomeMatch={true}\n matchHasStarted={false}\n delayLoad={false} // Auto-load when modal opens\n />\n </Box>\n );\n }\n return null;\n })()}\n \n <Box h=\"1px\" bg=\"gray.200\" />\n <Heading as=\"h3\" size=\"sm\">Odběr notifikací pro fanoušky</Heading>\n <Text fontSize=\"sm\" color=\"gray.600\">Zadejte svůj email a budeme vás informovat o novinkách a zápasech.</Text>\n <Flex gap={2} align=\"center\">\n <Input type=\"email\" placeholder=\"váš@email.cz\" value={fanEmail} onChange={(e) => setFanEmail(e.target.value)} />\n <Button colorScheme=\"red\" onClick={subscribeFan} isLoading={fanSubscribing}>Odebírat</Button>\n </Flex>\n </Stack>\n )}\n </ModalBody>\n <ModalFooter>\n {selected && (selected.match.facr_link || selected.match.report_url) && (\n <Button \n colorScheme=\"blue\" \n mr={3}\n onClick={(e) => {\n e.preventDefault();\n // Open in background tab without switching focus\n const facrLink = selected.match.facr_link || selected.match.report_url;\n if (facrLink) {\n const link = document.createElement('a');\n link.href = facrLink;\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n }}\n >\n Detail na FAČR\n </Button>\n )}\n <Button onClick={onClose}>Zavřít</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </Container>\n \n {/* Newsletter CTA */}\n <NewsletterCTA />\n\n {/* Club Modal for team statistics */}\n <ClubModal\n isOpen={isClubModalOpen}\n onClose={() => setIsClubModalOpen(false)}\n club={selectedClub}\n clubType={clubType}\n />\n </MainLayout>\n );\n};\n\nexport default CalendarPage;\n","import { useState, useEffect, useMemo } from 'react';\n\n/**\n * Custom hook for countdown functionality\n * @param targetDate - The target date/time for the countdown\n * @param updateInterval - How often to update (in milliseconds), defaults to 1000ms\n * @returns Object with countdown string and time remaining in milliseconds\n */\nexport const useCountdown = (targetDate: Date | string | null, updateInterval: number = 1000) => {\n const [timeRemaining, setTimeRemaining] = useState<number>(0);\n const [isActive, setIsActive] = useState<boolean>(false);\n\n const targetTime = useMemo(() => {\n if (!targetDate) return null;\n const date = typeof targetDate === 'string' ? new Date(targetDate) : targetDate;\n return isNaN(date.getTime()) ? null : date.getTime();\n }, [targetDate]);\n\n useEffect(() => {\n if (!targetTime) {\n setTimeRemaining(0);\n setIsActive(false);\n return;\n }\n\n const updateCountdown = () => {\n const now = Date.now();\n const remaining = targetTime - now;\n\n if (remaining <= 0) {\n setTimeRemaining(0);\n setIsActive(false);\n return;\n }\n\n setTimeRemaining(remaining);\n setIsActive(true);\n };\n\n // Initial update\n updateCountdown();\n\n // Set up interval only if countdown is still active\n const interval = setInterval(() => {\n updateCountdown();\n }, updateInterval);\n\n return () => clearInterval(interval);\n }, [targetTime, updateInterval]);\n\n const countdownString = useMemo(() => {\n if (timeRemaining <= 0) return '';\n\n const days = Math.floor(timeRemaining / (24 * 60 * 60 * 1000));\n const hours = Math.floor((timeRemaining % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000));\n const minutes = Math.floor((timeRemaining % (60 * 60 * 1000)) / (60 * 1000));\n const seconds = Math.floor((timeRemaining % (60 * 1000)) / 1000);\n\n if (days > 0) {\n return `${days}d ${hours}h`;\n } else if (hours > 0) {\n return `${hours}h ${minutes}m`;\n } else if (minutes > 0) {\n return `${minutes}m ${seconds}s`;\n } else {\n return `${seconds}s`;\n }\n }, [timeRemaining]);\n\n return {\n countdownString,\n timeRemaining,\n isActive,\n targetTime\n };\n};\n\n/**\n * Optimized hook for multiple countdowns\n * @param matches - Array of match objects with date and time\n * @param updateInterval - How often to update all countdowns (in milliseconds)\n * @returns Object with countdown strings for each match ID\n */\nexport const useMultipleCountdowns = (matches: Array<{ id: string | number; date: string; time: string }>, updateInterval: number = 10000) => {\n const [countdowns, setCountdowns] = useState<Record<string, string>>({});\n\n useEffect(() => {\n if (!matches.length) {\n setCountdowns({});\n return;\n }\n\n const updateAllCountdowns = () => {\n const now = Date.now();\n const newCountdowns: Record<string, string> = {};\n\n matches.forEach((match) => {\n const targetTime = new Date(`${match.date}T${match.time || '00:00'}:00`).getTime();\n\n if (isNaN(targetTime) || targetTime <= now) {\n return; // Skip past matches or invalid dates\n }\n\n const diff = targetTime - now;\n const days = Math.floor(diff / (24 * 60 * 60 * 1000));\n const hours = Math.floor((diff % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000));\n const minutes = Math.floor((diff % (60 * 60 * 1000)) / (60 * 1000));\n\n if (days > 0) {\n newCountdowns[String(match.id)] = `${days}d ${hours}h`;\n } else if (hours > 0) {\n newCountdowns[String(match.id)] = `${hours}h ${minutes}m`;\n } else {\n newCountdowns[String(match.id)] = `${minutes}m`;\n }\n });\n\n setCountdowns(newCountdowns);\n };\n\n // Initial update\n updateAllCountdowns();\n\n // Set up interval\n const interval = setInterval(updateAllCountdowns, updateInterval);\n\n return () => clearInterval(interval);\n }, [matches, updateInterval]);\n\n return countdowns;\n};\n","import { useTranslation } from 'react-i18next';\nimport { Button, Menu, MenuButton, MenuList, MenuItem, HStack, Text, Icon } from '@chakra-ui/react';\nimport { FaGlobe, FaChevronDown } from 'react-icons/fa';\nimport { useState, useEffect } from 'react';\nimport { api } from '../../services/api';\n\ninterface Language {\n id: string;\n name: string;\n native_name: string;\n code: string;\n is_default: boolean;\n is_active: boolean;\n sort_order: number;\n}\n\nexport const LanguageSwitcher = () => {\n const { i18n } = useTranslation();\n const [languages, setLanguages] = useState<Language[]>([]);\n const [currentLanguage, setCurrentLanguage] = useState<string>('cs');\n const [loading, setLoading] = useState(true);\n\n // Fetch available languages from API\n useEffect(() => {\n const fetchLanguages = async () => {\n try {\n const response = await api.get('/i18n/languages');\n const activeLanguages = response.data.languages.filter((lang: Language) => lang.is_active);\n \n if (activeLanguages.length > 0) {\n setLanguages(activeLanguages);\n } else {\n // Fallback to default languages if API returns empty\n setLanguages([\n { id: 'cs', name: 'Czech', native_name: 'Čeština', code: 'cs', is_default: true, is_active: true, sort_order: 1 },\n { id: 'en', name: 'English', native_name: 'English', code: 'en', is_default: false, is_active: true, sort_order: 2 },\n ]);\n }\n \n // Set current language from i18n or default to Czech\n const current = i18n.language || 'cs';\n setCurrentLanguage(current);\n } catch (error) {\n // Fallback to default languages on error\n setLanguages([\n { id: 'cs', name: 'Czech', native_name: 'Čeština', code: 'cs', is_default: true, is_active: true, sort_order: 1 },\n { id: 'en', name: 'English', native_name: 'English', code: 'en', is_default: false, is_active: true, sort_order: 2 },\n ]);\n const current = i18n.language || 'cs';\n setCurrentLanguage(current);\n } finally {\n setLoading(false);\n }\n };\n\n fetchLanguages();\n }, [i18n.language]);\n\n // Change language\n const changeLanguage = async (languageCode: string) => {\n try {\n // Change language in i18next\n await i18n.changeLanguage(languageCode);\n \n // Save preference to backend if user is authenticated\n const token = localStorage.getItem('token');\n if (token) {\n try {\n await api.post('/i18n/user-language', { language_code: languageCode });\n } catch (error) {\n console.warn('Failed to save language preference to backend:', error);\n }\n }\n \n // Save to cookie\n document.cookie = `lang=${languageCode}; max-age=${365 * 24 * 60 * 60}; path=/`;\n \n setCurrentLanguage(languageCode);\n \n // Refresh page to update navigation and all content\n window.location.reload();\n } catch (error) {\n console.error('Failed to change language:', error);\n }\n };\n\n // Get current language display name\n const getCurrentLanguageDisplay = () => {\n const lang = languages.find(l => l.code === currentLanguage);\n return lang ? lang.native_name : 'Čeština';\n };\n\n if (loading || languages.length < 2) {\n return null; // Don't show if less than 2 languages or still loading\n }\n\n return (\n <Menu>\n <MenuButton\n as={Button}\n variant=\"ghost\"\n size=\"sm\"\n minWidth=\"auto\"\n px={2}\n py={1}\n borderRadius=\"md\"\n _hover={{ bg: \"gray.100\" }}\n _active={{ bg: \"gray.200\" }}\n fontSize=\"sm\"\n fontWeight=\"medium\"\n >\n <HStack spacing={1}>\n <Icon as={FaGlobe} fontSize=\"sm\" />\n <Text fontSize=\"sm\" fontWeight=\"medium\" textTransform=\"uppercase\">\n {currentLanguage === 'cs' ? 'CZ' : 'EN'}\n </Text>\n <Icon as={FaChevronDown} fontSize=\"xs\" />\n </HStack>\n </MenuButton>\n <MenuList minWidth=\"100px\" p={1} boxShadow=\"lg\" border=\"1px\" borderColor=\"gray.200\">\n {languages\n .sort((a, b) => a.sort_order - b.sort_order)\n .map((language) => (\n <MenuItem\n key={language.code}\n onClick={() => changeLanguage(language.code)}\n isDisabled={language.code === currentLanguage}\n fontSize=\"sm\"\n borderRadius=\"md\"\n px={2}\n py={1}\n _hover={{ bg: \"gray.100\" }}\n _selected={{ bg: \"blue.50\", color: \"blue.600\" }}\n >\n <HStack spacing={1} width=\"100%\" justifyContent=\"space-between\">\n <Text fontSize=\"sm\" fontWeight=\"medium\" textTransform=\"uppercase\">\n {language.code === 'cs' ? 'CZ' : 'EN'}\n </Text>\n {language.code === currentLanguage && (\n <Text fontSize=\"sm\" color=\"blue.500\" fontWeight=\"bold\">\n ✓\n </Text>\n )}\n </HStack>\n </MenuItem>\n ))}\n </MenuList>\n </Menu>\n );\n};\n","import React from 'react';\nimport {\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalCloseButton,\n ModalBody,\n ModalFooter,\n Button,\n VStack,\n HStack,\n Text,\n Badge,\n Icon,\n useColorModeValue,\n Spinner,\n} from '@chakra-ui/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { getAchievements } from '../../services/engagement';\nimport { CheckCircle, Circle } from 'lucide-react';\n\nexport type AchievementsModalProps = {\n isOpen: boolean;\n onClose: () => void;\n onOpenRewards?: () => void;\n};\n\nconst AchievementsModal: React.FC<AchievementsModalProps> = ({ isOpen, onClose, onOpenRewards }) => {\n const cardBg = useColorModeValue('gray.50', 'gray.800');\n const q = useQuery({\n queryKey: ['engagement', 'achievements'],\n queryFn: getAchievements,\n enabled: isOpen,\n staleTime: 10000,\n });\n\n const items = q.data?.achievements || [];\n const counters = q.data?.counters || {} as any;\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} size=\"lg\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Úspěchy</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n {q.isLoading ? (\n <HStack><Spinner size=\"sm\" /><Text>Načítám…</Text></HStack>\n ) : (\n <VStack align=\"stretch\" spacing={3}>\n <HStack spacing={3} bg={cardBg} p={3} borderRadius=\"md\">\n <Badge colorScheme=\"blue\">Komentáře: {counters?.comments ?? 0}</Badge>\n <Badge colorScheme=\"green\">Hlasování: {counters?.votes ?? 0}</Badge>\n <Badge colorScheme={counters?.newsletter ? 'purple' : 'gray'}>Newsletter: {counters?.newsletter ? 'ANO' : 'NE'}</Badge>\n </HStack>\n {items.map((a: any) => (\n <HStack key={a.id} spacing={3} p={2} borderWidth=\"1px\" borderRadius=\"md\">\n <Icon as={a.achieved ? CheckCircle : Circle} color={a.achieved ? 'green.400' : 'gray.400'} />\n <VStack align=\"start\" spacing={0} flex={1}>\n <Text fontWeight=\"600\">{a.title}</Text>\n <Text fontSize=\"sm\" color=\"gray.500\">{a.description}</Text>\n </VStack>\n <Badge>{a.points} bodů</Badge>\n </HStack>\n ))}\n </VStack>\n )}\n </ModalBody>\n <ModalFooter>\n {onOpenRewards && (\n <Button mr={3} onClick={() => { onClose(); onOpenRewards(); }} colorScheme=\"blue\">Odměny</Button>\n )}\n <Button variant=\"ghost\" onClick={onClose}>Zavřít</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n );\n};\n\nexport default AchievementsModal;\n","import React from 'react';\nimport {\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalCloseButton,\n ModalBody,\n ModalFooter,\n Button,\n VStack,\n HStack,\n Text,\n Image,\n Badge,\n useColorModeValue,\n Spinner,\n useToast,\n} from '@chakra-ui/react';\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { getRewards, redeemReward, RewardItem } from '../../services/engagement';\n\nexport type RewardsModalProps = {\n isOpen: boolean;\n onClose: () => void;\n availablePoints?: number;\n onRedeemed?: () => void;\n};\n\nconst RewardsModal: React.FC<RewardsModalProps> = ({ isOpen, onClose, availablePoints = 0, onRedeemed }) => {\n const cardBg = useColorModeValue('gray.50', 'gray.800');\n const toast = useToast();\n const qc = useQueryClient();\n const q = useQuery({\n queryKey: ['engagement', 'rewards'],\n queryFn: getRewards,\n enabled: isOpen,\n staleTime: 10000,\n });\n\n const redeemMut = useMutation({\n mutationFn: (id: number) => redeemReward(id),\n onSuccess: async (res) => {\n toast({ title: res.status === 'approved' ? 'Odměna aktivována' : 'Žádost o odměnu odeslána', status: 'success', duration: 3000 });\n await qc.invalidateQueries({ queryKey: ['engagement', 'profile'] });\n if (onRedeemed) onRedeemed();\n },\n onError: (e: any) => {\n const msg = e?.response?.data?.error || 'Nepodařilo se uplatnit odměnu';\n toast({ title: 'Chyba', description: msg, status: 'error', duration: 3500 });\n }\n });\n\n const items = (q.data || []) as RewardItem[];\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} size=\"lg\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Odměny</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n {q.isLoading ? (\n <HStack><Spinner size=\"sm\" /><Text>Načítám…</Text></HStack>\n ) : (\n <VStack align=\"stretch\" spacing={3}>\n <HStack spacing={3} bg={cardBg} p={3} borderRadius=\"md\">\n <Badge colorScheme=\"blue\">Dostupné body: {availablePoints}</Badge>\n </HStack>\n {items.map((it) => (\n <HStack key={it.id} spacing={3} p={2} borderWidth=\"1px\" borderRadius=\"md\" align=\"center\">\n {it.image_url && (\n <Image src={it.image_url} alt={it.name} boxSize=\"48px\" objectFit=\"cover\" borderRadius=\"md\" />\n )}\n <VStack align=\"start\" spacing={0} flex={1}>\n <Text fontWeight=\"600\">{it.name}</Text>\n <></>\n </VStack>\n <Badge>{it.cost_points} bodů</Badge>\n <Button\n size=\"sm\"\n colorScheme=\"blue\"\n onClick={() => redeemMut.mutate(it.id)}\n isLoading={redeemMut.isPending}\n isDisabled={availablePoints < (it.cost_points || 0)}\n >\n Uplatnit\n </Button>\n </HStack>\n ))}\n {items.length === 0 && (\n <Text color=\"gray.500\">Zatím nejsou k dispozici žádné odměny.</Text>\n )}\n </VStack>\n )}\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" onClick={onClose}>Zavřít</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n );\n};\n\nexport default RewardsModal;\n","import { useEffect, useState } from 'react';\nimport { getCategories, Category } from '../services/public';\nimport { getNavigationItems, NavigationItem } from '../services/navigation';\nimport { getEvents } from '../services/eventService';\nimport { getPlayers } from '../services/public';\nimport { getArticles } from '../services/articles';\nimport { getCachedYouTube } from '../services/youtube';\nimport { getZoneramaManifestWithFallbacks } from '../services/zonerama';\nimport { API_URL } from '../services/api';\n\nexport interface NavbarData {\n categories: Category[] | null;\n dynamicNavItems: NavigationItem[];\n navLoading: boolean;\n hasTables: boolean;\n hasActivities: boolean;\n hasPlayers: boolean;\n hasArticles: boolean;\n hasVideos: boolean;\n hasGallery: boolean;\n}\n\nexport const useNavbarData = (isAdmin: boolean, settings?: any): NavbarData => {\n const [categories, setCategories] = useState<Category[] | null>(null);\n const [dynamicNavItems, setDynamicNavItems] = useState<NavigationItem[]>([]);\n const [navLoading, setNavLoading] = useState(true);\n const [hasTables, setHasTables] = useState<boolean>(false);\n const [hasActivities, setHasActivities] = useState<boolean>(false);\n const [hasPlayers, setHasPlayers] = useState<boolean>(false);\n const [hasArticles, setHasArticles] = useState<boolean>(false);\n const [hasVideos, setHasVideos] = useState<boolean>(false);\n const [hasGallery, setHasGallery] = useState<boolean>(false);\n\n // Combined data loading effect\n useEffect(() => {\n let active = true;\n \n const loadAllData = async () => {\n try {\n // Load navigation and categories in parallel\n const [navItems, cats] = await Promise.all([\n getNavigationItems().catch(() => []),\n getCategories().catch(() => [])\n ]);\n\n if (active) {\n // Process navigation\n const publicItems = Array.isArray(navItems) \n ? navItems.filter(item => !item.requires_admin)\n : [];\n\n // Auto-seed if navigation is empty (only if user is authenticated as admin)\n if (publicItems.length === 0 && isAdmin) {\n try {\n console.log('Navigation empty, auto-seeding...');\n // Note: seedDefaultNavigation() would need to be imported\n // For now, continue with empty navigation\n } catch (seedError) {\n console.error('Auto-seed failed:', seedError);\n }\n }\n \n setDynamicNavItems(publicItems);\n\n // Process categories\n if (Array.isArray(cats) && cats.length > 0) {\n setCategories(cats);\n } else if (Array.isArray(settings?.categories)) {\n setCategories(settings.categories as any);\n } else {\n setCategories(null);\n }\n }\n } catch (error) {\n console.error('Failed to load navigation/categories:', error);\n if (active) {\n setDynamicNavItems([]);\n setCategories(Array.isArray(settings?.categories) ? settings.categories as any : null);\n }\n } finally {\n if (active) setNavLoading(false);\n }\n };\n\n loadAllData();\n return () => { active = false };\n }, [isAdmin, settings?.categories]);\n\n // Load content availability data in parallel\n useEffect(() => {\n let disposed = false;\n \n const resolveBackendUrl = (path: string) => {\n try {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (path.startsWith('/cache') || path.startsWith('/uploads') || path.startsWith('/api/')) {\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n return new URL(path, origin).toString();\n }\n return path;\n } catch { return path; }\n };\n\n const loadContentData = async () => {\n try {\n // Load all content availability checks in parallel\n const [\n tablesResponse,\n events,\n players,\n articlesResponse,\n youtube,\n manifest\n ] = await Promise.allSettled([\n fetch(resolveBackendUrl('/cache/prefetch/facr_tables.json'), { cache: 'no-cache' }),\n getEvents().catch(() => []),\n getPlayers().catch(() => []),\n getArticles({ page: 1, page_size: 1, published: true }).catch(() => ({ total: 0 })),\n getCachedYouTube().catch(() => null),\n getZoneramaManifestWithFallbacks().catch(() => [])\n ]);\n\n if (!disposed) {\n // Process tables\n if (tablesResponse.status === 'fulfilled') {\n const res = tablesResponse.value;\n if (res.ok) {\n const json = await res.json();\n const anyRows = Array.isArray(json?.competitions) && \n json.competitions.some((c: any) => Array.isArray(c?.table?.overall) && c.table.overall.length > 0);\n setHasTables(!!anyRows);\n } else {\n setHasTables(false);\n }\n } else {\n setHasTables(false);\n }\n\n // Process other content with proper type guards\n setHasActivities(events.status === 'fulfilled' && Array.isArray(events.value) && events.value.length > 0);\n setHasPlayers(players.status === 'fulfilled' && Array.isArray(players.value) && players.value.length > 0);\n setHasArticles(articlesResponse.status === 'fulfilled' && typeof articlesResponse.value === 'object' && articlesResponse.value !== null && 'total' in articlesResponse.value && (articlesResponse.value as any).total > 0);\n setHasVideos(youtube.status === 'fulfilled' && youtube.value !== null && typeof youtube.value === 'object' && 'videos' in youtube.value && Array.isArray((youtube.value as any).videos) && (youtube.value as any).videos.length > 0);\n setHasGallery(manifest.status === 'fulfilled' && Array.isArray(manifest.value) && manifest.value.length > 0);\n }\n } catch (error) {\n console.error('Failed to load content data:', error);\n if (!disposed) {\n setHasTables(false);\n setHasActivities(false);\n setHasPlayers(false);\n setHasArticles(false);\n setHasVideos(false);\n setHasGallery(false);\n }\n }\n };\n\n loadContentData();\n return () => { disposed = true; };\n }, []);\n\n return {\n categories,\n dynamicNavItems,\n navLoading,\n hasTables,\n hasActivities,\n hasPlayers,\n hasArticles,\n hasVideos,\n hasGallery,\n };\n};\n","import React, { useEffect, useState, useMemo, useRef } from 'react';\nimport {\n Box,\n Flex,\n Button,\n useColorModeValue,\n IconButton,\n Avatar,\n Menu,\n MenuButton,\n MenuList,\n MenuItem,\n Text,\n HStack,\n Tooltip,\n useDisclosure,\n Drawer,\n DrawerBody,\n DrawerHeader,\n DrawerOverlay,\n DrawerContent,\n DrawerCloseButton,\n VStack,\n Divider,\n Container,\n Progress,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalBody,\n ModalCloseButton,\n InputGroup,\n InputLeftElement,\n Input,\n useToast,\n} from '@chakra-ui/react';\nimport { HamburgerIcon, EditIcon, ChevronDownIcon } from '@chakra-ui/icons';\nimport { FaFacebook, FaInstagram, FaYoutube, FaPhotoVideo, FaExternalLinkAlt, FaShoppingBag, FaCamera, FaSearch } from 'react-icons/fa';\nimport { Link as RouterLink, useLocation, useNavigate } from 'react-router-dom';\nimport { useAuth } from '../contexts/AuthContext';\nimport { usePublicSettings } from '../hooks/usePublicSettings';\nimport { useClubTheme } from '../contexts/ClubThemeContext';\nimport { Image } from '@chakra-ui/react';\nimport { getCategories, Category } from '../services/public';\nimport { FaSearch as FaSearchIcon } from 'react-icons/fa';\nimport { getNavigationItems, NavigationItem, seedDefaultNavigation } from '../services/navigation';\nimport { getEvents } from '../services/eventService';\nimport { getPlayers } from '../services/public';\nimport { getArticles } from '../services/articles';\nimport { LanguageSwitcher } from './common/LanguageSwitcher';\nimport { getCachedYouTube } from '../services/youtube';\nimport { getZoneramaManifestWithFallbacks } from '../services/zonerama';\nimport { getMyNewsletterToken } from '../services/public/newsletter';\nimport { API_URL } from '../services/api';\nimport { assetUrl } from '../utils/url';\nimport { getProfile as getEngagementProfile, EngagementProfile } from '../services/engagement';\nimport AchievementsModal from './engagement/AchievementsModal';\nimport RewardsModal from './engagement/RewardsModal';\nimport { ThemeToggle } from '@/components/ui/theme-toggle';\nimport { useTranslation } from 'react-i18next';\nimport { useNavbarData } from '../hooks/useNavbarData';\n\ntype NavLink = { label: string; to?: string; items?: { label: string; to: string }[]; external?: boolean };\n\n// Minimal normalization for social URLs so admins can input @handle or domain-less usernames\nconst normalizeSocialUrl = (network: 'facebook' | 'instagram' | 'youtube', raw?: string | null): string | null => {\n let v = String(raw || '').trim();\n if (!v) return null;\n v = v.replace(/\\s+/g, '');\n if (v.startsWith('@')) {\n const handle = v.slice(1);\n if (network === 'facebook') return `https://www.facebook.com/${handle}`;\n if (network === 'instagram') return `https://www.instagram.com/${handle}`;\n if (network === 'youtube') return `https://www.youtube.com/@${handle}`;\n }\n if (!/^https?:\\/\\//i.test(v) && !v.includes('/') && !v.includes('.')) {\n if (network === 'facebook') return `https://www.facebook.com/${v}`;\n if (network === 'instagram') return `https://www.instagram.com/${v}`;\n if (network === 'youtube') return `https://www.youtube.com/@${v}`;\n }\n if (!/^https?:\\/\\//i.test(v)) {\n if (/^facebook\\.com\\//i.test(v)) return `https://www.${v}`;\n if (/^instagram\\.com\\//i.test(v)) return `https://www.${v}`;\n if (/^youtube\\.com\\//i.test(v)) return `https://www.${v}`;\n }\n return v;\n};\n\n// Mobile menu component\nconst MobileMenu = ({ isOpen, onClose, isAdmin, isAuthenticated, menuBg, dividerColor, settings, categories, galleryHref, galleryLabel, hasTables, hasActivities, hasPlayers, hasArticles, hasVideos, hasGallery, dynamicNavItems, navLoading, t, i18n, handleSimpleLanguageChange }: { \n isOpen: boolean; \n onClose: () => void;\n isAdmin: boolean;\n isAuthenticated: boolean;\n menuBg: string;\n dividerColor: string;\n settings?: any;\n categories?: Category[] | null;\n galleryHref?: string | null;\n galleryLabel?: string;\n hasTables?: boolean;\n hasActivities?: boolean;\n hasPlayers?: boolean;\n hasArticles?: boolean;\n hasVideos?: boolean;\n hasGallery?: boolean;\n dynamicNavItems?: NavigationItem[];\n navLoading?: boolean;\n t: (key: string) => string;\n i18n: any;\n handleSimpleLanguageChange: (lang: string) => void;\n}) => (\n <Drawer isOpen={isOpen} placement=\"left\" onClose={onClose}>\n <DrawerOverlay />\n <DrawerContent bg={menuBg}>\n <DrawerCloseButton />\n <DrawerHeader borderBottomWidth=\"1px\" borderColor=\"border.subtle\">{t('action.open_menu')}</DrawerHeader>\n <DrawerBody>\n <VStack align=\"stretch\" spacing={2}>\n {/* Dynamic navigation items in mobile */}\n {(!navLoading && dynamicNavItems && dynamicNavItems.length > 0) ? (\n dynamicNavItems.map((item, idx) => {\n const linkIsExternal = item.type === 'external';\n const hasChildren = item.type === 'dropdown' && item.children && item.children.length > 0;\n const linkProps = linkIsExternal ? { href: item.url } : { to: item.url || '/' };\n const Comp: any = linkIsExternal ? 'a' : RouterLink;\n // Special handling for Blog/Články: when categories exist, make parent non-clickable and list categories\n const isArticlesLink = (item.label === 'Články' || item.label === 'Blog' || ((item.url || '') as string).startsWith('/blog'));\n const hasCats = Array.isArray(categories) && categories.length > 0;\n\n if (isArticlesLink && hasCats) {\n return (\n <React.Fragment key={item.id || idx}>\n <Button\n as={RouterLink}\n to=\"/blog\"\n onClick={onClose}\n variant=\"ghost\"\n justifyContent=\"flex-start\"\n fontWeight=\"bold\"\n >\n {item.label}\n </Button>\n <VStack align=\"stretch\" pl={4} spacing={1}>\n {categories.map((cat: any, catIdx: number) => {\n const catIsExternal = typeof cat.url === 'string' && /^https?:\\/\\//i.test(cat.url);\n const catHref = cat.url || (cat.id ? `/blog?category_id=${cat.id}` : (cat.slug ? `/blog?category=${encodeURIComponent(cat.slug)}` : '/blog'));\n const catLinkProps = catIsExternal ? { href: catHref } : { to: catHref };\n const CatComp: any = catIsExternal ? 'a' : RouterLink;\n return (\n <Button key={cat.slug || cat.id || cat.name} as={CatComp} {...(catLinkProps as any)} onClick={onClose} variant=\"ghost\" justifyContent=\"flex-start\" fontWeight=\"normal\" size=\"sm\">\n {cat.name}\n </Button>\n );\n })}\n </VStack>\n </React.Fragment>\n );\n }\n\n return (\n <React.Fragment key={item.id || idx}>\n <Button\n as={Comp}\n {...linkProps}\n target={linkIsExternal ? '_blank' : undefined}\n rel={linkIsExternal ? 'noreferrer' : undefined}\n variant=\"ghost\"\n justifyContent=\"flex-start\"\n fontWeight={hasChildren ? 'bold' : 'normal'}\n >\n {item.label}\n </Button>\n {/* Render children for dropdown items */}\n {hasChildren && (\n <VStack align=\"stretch\" pl={4} spacing={1}>\n {item.children!.map((child) => {\n const childIsExternal = child.type === 'external';\n const childLinkProps = childIsExternal ? { href: child.url } : { to: child.url || '/' };\n const ChildComp: any = childIsExternal ? 'a' : RouterLink;\n return (\n <Button \n key={child.id} \n as={ChildComp} \n {...(childLinkProps as any)} \n variant=\"ghost\" \n justifyContent=\"flex-start\" \n fontWeight=\"normal\" \n size=\"sm\"\n >\n {child.label}\n </Button>\n );\n })}\n </VStack>\n )}\n </React.Fragment>\n );\n })\n ) : (\n // Fallback to hardcoded navigation\n <>\n <Button as={RouterLink} to=\"/\" variant=\"ghost\" justifyContent=\"flex-start\">{t('nav.home')}</Button>\n {(settings?.show_about_in_nav ?? true) && (\n <Button as={RouterLink} to=\"/o-klubu\" variant=\"ghost\" justifyContent=\"flex-start\">{t('nav.club')}</Button>\n )}\n <Button as={RouterLink} to=\"/kalendar\" variant=\"ghost\" justifyContent=\"flex-start\">{t('nav.calendar')}</Button>\n <Button as={RouterLink} to=\"/zapasy\" variant=\"ghost\" justifyContent=\"flex-start\">{t('nav.matches')}</Button>\n {hasActivities && (\n <Button as={RouterLink} to=\"/aktivity\" variant=\"ghost\" justifyContent=\"flex-start\">{t('nav.activities')}</Button>\n )}\n {hasPlayers && (\n <Button as={RouterLink} to=\"/hraci\" variant=\"ghost\" justifyContent=\"flex-start\">{t('nav.players')}</Button>\n )}\n {hasTables && (\n <Button as={RouterLink} to=\"/tabulky\" variant=\"ghost\" justifyContent=\"flex-start\">{t('nav.tables')}</Button>\n )}\n {Array.isArray(settings?.custom_nav) && settings.custom_nav.length > 0 && settings.custom_nav.map((item: any, idx: number) => {\n const customLinkIsExternal = typeof item?.url === 'string' && /^https?:\\/\\//i.test(item.url);\n const linkProps = customLinkIsExternal ? { href: item.url } : { to: item.url || '/' };\n const Comp: any = customLinkIsExternal ? 'a' : RouterLink;\n return (\n <Button\n key={`custom-nav-${idx}-${item?.label || 'link'}`}\n as={Comp}\n {...linkProps}\n target={customLinkIsExternal ? '_blank' : undefined}\n rel={customLinkIsExternal ? 'noreferrer' : undefined}\n variant=\"ghost\"\n justifyContent=\"flex-start\"\n >\n {item?.label || t('common.page')}\n </Button>\n );\n })}\n {hasArticles && (\n <>\n {Array.isArray(categories) && categories.length > 0 ? (\n <>\n <Button as={RouterLink} to=\"/blog\" onClick={onClose} variant=\"ghost\" justifyContent=\"flex-start\" fontWeight=\"bold\">\n {t('nav.articles')}\n </Button>\n <VStack align=\"stretch\" pl={4} spacing={1}>\n {categories.map((cat: any, catIdx: number) => {\n const catIsExternal = typeof cat.url === 'string' && /^https?:\\/\\//i.test(cat.url);\n const catHref = cat.url || (cat.id ? `/blog?category_id=${cat.id}` : (cat.slug ? `/blog?category=${encodeURIComponent(cat.slug)}` : '/blog'));\n const catLinkProps = catIsExternal ? { href: catHref } : { to: catHref };\n return (\n <Button key={cat.slug || cat.id || cat.name} as={catIsExternal ? 'a' : RouterLink} {...(catLinkProps as any)} onClick={onClose} variant=\"ghost\" justifyContent=\"flex-start\" fontWeight=\"normal\" size=\"sm\">\n {cat.name}\n </Button>\n );\n })}\n </VStack>\n </>\n ) : (\n <Button as={RouterLink} to=\"/blog\" onClick={onClose} variant=\"ghost\" justifyContent=\"flex-start\" fontWeight=\"bold\">\n {t('nav.articles')}\n </Button>\n )}\n </>\n )}\n {hasVideos && (\n <Button as={RouterLink} to=\"/videa\" variant=\"ghost\" justifyContent=\"flex-start\">{t('nav.videos')}</Button>\n )}\n <Button as={RouterLink} to=\"/hledat\" variant=\"ghost\" justifyContent=\"flex-start\">{t('action.search')}</Button>\n {hasGallery && (\n <Button as={RouterLink} to=\"/galerie\" variant=\"ghost\" justifyContent=\"flex-start\">{galleryLabel || t('homepage.gallery')}</Button>\n )}\n {settings?.shop_url && (\n <Button as=\"a\" href={settings.shop_url} target=\"_blank\" rel=\"noreferrer\" variant=\"ghost\" justifyContent=\"flex-start\">{t('nav.shop')}</Button>\n )}\n <Button as={RouterLink} to=\"/sponzori\" variant=\"ghost\" justifyContent=\"flex-start\">{t('nav.sponsors')}</Button>\n <Button as={RouterLink} to=\"/kontakt\" variant=\"ghost\" justifyContent=\"flex-start\">{t('nav.contact')}</Button>\n </>\n )}\n \n {isAdmin && (\n <>\n <Divider my={2} borderColor={dividerColor} />\n <Text fontWeight=\"bold\" mt={2} color={dividerColor}>{t('nav.admin')}</Text>\n <Button as={RouterLink} to=\"/admin\" variant=\"ghost\" justifyContent=\"flex-start\" colorScheme=\"blue\">\n {t('nav.admin')}\n </Button>\n </>\n )}\n\n {!isAuthenticated && (\n <>\n <Divider my={2} borderColor={dividerColor} />\n <Button as={RouterLink} to=\"/login\" colorScheme=\"blue\" justifyContent=\"flex-start\">\n {t('action.login')}\n </Button>\n <Button as={RouterLink} to=\"/register\" variant=\"outline\" justifyContent=\"flex-start\">\n {t('common.register')}\n </Button>\n </>\n )}\n \n {/* Language switcher for mobile */}\n <LanguageSwitcher />\n </VStack>\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n);\n\nconst Navbar: React.FC<{ fullWidth?: boolean; variant?: string }> = ({ fullWidth = false, variant = 'unified' }) => {\n const { t, i18n } = useTranslation();\n const { isAuthenticated, logout, user } = useAuth();\n const { isOpen, onOpen, onClose } = useDisclosure();\n const { isOpen: isSearchOpen, onOpen: onSearchOpen, onClose: onSearchClose } = useDisclosure();\n const isAdmin = user?.role === 'admin';\n const accountPath = isAdmin ? '/admin/nastaveni' : '/semiadmin';\n const { data: settings } = usePublicSettings();\n const theme = useClubTheme();\n const location = useLocation();\n const navigate = useNavigate();\n const toast = useToast();\n const menuBg = useColorModeValue('white', '#0f1115');\n const dividerColor = useColorModeValue('gray.600', 'gray.300');\n const hoverBg = useColorModeValue('blackAlpha.100', 'whiteAlpha.200');\n const activeBg = useColorModeValue('blackAlpha.50', 'whiteAlpha.100');\n const activeTextColor = useColorModeValue('brand.primary', 'brand.accent');\n const navTextColor = useColorModeValue('gray.700', 'gray.200');\n const topBarBg = useColorModeValue('gray.50', 'blackAlpha.500');\n const [scrolled, setScrolled] = useState(false);\n const containerMaxW = fullWidth ? 'full' as const : '7xl' as const;\n const [windowWidth, setWindowWidth] = useState<number>(typeof window !== 'undefined' ? window.innerWidth : 1920);\n const [engProfile, setEngProfile] = useState<EngagementProfile | null>(null);\n const { isOpen: isAchOpen, onOpen: onAchOpen, onClose: onAchClose } = useDisclosure();\n const { isOpen: isRewOpen, onOpen: onRewOpen, onClose: onRewClose } = useDisclosure();\n\n // Use the combined navbar data hook\n const navbarData = useNavbarData(isAdmin, settings);\n\n useEffect(() => {\n const onResize = () => setWindowWidth(window.innerWidth);\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n\n // Load engagement profile for avatar\n useEffect(() => {\n let mounted = true;\n (async () => {\n try {\n if (!isAuthenticated) { setEngProfile(null); return; }\n const p = await getEngagementProfile();\n if (mounted) setEngProfile(p);\n } catch {\n if (mounted) setEngProfile(null);\n }\n })();\n return () => { mounted = false; };\n }, [isAuthenticated]);\n\n useEffect(() => {\n if (!isAuthenticated) return;\n let disposed = false;\n const handler = async () => {\n try {\n const p = await getEngagementProfile();\n if (!disposed) setEngProfile(p);\n } catch {}\n };\n window.addEventListener('engagement:refresh', handler as any);\n return () => { disposed = true; window.removeEventListener('engagement:refresh', handler as any); };\n }, [isAuthenticated]);\n\n // Search modal state\n const [query, setQuery] = useState('');\n const submitSearch = () => {\n const text = query.trim();\n if (!text) return;\n onSearchClose();\n setQuery('');\n navigate(`/hledat?q=${encodeURIComponent(text)}`);\n };\n\n useEffect(() => {\n const onScroll = () => setScrolled(window.scrollY > 8);\n onScroll();\n window.addEventListener('scroll', onScroll, { passive: true } as any);\n return () => window.removeEventListener('scroll', onScroll as any);\n }, []);\n\n // Simple language change handler for non-logged-in users\n const handleSimpleLanguageChange = async (languageCode: string) => {\n try {\n // Change language in i18next\n await i18n.changeLanguage(languageCode);\n \n // Save to localStorage and cookie\n try {\n localStorage.setItem('language', languageCode);\n } catch (e) {\n // Ignore localStorage errors\n }\n document.cookie = `lang=${languageCode}; max-age=${365 * 24 * 60 * 60}; path=/`;\n } catch (error) {\n console.error('Failed to change language:', error);\n }\n };\n\n // Open newsletter preferences for logged-in user (fetch token and redirect)\n const openMyNewsletterPrefs = async () => {\n try {\n const { token } = await getMyNewsletterToken();\n navigate(`/newsletter/preferences?token=${encodeURIComponent(token)}`);\n } catch (err: any) {\n toast({\n title: 'Chyba',\n description: 'Nelze načíst odkaz na emailové preference. Zkuste to prosím znovu.',\n status: 'error',\n duration: 4000,\n });\n }\n };\n\n // Also set document title to club name ASAP (SEO component will refine further)\n useEffect(() => {\n const name = settings?.club_name || theme.name;\n if (name && typeof document !== 'undefined') {\n document.title = name;\n }\n }, [settings?.club_name, theme.name]);\n\n // Set favicon/logo in head for fan pages (SPA)\n useEffect(() => {\n try {\n const raw = settings?.club_logo_url || theme.logoUrl || '/dist/img/logo-club-empty.svg';\n if (!raw) return;\n const url = assetUrl(raw) || raw;\n\n const setIcon = (rel: string) => {\n let link = document.querySelector<HTMLLinkElement>(`link[rel=\"${rel}\"]`);\n if (!link) {\n link = document.createElement('link');\n link.rel = rel as any;\n document.head.appendChild(link);\n }\n link.href = url;\n // Try to hint type if svg\n if (url.endsWith('.svg')) link.type = 'image/svg+xml';\n };\n setIcon('icon');\n setIcon('shortcut icon');\n } catch {}\n }, [settings?.club_logo_url, theme.logoUrl]);\n\n // gallery link (generic first, fallback to zonerama)\n const galleryHref = settings?.gallery_url || settings?.zonerama_url;\n const galleryLabel = settings?.gallery_label || t('homepage.gallery');\n\n const isPathActive = (to?: string) => {\n if (!to) return false;\n // Active when current pathname starts with target (handles subroutes)\n return location.pathname === to || location.pathname.startsWith(to + '/');\n };\n\n // Convert NavigationItem to NavLink format\n const convertToNavLink = (item: NavigationItem): NavLink => {\n // Map known Czech labels to translation keys\n const getTranslatedLabel = (label: string) => {\n const labelMap: Record<string, string> = {\n 'Domů': 'nav.home',\n 'Aktuality': 'nav.news',\n 'Zápasy': 'nav.matches',\n 'Hráči': 'nav.players',\n 'Fotogalerie': 'nav.gallery',\n 'Videa': 'nav.videos',\n 'Kontakt': 'nav.contact',\n 'O klubu': 'nav.about',\n 'Aktivity': 'nav.activities',\n 'Sponzoři': 'nav.sponsors',\n 'Články': 'nav.news',\n 'Blog': 'nav.news',\n 'Kalendář': 'nav.calendar',\n 'Tabulky': 'nav.table'\n };\n const translationKey = labelMap[label];\n return translationKey ? t(translationKey) : label;\n };\n\n const link: NavLink = {\n label: getTranslatedLabel(item.label),\n to: item.url || '#',\n external: item.type === 'external',\n };\n \n // Add children for dropdown items\n if (item.type === 'dropdown' && item.children && item.children.length > 0) {\n link.items = item.children.map(child => ({\n label: getTranslatedLabel(child.label),\n to: child.url || '#',\n }));\n }\n \n return link;\n };\n\n // Build categories as items for Články dropdown (fallback)\n const categoryItems = useMemo(() => {\n const source = Array.isArray(navbarData.categories) && navbarData.categories.length > 0 ? navbarData.categories : [];\n return source.map((cat: any) => ({\n label: cat.name,\n to: cat.url || (cat.id ? `/blog?category_id=${cat.id}` : (cat.slug ? `/blog?category=${encodeURIComponent(cat.slug)}` : '/blog'))\n }));\n }, [navbarData.categories]);\n\n // Filter dynamic navigation items based on available data (only show when data exists)\n const filteredDynamicNavItems = useMemo(() => {\n const filterItem = (item: NavigationItem): NavigationItem | null => {\n const url = item.url || '';\n if (url.startsWith('/aktivity') && !navbarData.hasActivities) return null;\n if (url.startsWith('/hraci') && !navbarData.hasPlayers) return null;\n if (url.startsWith('/blog') && !navbarData.hasArticles) return null;\n if (url.startsWith('/videa') && !navbarData.hasVideos) return null;\n if (url.startsWith('/galerie') && !navbarData.hasGallery) return null;\n if (item.type === 'dropdown' && Array.isArray(item.children)) {\n const children = item.children.map(filterItem).filter(Boolean) as NavigationItem[];\n return { ...item, children };\n }\n return item;\n };\n return navbarData.dynamicNavItems.map(filterItem).filter(Boolean) as NavigationItem[];\n }, [navbarData.dynamicNavItems, navbarData.hasActivities, navbarData.hasPlayers, navbarData.hasArticles, navbarData.hasVideos, navbarData.hasGallery]);\n\n // Use dynamic navigation if available, otherwise fallback to hardcoded\n let NAV_LINKS: NavLink[] = useMemo(() => {\n if (!navbarData.navLoading && filteredDynamicNavItems.length > 0) {\n console.log('Navbar: Using dynamic navigation, items:', filteredDynamicNavItems.length);\n // Use dynamic navigation from API\n const navLinks = filteredDynamicNavItems.map(convertToNavLink);\n \n // Inject categories into \"Články\" or \"Blog\" navigation item if it exists\n if (categoryItems.length > 0) {\n const articlesIndex = navLinks.findIndex(link => \n link.label === 'Články' || \n link.label === 'Blog' || \n link.to === '/blog'\n );\n \n if (articlesIndex !== -1) {\n // Add or merge categories into the articles navigation item\n navLinks[articlesIndex] = {\n ...navLinks[articlesIndex],\n items: categoryItems\n };\n }\n }\n\n // Ensure we only show sections when there is data\n const filtered = navLinks.filter((link) => {\n const to = link.to || '';\n if (to.startsWith('/aktivity')) return navbarData.hasActivities;\n if (to.startsWith('/hraci')) return navbarData.hasPlayers;\n if (to.startsWith('/blog')) return navbarData.hasArticles;\n if (to.startsWith('/videa')) return navbarData.hasVideos;\n if (to.startsWith('/galerie')) return navbarData.hasGallery;\n return true;\n });\n\n return filtered;\n }\n \n console.log('Navbar: Using fallback hardcoded navigation, language:', i18n.language);\n // Fallback to hardcoded navigation - modular based on language\n const currentLanguage = i18n.language;\n let links: NavLink[] = [];\n \n // Base navigation items for all languages\n const baseLinks: NavLink[] = [\n { label: t('nav.home'), to: '/' },\n ];\n \n // Add club info if enabled\n if (settings?.show_about_in_nav !== false) {\n baseLinks.push({ label: t('nav.club'), to: '/o-klubu' });\n }\n \n // Add calendar and matches for all languages\n baseLinks.push(\n { label: t('nav.calendar'), to: '/kalendar' },\n { label: t('nav.matches'), to: '/zapasy' }\n );\n \n // Add optional items only if data exists (for all languages)\n if (navbarData.hasActivities) {\n baseLinks.push({ label: t('nav.activities'), to: '/aktivity' });\n }\n if (navbarData.hasPlayers) {\n baseLinks.push({ label: t('nav.players'), to: '/hraci' });\n }\n if (navbarData.hasTables) {\n baseLinks.push({ label: t('nav.tables'), to: '/tabulky' });\n }\n if (navbarData.hasArticles) {\n baseLinks.push(\n categoryItems.length > 0 \n ? { label: t('nav.articles'), to: '/blog', items: categoryItems } \n : { label: t('nav.articles'), to: '/blog' }\n );\n }\n if (navbarData.hasVideos) {\n baseLinks.push({ label: t('nav.videos'), to: '/videa' });\n }\n if (navbarData.hasGallery) {\n baseLinks.push({ label: galleryLabel, to: '/galerie' });\n }\n \n // Always show sponsors and contact\n baseLinks.push(\n { label: t('nav.sponsors'), to: '/sponzori' },\n { label: t('nav.contact'), to: '/kontakt' }\n );\n \n links = baseLinks;\n \n // Add shop if configured\n if (settings?.shop_url) {\n links.push({ label: t('nav.shop'), to: settings.shop_url, external: true } as NavLink);\n }\n\n // Inject custom pages from settings.custom_nav (label + url + external?)\n const customNav = Array.isArray((settings as any)?.custom_nav) ? ((settings as any).custom_nav as any[]) : [];\n if (customNav.length > 0) {\n const mapped: NavLink[] = customNav.map((it) => ({ label: String(it.label || 'Stránka'), to: String(it.url || '#'), external: Boolean(it.external) }));\n const insertIdx = links.findIndex((n) => n.label === 'Tabulky');\n if (insertIdx >= 0) {\n links = [...links.slice(0, insertIdx + 1), ...mapped, ...links.slice(insertIdx + 1)];\n } else {\n links = [...links, ...mapped];\n }\n }\n \n return links;\n }, [filteredDynamicNavItems, navbarData.navLoading, settings, categoryItems, navbarData.hasTables, navbarData.hasActivities, navbarData.hasPlayers, navbarData.hasArticles, navbarData.hasVideos, navbarData.hasGallery, galleryLabel, i18n.language, t]);\n\n // Split navigation into visible and overflow for desktop\n const navSplit = useMemo(() => {\n const links = NAV_LINKS;\n let maxVisible = 8;\n const w = windowWidth;\n if (w >= 1600) maxVisible = 10;\n else if (w >= 1400) maxVisible = 9;\n else if (w >= 1200) maxVisible = 8;\n else if (w >= 1100) maxVisible = 7;\n else maxVisible = 6;\n if (links.length <= maxVisible) return { visible: links, overflow: [] as NavLink[] };\n const visibleCount = Math.max(1, maxVisible - 1); // reserve one slot for \"More\"\n return { visible: links.slice(0, visibleCount), overflow: links.slice(visibleCount) };\n }, [NAV_LINKS, windowWidth]);\n\n const moreItems = useMemo(() => {\n const out: { label: string; to: string }[] = [];\n navSplit.overflow.forEach((nav) => {\n if (nav.to) out.push({ label: nav.label, to: nav.to });\n if (Array.isArray(nav.items)) {\n nav.items.forEach((it) => out.push({ label: it.label, to: it.to }));\n }\n });\n return out;\n }, [navSplit]);\n\n // Variant-driven styles for main nav bar\n const headerVariant = variant || 'unified';\n const navBgDefault = useColorModeValue('rgba(255,255,255,0.9)', 'rgba(15,17,21,0.85)');\n const navBgMinimal = useColorModeValue('white', '#0f1115');\n const isTransparent = headerVariant === 'transparent';\n const isMinimal = headerVariant === 'minimal';\n const navBg = isTransparent ? 'transparent' : (isMinimal ? navBgMinimal : navBgDefault);\n const navBackdrop = (isTransparent || isMinimal) ? 'none' : 'saturate(180%) blur(10px)';\n const navBorderBottomWidth = isTransparent ? '0px' : '1px';\n const navBoxShadow = (isTransparent || isMinimal) ? 'none' : (scrolled ? 'sm' : 'none');\n\n const levelProgress = useMemo(() => {\n const xp = engProfile?.xp ?? 0;\n let lvl = 1;\n let threshold = 100;\n let remaining = xp;\n while (remaining >= threshold && lvl < 200) {\n remaining -= threshold;\n lvl++;\n threshold += 100;\n }\n const pct = Math.max(0, Math.min(100, Math.floor((remaining / threshold) * 100)));\n return { pct };\n }, [engProfile?.xp]);\n\n return (\n <Box position=\"sticky\" top={0} zIndex={1000}>\n {/* Top bar with socials and quick external links */}\n {(settings?.facebook_url || settings?.instagram_url || settings?.youtube_url || settings?.shop_url) && (\n <Box bg={topBarBg} borderBottomWidth=\"1px\" borderColor=\"border.subtle\" py={1} display={{ base: 'none', md: 'block' }}>\n <Container maxW={containerMaxW} px={fullWidth ? 0 : undefined}>\n <Flex align=\"center\" justify=\"space-between\" gap={2}>\n <HStack spacing={2}>\n {settings?.shop_url && (\n <Button as=\"a\" href={settings.shop_url} target=\"_blank\" rel=\"noreferrer\" variant=\"link\" size=\"xs\" leftIcon={<FaShoppingBag />}>\n {t('nav.shop')}\n </Button>\n )}\n </HStack>\n <HStack spacing={1}>\n {normalizeSocialUrl('facebook', settings?.facebook_url) && (\n <IconButton as=\"a\" href={normalizeSocialUrl('facebook', settings?.facebook_url) || undefined} target=\"_blank\" rel=\"noreferrer\" aria-label=\"Facebook\" icon={<FaFacebook />} variant=\"ghost\" size=\"xs\" />\n )}\n {normalizeSocialUrl('instagram', settings?.instagram_url) && (\n <IconButton as=\"a\" href={normalizeSocialUrl('instagram', settings?.instagram_url) || undefined} target=\"_blank\" rel=\"noreferrer\" aria-label=\"Instagram\" icon={<FaInstagram />} variant=\"ghost\" size=\"xs\" />\n )}\n {normalizeSocialUrl('youtube', settings?.youtube_url) && (\n <IconButton as=\"a\" href={normalizeSocialUrl('youtube', settings?.youtube_url) || undefined} target=\"_blank\" rel=\"noreferrer\" aria-label=\"YouTube\" icon={<FaYoutube />} variant=\"ghost\" size=\"xs\" />\n )}\n </HStack>\n </Flex>\n </Container>\n </Box>\n )}\n\n {/* Main Nav Bar */}\n <Box\n bg={navBg}\n backdropFilter={navBackdrop}\n borderBottomWidth={navBorderBottomWidth}\n borderColor=\"border.subtle\"\n boxShadow={navBoxShadow}\n transition=\"box-shadow 0.2s ease, background-color 0.2s ease, backdrop-filter 0.2s ease\"\n > \n <MobileMenu isOpen={isOpen} onClose={onClose} isAdmin={isAdmin} isAuthenticated={isAuthenticated} menuBg={menuBg} dividerColor={dividerColor} settings={settings} categories={navbarData.categories} galleryHref={galleryHref} galleryLabel={galleryLabel} hasTables={navbarData.hasTables} hasActivities={navbarData.hasActivities} hasPlayers={navbarData.hasPlayers} hasArticles={navbarData.hasArticles} hasVideos={navbarData.hasVideos} hasGallery={navbarData.hasGallery} dynamicNavItems={filteredDynamicNavItems || []} navLoading={navbarData.navLoading} t={t} i18n={i18n} handleSimpleLanguageChange={handleSimpleLanguageChange} />\n <Container maxW={containerMaxW} px={fullWidth ? 0 : undefined}>\n <Flex h={16} alignItems=\"center\" justifyContent=\"space-between\">\n <HStack spacing={4} alignItems=\"center\">\n {/* Club Logo only */}\n <HStack as={RouterLink} to=\"/\" spacing={3} align=\"center\">\n {(settings?.club_logo_url || theme.logoUrl) && (\n <Image\n src={assetUrl(settings?.club_logo_url || theme.logoUrl) || settings?.club_logo_url || theme.logoUrl}\n alt={settings?.club_name || theme.name || 'Logo'}\n boxSize={{ base: '36px', md: '40px' }}\n objectFit=\"contain\"\n borderRadius=\"full\"\n borderWidth=\"2px\"\n borderColor=\"brand.primary\"\n style={{\n padding: (settings?.club_logo_url || theme.logoUrl)?.includes('logoapi.sportcreative.eu') ? '4px' : '0px',\n boxSizing: 'border-box'\n }}\n />\n )}\n </HStack>\n {/* Desktop navigation with hover dropdowns */}\n <HStack as=\"nav\" spacing={1} display={{ base: 'none', lg: 'flex' }} ml={4}>\n {navSplit.visible.map((nav) => {\n const commonProps = {\n variant: 'ghost' as const,\n size: 'sm' as const,\n px: 3,\n _hover: { bg: hoverBg, transform: 'translateY(-1px)' },\n fontWeight: isPathActive(nav.to) ? '700' : '600',\n color: isPathActive(nav.to) ? activeTextColor : navTextColor,\n bg: isPathActive(nav.to) ? activeBg : 'transparent',\n transition: 'all 0.2s',\n };\n \n // Handle items with dropdown (like Články with categories)\n if (nav.items && nav.items.length > 0) {\n return (\n <HoverMenu key={nav.label} label={nav.label} to={nav.to || '/blog'} items={nav.items} isActive={isPathActive(nav.to)} />\n );\n }\n \n if (nav.external && nav.to) {\n return (\n <Button key={nav.label} as=\"a\" href={nav.to} target=\"_blank\" rel=\"noreferrer\" rightIcon={<FaExternalLinkAlt />} {...commonProps}>\n {nav.label}\n </Button>\n );\n }\n return (\n <Button key={nav.label} as={RouterLink} to={nav.to || '#'} {...commonProps}>\n {nav.label}\n </Button>\n );\n })}\n {navSplit.overflow.length > 0 && (\n <HoverMenu key=\"more\" label={t('action.more')} items={moreItems} />\n )}\n </HStack>\n </HStack>\n\n <Flex alignItems=\"center\">\n {/* Mobile menu button */}\n <IconButton\n display={{ base: 'flex', md: 'none' }}\n onClick={onOpen}\n icon={<HamburgerIcon />}\n aria-label={t('action.open_menu')}\n variant=\"ghost\"\n mr={2}\n />\n\n {/* Space reserved (socials moved to top bar) */}\n <Box display={{ base: 'none', md: 'flex' }} mr={2} />\n\n {/* Search button */}\n <Tooltip label={t('action.search')} hasArrow>\n <IconButton\n aria-label={t('action.search')}\n icon={<FaSearch />}\n size=\"sm\"\n mr={2}\n variant=\"ghost\"\n onClick={onSearchOpen}\n />\n </Tooltip>\n\n {/* Admin edit button */}\n {isAdmin && (\n <Tooltip label={t('action.content_admin')} hasArrow>\n <IconButton\n as={RouterLink}\n to=\"/admin\"\n aria-label={t('action.content_admin')}\n icon={<EditIcon />}\n size=\"sm\"\n mr={2}\n colorScheme=\"blue\"\n variant=\"ghost\"\n />\n </Tooltip>\n )}\n\n {/* Language switcher - compact dropdown for all users */}\n <LanguageSwitcher />\n\n {/* Color mode toggle */}\n <ThemeToggle />\n\n {/* Auth buttons (desktop) */}\n {!isAuthenticated && (\n <>\n <Button\n as={RouterLink}\n to=\"/register\"\n size=\"sm\"\n variant=\"outline\"\n display={{ base: 'none', md: 'inline-flex' }}\n ml={2}\n mr={2}\n >\n {t('auth.register')}\n </Button>\n <Button\n as={RouterLink}\n to=\"/login\"\n size=\"sm\"\n colorScheme=\"blue\"\n display={{ base: 'none', md: 'inline-flex' }}\n mr={2}\n >\n {t('auth.login')}\n </Button>\n </>\n )}\n\n {isAuthenticated && (\n <Menu>\n <MenuButton\n as={Button}\n rounded=\"full\"\n variant=\"link\"\n cursor=\"pointer\"\n minW={0}\n ml={2}\n >\n <Avatar size=\"sm\" name={user?.name || t('common.user')} src={engProfile?.animated_avatar_url || engProfile?.avatar_url || undefined} />\n </MenuButton>\n <MenuList>\n <MenuItem isDisabled>{`${t('engagement.level')} ${engProfile?.level ?? 1} • ${engProfile?.points ?? 0} ${t('engagement.points')}`}</MenuItem>\n <Box px={3} py={2}>\n <Text fontSize=\"xs\" color=\"gray.500\">{t('engagement.progress')}</Text>\n <Progress value={levelProgress.pct} size=\"xs\" colorScheme=\"blue\" borderRadius=\"full\" mt={1} />\n </Box>\n {!isAdmin && (\n <>\n <MenuItem onClick={onAchOpen}>{t('engagement.achievements')}</MenuItem>\n <MenuItem onClick={onRewOpen}>{t('engagement.rewards')}</MenuItem>\n </>\n )}\n <MenuItem as={RouterLink} to={accountPath}>{t('common.my_account')}</MenuItem>\n <MenuItem onClick={openMyNewsletterPrefs}>{t('newsletter.email_preferences')}</MenuItem>\n {isAdmin && <MenuItem as={RouterLink} to=\"/admin/nastaveni\">{t('admin.page_settings')}</MenuItem>}\n {isAdmin && <MenuItem as={RouterLink} to=\"/admin\">{t('nav.admin')}</MenuItem>}\n <MenuItem onClick={logout}>{t('auth.logout')}</MenuItem>\n </MenuList>\n </Menu>\n )}\n </Flex>\n {/* Close outer Flex */}\n </Flex>\n </Container>\n\n {/* Search Modal */}\n <Modal isOpen={isSearchOpen} onClose={onSearchClose} size=\"md\" motionPreset=\"scale\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>{t('search.title')}</ModalHeader>\n <ModalCloseButton />\n <ModalBody pb={6}>\n <form\n onSubmit={(e) => {\n e.preventDefault();\n submitSearch();\n }}\n >\n <VStack spacing={4}>\n <InputGroup size=\"lg\">\n <InputLeftElement pointerEvents=\"none\">\n <FaSearchIcon />\n </InputLeftElement>\n <Input\n placeholder={t('search.placeholder')}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n autoFocus\n />\n </InputGroup>\n <Button type=\"submit\" colorScheme=\"blue\" size=\"lg\" w=\"full\" leftIcon={<FaSearchIcon />}>\n {t('search.search_button')}\n </Button>\n </VStack>\n </form>\n <Text fontSize=\"sm\" color=\"gray.500\" mt={4} textAlign=\"center\">\n {t('search.search_hint')}\n </Text>\n </ModalBody>\n </ModalContent>\n </Modal>\n {!isAdmin && (\n <>\n <AchievementsModal isOpen={isAchOpen} onClose={onAchClose} onOpenRewards={onRewOpen} />\n <RewardsModal\n isOpen={isRewOpen}\n onClose={onRewClose}\n availablePoints={engProfile?.points || 0}\n onRedeemed={async () => { try { const p = await getEngagementProfile(); setEngProfile(p); } catch {} }}\n />\n </>\n )}\n\n </Box>\n </Box>\n );\n};\n\n// HoverMenu component for desktop dropdown nav\nconst HoverMenu = ({ label, items, to, isActive }: { label: string; items: { label: string; to: string }[]; to?: string; isActive?: boolean }) => {\n const menuColorActive = useColorModeValue('brand.primary', 'brand.accent');\n const menuColorInactive = useColorModeValue('gray.700', 'gray.200');\n const menuBgActive = useColorModeValue('blackAlpha.50', 'whiteAlpha.100');\n const menuHoverBg = useColorModeValue('blackAlpha.100', 'whiteAlpha.200');\n const navigate = useNavigate();\n const [open, setOpen] = React.useState(false);\n const openTimer = useRef<number | null>(null);\n const closeTimer = useRef<number | null>(null);\n\n const clearTimers = () => {\n if (openTimer.current) { window.clearTimeout(openTimer.current); openTimer.current = null; }\n if (closeTimer.current) { window.clearTimeout(closeTimer.current); closeTimer.current = null; }\n };\n\n const handleOpen = () => {\n if (closeTimer.current) { window.clearTimeout(closeTimer.current); closeTimer.current = null; }\n if (!open) {\n openTimer.current = window.setTimeout(() => setOpen(true), 60);\n }\n };\n const handleClose = () => {\n if (openTimer.current) { window.clearTimeout(openTimer.current); openTimer.current = null; }\n closeTimer.current = window.setTimeout(() => setOpen(false), 120);\n };\n\n useEffect(() => () => clearTimers(), []);\n\n const hasParentLink = typeof to === 'string' && to.trim().length > 0;\n const isExternalParent = hasParentLink && /^https?:\\/\\//i.test(to!);\n\n const onParentClick = (e: React.MouseEvent) => {\n if (!hasParentLink) return;\n if (isExternalParent) {\n window.open(to!, '_blank', 'noopener,noreferrer');\n } else {\n navigate(to!);\n }\n };\n\n return (\n <Menu isOpen={open} placement=\"bottom-start\" gutter={0} closeOnBlur={false} isLazy>\n <MenuButton\n as={Button}\n rightIcon={<ChevronDownIcon />}\n variant=\"ghost\"\n size=\"sm\"\n px={3}\n fontWeight={isActive ? '700' : '600'}\n color={isActive ? menuColorActive : menuColorInactive}\n bg={isActive ? menuBgActive : 'transparent'}\n _hover={{ bg: menuHoverBg, transform: 'translateY(-1px)' }}\n transition=\"all 0.2s\"\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n onClick={onParentClick}\n >\n {label}\n </MenuButton>\n <MenuList onMouseEnter={handleOpen} onMouseLeave={handleClose}>\n {items.map((it) => {\n const isExternal = /^https?:\\/\\//i.test(it.to);\n if (isExternal) {\n return (\n <MenuItem as=\"a\" href={it.to} key={it.to} target=\"_blank\" rel=\"noreferrer\">\n {it.label}\n </MenuItem>\n );\n }\n return (\n <MenuItem as={RouterLink} to={it.to} key={it.to}>\n {it.label}\n </MenuItem>\n );\n })}\n </MenuList>\n </Menu>\n );\n};\n\nexport default Navbar;\n\n// Search Modal rendered alongside Navbar content\n// Note: We append the modal inside Navbar return to keep code compact\n","import { Box, Container, IconButton } from '@chakra-ui/react';\nimport { ReactNode, useEffect, useState } from 'react';\nimport { FiChevronUp } from 'react-icons/fi';\nimport Navbar from '../Navbar';\nimport Footer from './Footer';\nimport { useAllPageElementConfigs } from '../../hooks/usePageElementConfig';\nimport SpartaNavbar from '../elements/SpartaNavbar';\nimport SponsorsSection from '../common/SponsorsSection';\n\ninterface MainLayoutProps {\n children: ReactNode;\n headerInsideContainer?: boolean;\n showSponsorsSection?: boolean;\n}\n\nexport const MainLayout: React.FC<MainLayoutProps> = ({ children, headerInsideContainer = false, showSponsorsSection = true }) => {\n const [showTop, setShowTop] = useState(false);\n const { getStyles, getVariant, refreshKey } = useAllPageElementConfigs('homepage');\n const headerVariant = getVariant('header', 'unified');\n const sponsorsVariant = getVariant('sponsors', 'grid');\n const footerVariant = getVariant('footer', 'standard');\n const containerVariant = getVariant('container', 'boxed');\n const isFullWidthLayout = containerVariant === 'fullwidth';\n const isWideLayout = containerVariant === 'wide';\n const contentMaxW = isFullWidthLayout ? '100%' : isWideLayout ? '1400px' : 'container.xl';\n const headerIsInside = headerInsideContainer && headerVariant !== 'fullwidth';\n\n useEffect(() => {\n const onScroll = () => {\n try {\n setShowTop(window.scrollY > 400);\n } catch {}\n };\n window.addEventListener('scroll', onScroll, { passive: true } as any);\n onScroll();\n return () => window.removeEventListener('scroll', onScroll as any);\n }, []);\n\n const scrollToTop = () => {\n try {\n window.scrollTo({ top: 0, behavior: 'smooth' });\n } catch {\n window.scrollTo(0, 0);\n }\n };\n\n return (\n <Box minH=\"100vh\" bg=\"bg.app\" overflowX=\"hidden\">\n <Box id=\"top\" position=\"absolute\" top={0} left={0} />\n {headerIsInside ? (\n <>\n <Container maxW={contentMaxW} py={8} px={isFullWidthLayout ? 0 : undefined}>\n <Box key={`header-${refreshKey}-${headerVariant}`} as=\"header\" data-element=\"header\" data-variant={headerVariant} style={{ ...getStyles('header') }}>\n {headerVariant === 'sparta_navbar' ? (\n <SpartaNavbar />\n ) : (\n <Navbar fullWidth={headerVariant === 'fullwidth'} variant={headerVariant} />\n )}\n </Box>\n {children}\n </Container>\n {showSponsorsSection && (\n <Box key={`sponsors-${refreshKey}-${sponsorsVariant}`} data-element=\"sponsors\" data-variant={sponsorsVariant} style={{ ...getStyles('sponsors') }}>\n <SponsorsSection />\n </Box>\n )}\n <Box key={`footer-${refreshKey}-${footerVariant}`} as=\"footer\" data-element=\"footer\" data-variant={footerVariant} style={{ ...getStyles('footer') }}>\n <Footer />\n </Box>\n </>\n ) : (\n <>\n <Box key={`header-${refreshKey}-${headerVariant}`} as=\"header\" data-element=\"header\" data-variant={headerVariant} style={{ ...getStyles('header') }}>\n {headerVariant === 'sparta_navbar' ? (\n <SpartaNavbar />\n ) : (\n <Navbar fullWidth={headerVariant === 'fullwidth'} variant={headerVariant} />\n )}\n </Box>\n <Container maxW={contentMaxW} py={8} px={isFullWidthLayout ? 0 : undefined}>\n {children}\n </Container>\n {/* Global sponsors section across front-facing pages */}\n {showSponsorsSection && (\n <Box key={`sponsors-${refreshKey}-${sponsorsVariant}`} data-element=\"sponsors\" data-variant={sponsorsVariant} style={{ ...getStyles('sponsors') }}>\n <SponsorsSection />\n </Box>\n )}\n <Box key={`footer-${refreshKey}-${footerVariant}`} as=\"footer\" data-element=\"footer\" data-variant={footerVariant} style={{ ...getStyles('footer') }}>\n <Footer />\n </Box>\n </>\n )}\n {showTop && (\n <IconButton\n aria-label=\"Zpět nahoru\"\n icon={<FiChevronUp />}\n position=\"fixed\"\n right={{ base: 4, md: 6 }}\n bottom={{ base: 4, md: 6 }}\n zIndex={1000}\n colorScheme=\"blue\"\n onClick={scrollToTop}\n borderRadius=\"full\"\n shadow=\"md\"\n />\n )}\n </Box>\n );\n};\n\nexport default MainLayout;\n","import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios';\nimport {\n SearchResponse,\n ClubInfo,\n Competition,\n SearchResult,\n} from './types';\n\n// Cache interface\ninterface CacheItem<T> {\n data: T;\n timestamp: number;\n}\n\n// Cache store\nconst cache = new Map<string, CacheItem<any>>();\n\n// Create axios instance with base URL from environment variables\nconst apiClient: AxiosInstance = axios.create({\n baseURL: process.env.REACT_APP_FACR_API_BASE_URL || '/api/v1/facr',\n timeout: parseInt(process.env.REACT_APP_FACR_API_TIMEOUT || '20000', 10),\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n});\n\n// Helper: resolve backend absolute URL for /api and /cache paths\nconst resolveBackendUrl = (path: string) => {\n try {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (path.startsWith('/cache') || path.startsWith('/uploads') || path.startsWith('/api/')) {\n const explicit = process.env.REACT_APP_API_BASE_URL || process.env.REACT_APP_API_URL || '';\n if (typeof window === 'undefined') {\n // In non-browser contexts, avoid forcing any origin; return the relative path\n return path;\n }\n const baseOrigin = explicit\n ? new URL(explicit, window.location.origin).origin\n : window.location.origin;\n // Use URL constructor so query strings in `path` are handled correctly\n return new URL(path, baseOrigin).toString();\n }\n return path;\n } catch {\n return path;\n }\n};\n\n// Lazy-load public overrides with lightweight cache\nlet overridesCache: { data: any; ts: number } | null = null;\ntype OverridesPayload = {\n by_name?: Record<string, string>;\n by_id?: Record<string, { name?: string; logo_url?: string }>;\n};\nconst loadOverrides = async (): Promise<OverridesPayload> => {\n const now = Date.now();\n if (overridesCache && now - overridesCache.ts < 60_000) {\n return (overridesCache.data || {}) as OverridesPayload;\n }\n try {\n const res = await fetch(resolveBackendUrl(`/api/v1/public/team-logo-overrides?t=${now}`), { cache: 'no-cache' });\n if (res.ok) {\n const json = await res.json();\n const prev = JSON.stringify(overridesCache?.data || {});\n const next = JSON.stringify(json || {});\n overridesCache = { data: json, ts: now };\n if (prev !== next) {\n // Invalidate internal FACR GET cache so consumers refetch with new logos\n cache.clear();\n }\n return (json || {}) as OverridesPayload;\n }\n } catch {}\n // Fallback to cached file if API failed\n try {\n const res2 = await fetch(resolveBackendUrl('/cache/prefetch/team_logo_overrides.json'), { cache: 'no-cache' });\n if (res2.ok) {\n const json = await res2.json();\n const prev = JSON.stringify(overridesCache?.data || {});\n const next = JSON.stringify(json || {});\n overridesCache = { data: json, ts: now };\n if (prev !== next) {\n cache.clear();\n }\n return (json || {}) as OverridesPayload;\n }\n } catch {}\n overridesCache = { data: { by_name: {} }, ts: now };\n return { by_name: {} };\n};\n\n// Name normalization helpers\nconst norm = (s: string) => String(s || '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\nconst stripPrefixes = (s: string) => {\n let x = norm(s);\n // Remove common Czech tokens/prefixes\n x = x.replace(/\\b(mestsky|m\\.?f\\.?k\\.?|mfk|tj|sk|sokol|fotbalovy|fotbalový|fotbalovy\\s+klub|fotbalovy\\s+klub)\\b/g, '');\n return x.replace(/\\s+/g, ' ').trim();\n};\nconst applyOverridesToClub = (club: ClubInfo, overrides: OverridesPayload) => {\n if (!club?.competitions?.length) return club;\n const byName = overrides?.by_name || {};\n const byId = overrides?.by_id || {} as Record<string, { name?: string; logo_url?: string }>;\n const byNameNorm: Record<string, string> = Object.keys(byName || {}).reduce((acc: Record<string, string>, k) => {\n acc[norm(k)] = byName[k];\n return acc;\n }, {});\n const strippedPairs = Object.keys(byName || {}).map((k) => ({ key: stripPrefixes(k), url: byName[k] }));\n const pickLogo = (teamId?: string, teamName?: string, original?: string) => {\n if (teamId && byId[teamId]?.logo_url) {\n const v = byId[teamId]!.logo_url!;\n if (typeof v === 'string' && v.startsWith('/')) return resolveBackendUrl(v);\n return v;\n }\n if (!teamName) return original;\n const exact = (byName || {})[teamName];\n const n = norm(teamName);\n let candidate = exact || byNameNorm[n];\n if (!candidate) {\n const s = stripPrefixes(teamName);\n for (const { key, url } of strippedPairs) {\n if (!key) continue;\n if (s.endsWith(key) || key.endsWith(s)) { candidate = url; break; }\n }\n }\n const chosen = candidate || original;\n if (typeof chosen === 'string' && chosen.startsWith('/')) return resolveBackendUrl(chosen);\n return chosen;\n };\n const pickName = (teamId?: string, original?: string) => {\n const v = (teamId && byId[teamId]?.name) ? byId[teamId]!.name : undefined;\n return (v && v.trim().length > 0) ? v : original;\n };\n club.competitions = (club.competitions || []).map((c) => ({\n ...c,\n matches: (c.matches || []).map((m: any) => ({\n ...m,\n home: pickName(m.home_id, m.home),\n away: pickName(m.away_id, m.away),\n home_logo_url: pickLogo(m.home_id, m.home, m.home_logo_url),\n away_logo_url: pickLogo(m.away_id, m.away, m.away_logo_url),\n })),\n }));\n return club;\n};\n\n// Request interceptor for caching\napiClient.interceptors.request.use(\n (config: InternalAxiosRequestConfig) => {\n // Skip cache for non-GET requests\n if (config.method?.toLowerCase() !== 'get') {\n return config;\n }\n\n // Generate a cache key based on the request\n const cacheKey = `${config.method}:${config.url}:${JSON.stringify(config.params)}`;\n \n // Check if we have a cached response\n const cached = cache.get(cacheKey);\n const now = Date.now();\n const cacheTtl = parseInt(process.env.REACT_APP_FACR_CACHE_TTL || '3600000', 10);\n \n if (cached && now - cached.timestamp < cacheTtl) {\n // Return cached response\n return {\n ...config,\n adapter: () => Promise.resolve({\n data: cached.data,\n status: 200,\n statusText: 'OK',\n headers: {},\n config,\n }),\n };\n }\n \n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n);\n\n// Response interceptor for caching successful responses\napiClient.interceptors.response.use(\n (response: AxiosResponse) => {\n const method = response.config.method?.toLowerCase();\n const url = response.config.url;\n const params = response.config.params;\n \n // Only cache GET requests\n if (method === 'get') {\n const cacheKey = `${method}:${url}:${JSON.stringify(params)}`;\n cache.set(cacheKey, {\n data: response.data,\n timestamp: Date.now(),\n });\n }\n return response;\n },\n (error) => {\n console.error('API Error:', error);\n return Promise.reject(error);\n }\n);\n\n// Helper function to handle API errors\nconst handleApiError = (error: any) => {\n if (error.response) {\n // The request was made and the server responded with a status code\n // that falls out of the range of 2xx\n const errorData = error.response.data || {};\n const errorMessage = errorData.message || 'API request failed';\n console.error('API Error Response:', errorData);\n throw new Error(errorMessage);\n } else if (error.request) {\n // The request was made but no response was received\n console.error('API Error: No response received', error.request);\n throw new Error('No response from server. Please check if the FACR scraper API is running.');\n } else {\n // Something happened in setting up the request that triggered an Error\n console.error('API Error:', error.message);\n throw new Error(`API request failed: ${error.message}`);\n }\n};\n\n// FACR API client\nexport const facrApi = {\n // Search for clubs\n searchClubs: async (query: string): Promise<SearchResponse> => {\n try {\n const response = await apiClient.get<SearchResponse>('/club/search', {\n params: { q: query },\n });\n return response.data;\n } catch (error) {\n return handleApiError(error);\n }\n },\n\n // Get club details and matches\n getClub: async (clubId: string, clubType: 'football' | 'futsal' = 'football'): Promise<ClubInfo> => {\n try {\n const response = await apiClient.get<ClubInfo>(`/club/${clubType}/${clubId}`);\n // Load overrides and apply before returning/caching consumers\n const overrides = await loadOverrides();\n const patched = applyOverridesToClub(response.data, overrides);\n return patched;\n } catch (error) {\n return handleApiError(error);\n }\n },\n\n // Get club table (standings)\n getClubTable: async (clubId: string, clubType: 'football' | 'futsal' = 'football'): Promise<ClubInfo> => {\n try {\n const response = await apiClient.get<ClubInfo>(`/club/${clubType}/${clubId}/table`);\n const data = response.data as any;\n const overrides = await loadOverrides();\n const byName = overrides?.by_name || {};\n const byId = overrides?.by_id || {} as Record<string, { name?: string; logo_url?: string }>;\n const byNameNorm: Record<string, string> = Object.keys(byName || {}).reduce((acc: Record<string, string>, k) => { acc[norm(k)] = byName[k]; return acc; }, {});\n const strippedPairs = Object.keys(byName || {}).map((k) => ({ key: stripPrefixes(k), url: byName[k] }));\n const pickLogo = (teamId?: string, teamName?: string, original?: string) => {\n if (teamId && byId[teamId]?.logo_url) {\n const v = byId[teamId]!.logo_url!;\n if (typeof v === 'string' && v.startsWith('/')) return resolveBackendUrl(v);\n return v;\n }\n if (!teamName) return original;\n const exact = (byName || {})[teamName];\n const n = norm(teamName);\n let candidate = exact || byNameNorm[n];\n if (!candidate) {\n const s = stripPrefixes(teamName);\n for (const { key, url } of strippedPairs) { if (!key) continue; if (s.endsWith(key) || key.endsWith(s)) { candidate = url; break; } }\n }\n const chosen = candidate || original;\n if (typeof chosen === 'string' && chosen.startsWith('/')) return resolveBackendUrl(chosen);\n return chosen;\n };\n const pickName = (teamId?: string, original?: string) => {\n const v = (teamId && byId[teamId]?.name) ? byId[teamId]!.name : undefined;\n return (v && v.trim().length > 0) ? v : original;\n };\n if (Array.isArray(data?.competitions)) {\n data.competitions = data.competitions.map((c: any) => ({\n ...c,\n table: {\n overall: (c.table?.overall || []).map((r: any) => ({\n ...r,\n team: pickName(r.team_id, r.team),\n team_logo_url: pickLogo(r.team_id, r.team, r.team_logo_url),\n })),\n },\n }));\n }\n return data;\n } catch (error) {\n return handleApiError(error);\n }\n },\n\n // Clear cache\n clearCache: (): void => {\n cache.clear();\n },\n\n // Get all competitions for a club\n getClubCompetitions: async (clubId: string, clubType: 'football' | 'futsal' = 'football'): Promise<Competition[]> => {\n try {\n const clubInfo = await facrApi.getClub(clubId, clubType);\n return clubInfo.competitions || [];\n } catch (error) {\n return handleApiError(error);\n }\n },\n\n // Get matches for a specific competition\n getCompetitionMatches: async (competitionId: string): Promise<any[]> => {\n try {\n // Note: This assumes the competition ID is in the format 'type/id'\n const [type, id] = competitionId.split('/');\n const response = await apiClient.get<ClubInfo>(`/club/${type}/${id}`);\n // Find the specific competition and return its matches\n const competition = response.data.competitions?.find(c => c.id === competitionId);\n return competition?.matches || [];\n } catch (error) {\n return handleApiError(error);\n }\n },\n};\n\nexport default facrApi;\n","import api from './api';\n\nexport interface AnalyticsData {\n users: {\n total: number;\n new_this_week: number;\n };\n events: {\n total: number;\n upcoming: number;\n };\n articles: {\n total: number;\n published: number;\n };\n}\n\nexport interface AnalyticsOverview {\n total_page_views: number;\n unique_visitors: number;\n total_articles: number;\n published_articles: number;\n page_views_today: number;\n page_views_week: number;\n unique_visitors_week: number;\n}\n\nexport interface PageStats {\n page_path: string;\n page_name: string;\n view_count: number;\n unique_visitors: number;\n}\n\nexport interface TopInteraction {\n page: string;\n element: string;\n count: number;\n}\n\nexport const getAnalytics = async (): Promise<AnalyticsData> => {\n const response = await api.get('/admin/analytics');\n return response.data;\n};\n\nexport const getAnalyticsOverview = async (): Promise<AnalyticsOverview> => {\n const response = await api.get('/admin/analytics/overview');\n return response.data;\n};\n\nexport const getTopPages = async (limit: number = 10): Promise<PageStats[]> => {\n const response = await api.get('/admin/analytics/top-pages', {\n params: { limit }\n });\n return response.data;\n};\n\nexport const getTopArticles = async (limit: number = 10): Promise<any[]> => {\n const response = await api.get('/admin/analytics/top-articles', {\n params: { limit }\n });\n return response.data;\n};\n\nexport const getTopInteractions = async (days: number = 30, limit: number = 10): Promise<{ items: TopInteraction[] }> => {\n const response = await api.get('/admin/analytics/top-interactions', {\n params: { days, limit }\n });\n return response.data;\n};\n\n// Track event - public endpoint\nexport const trackEvent = async (eventData: {\n event_type: string;\n page?: string;\n page_path?: string;\n page_name?: string;\n element?: string;\n data?: Record<string, any>;\n}): Promise<{ ok: boolean }> => {\n const response = await api.post('/analytics/track', eventData);\n return response.data;\n};\n","import { useState, useCallback } from 'react';\nimport {\n SearchResponse,\n ClubInfo,\n Competition,\n Match,\n} from '../services/facr/types';\nimport facrApi from '../services/facr/facrApi';\n\ninterface UseFacrApiReturn {\n // Search for clubs by query\n searchClubs: (query: string) => Promise<SearchResponse>;\n searchResults: SearchResponse['results'] | [];\n searchLoading: boolean;\n searchError: Error | null;\n \n // Get club details by ID and type\n getClub: (clubId: string, clubType?: 'football' | 'futsal') => Promise<ClubInfo>;\n \n // Get club table/standings by ID and type\n getClubTable: (clubId: string, clubType?: 'football' | 'futsal') => Promise<ClubInfo>;\n \n // Get all competitions for a club\n getClubCompetitions: (clubId: string, clubType?: 'football' | 'futsal') => Promise<Competition[]>;\n \n // Get matches for a specific competition\n getCompetitionMatches: (competitionId: string) => Promise<Match[]>;\n \n // Clear the API cache\n clearCache: () => void;\n \n // Loading state\n loading: boolean;\n \n // Error state\n error: Error | null;\n}\n\nexport const useFacrApi = (): UseFacrApiReturn => {\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<Error | null>(null);\n const [searchResults, setSearchResults] = useState<SearchResponse['results']>([]);\n const [searchLoading, setSearchLoading] = useState<boolean>(false);\n const [searchError, setSearchError] = useState<Error | null>(null);\n\n const handleApiCall = useCallback(\n async <T>(apiCall: () => Promise<T>): Promise<T> => {\n setLoading(true);\n setError(null);\n try {\n return await apiCall();\n } catch (err) {\n const error = err instanceof Error ? err : new Error('An unknown error occurred');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n },\n []\n );\n\n const searchClubs = useCallback(\n async (query: string): Promise<SearchResponse> => {\n setSearchLoading(true);\n setSearchError(null);\n try {\n const response = await handleApiCall(() => facrApi.searchClubs(query));\n setSearchResults(response.results || []);\n return response;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to search clubs');\n setSearchError(error);\n throw error;\n } finally {\n setSearchLoading(false);\n }\n },\n [handleApiCall]\n );\n\n const getClub = useCallback(\n (clubId: string, clubType: 'football' | 'futsal' = 'football'): Promise<ClubInfo> =>\n handleApiCall(() => facrApi.getClub(clubId, clubType)),\n [handleApiCall]\n );\n\n const getClubTable = useCallback(\n (clubId: string, clubType: 'football' | 'futsal' = 'football'): Promise<ClubInfo> =>\n handleApiCall(() => facrApi.getClubTable(clubId, clubType)),\n [handleApiCall]\n );\n\n const getClubCompetitions = useCallback(\n (clubId: string, clubType: 'football' | 'futsal' = 'football'): Promise<Competition[]> =>\n handleApiCall(() => facrApi.getClubCompetitions(clubId, clubType)),\n [handleApiCall]\n );\n\n const getCompetitionMatches = useCallback(\n (competitionId: string): Promise<Match[]> =>\n handleApiCall(() => facrApi.getCompetitionMatches(competitionId)),\n [handleApiCall]\n );\n\n const clearCache = useCallback(() => {\n facrApi.clearCache();\n }, []);\n\n return {\n searchClubs,\n searchResults,\n searchLoading,\n searchError,\n getClub,\n getClubTable,\n getClubCompetitions,\n getCompetitionMatches,\n clearCache,\n loading,\n error,\n };\n};\n\nexport default useFacrApi;\n","import api, { API_URL } from './api';\n\nexport type AdminMatch = Record<string, any> & {\n match_id?: string;\n id?: string;\n home?: string;\n away?: string;\n venue?: string;\n date_time?: string;\n home_logo_url?: string;\n away_logo_url?: string;\n};\n\nexport async function fetchAdminMatches(): Promise<AdminMatch[]> {\n const res = await api.get('/admin/matches');\n return Array.isArray(res.data) ? res.data : res.data?.data ?? [];\n}\n\nexport type MatchOverrideInput = {\n home_name_override?: string | null;\n away_name_override?: string | null;\n venue_override?: string | null;\n date_time_override?: string | null; // ISO string\n score_override?: string | null;\n home_logo_url?: string | null;\n away_logo_url?: string | null;\n notes?: string | null;\n};\n\nexport async function putMatchOverride(externalMatchId: string, payload: MatchOverrideInput) {\n // Normalize date_time_override to RFC3339 if present\n const body: any = { ...payload };\n if (typeof body.date_time_override === 'string' && body.date_time_override.trim() !== '') {\n const d = new Date(body.date_time_override);\n if (!isNaN(d.getTime())) {\n body.date_time_override = d.toISOString();\n }\n }\n return (await api.put(`/admin/match-overrides/${encodeURIComponent(externalMatchId)}`, body)).data;\n}\n\nexport async function patchMatchOverride(externalMatchId: string, payload: Partial<MatchOverrideInput>) {\n const body: any = { ...payload };\n if (typeof body.date_time_override === 'string' && body.date_time_override.trim() !== '') {\n const d = new Date(body.date_time_override);\n if (!isNaN(d.getTime())) {\n body.date_time_override = d.toISOString();\n }\n }\n try {\n return (await api.patch(`/admin/match-overrides/${encodeURIComponent(externalMatchId)}`, body)).data;\n } catch (err: any) {\n const status = err?.response?.status ?? err?.status;\n if (status === 404) {\n return putMatchOverride(externalMatchId, body);\n }\n throw err;\n }\n}\n\nexport async function putTeamLogoOverride(externalTeamId: string, teamName: string, logoUrl: string) {\n return (await api.put(`/admin/team-logo-overrides/${encodeURIComponent(externalTeamId)}`, { team_name: teamName, logo_url: logoUrl })).data;\n}\n\ninterface UploadLogoOptions {\n filename?: string;\n clubName?: string;\n clubType?: 'football' | 'futsal';\n}\n\n/**\n * Upload logo to logoapi.sportcreative.eu\n * This is the primary logo storage for the application\n */\nexport async function uploadToLogaSportcreative(\n clubId: string,\n logoFile: File | Blob,\n options: UploadLogoOptions = {}\n): Promise<{ success: boolean; url?: string; error?: string }> {\n try {\n const formData = new FormData();\n const filename = options.filename || (logoFile instanceof File ? logoFile.name : 'logo.png');\n \n // Required fields\n formData.append('file', logoFile, filename);\n formData.append('club_name', options.clubName || 'Neznámý klub');\n \n // Optional field - only club_type is needed\n if (options.clubType) {\n formData.append('club_type', options.clubType);\n }\n\n const response = await fetch(`https://logoapi.sportcreative.eu/logos/${clubId}`, {\n method: 'POST',\n body: formData,\n });\n\n const responseData = await response.json().catch(() => ({}));\n\n if (!response.ok) {\n return { \n success: false, \n error: responseData.error || `HTTP ${response.status}: ${response.statusText}`\n };\n }\n\n // Construct the logo URL from the response\n const logoUrl = responseData.logo_url || \n responseData.logo_url_svg || \n responseData.logo_url_png ||\n `https://logoapi.sportcreative.eu/logos/${clubId}/logo.svg`;\n\n return { \n success: true, \n url: logoUrl\n };\n } catch (error: any) {\n console.error('Error uploading logo:', error);\n return { \n success: false, \n error: error?.message || 'Nepodařilo se nahrát logo. Zkuste to prosím znovu.'\n };\n }\n}\n\n/**\n * Upload logo to sportlogos.tdvorak.dev external API\n * This runs in parallel with the local save to provide logo backup/sharing\n */\nexport async function uploadToSportLogosAPI(\n clubId: string,\n clubName: string,\n logoFile: File | Blob,\n options?: {\n club_type?: 'football' | 'futsal';\n club_website?: string;\n club_city?: string;\n }\n): Promise<{ success: boolean; error?: string }> {\n try {\n const formData = new FormData();\n formData.append('file', logoFile, logoFile instanceof File ? logoFile.name : 'logo.png');\n formData.append('club_name', clubName);\n \n if (options?.club_type) {\n formData.append('club_type', options.club_type);\n }\n if (options?.club_website) {\n formData.append('club_website', options.club_website);\n }\n if (options?.club_city) {\n formData.append('club_city', options.club_city);\n }\n\n const response = await fetch(`https://sportlogos.tdvorak.dev/logos/${clubId}`, {\n method: 'POST',\n body: formData,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return { \n success: false, \n error: (errorData as any)?.error || `HTTP ${response.status}: ${response.statusText}` \n };\n }\n\n const result = await response.json();\n return { success: true };\n } catch (error: any) {\n return { \n success: false, \n error: error?.message || 'Network error uploading to sportlogos.tdvorak.dev' \n };\n }\n}\n\n/**\n * Helper to fetch logo file from URL (for re-uploading already uploaded logos)\n */\nexport async function fetchLogoAsBlob(logoUrl: string): Promise<Blob | null> {\n try {\n // Resolve relative URLs against the API origin\n let fullUrl = logoUrl;\n if (logoUrl.startsWith('/')) {\n const apiOrigin = new URL(API_URL).origin;\n fullUrl = `${apiOrigin}${logoUrl}`;\n }\n\n const apiOrigin = new URL(API_URL).origin;\n let fetchUrl = fullUrl;\n try {\n const u = new URL(fullUrl);\n if (u.origin !== apiOrigin) {\n fetchUrl = `${apiOrigin}/api/v1/proxy/image?url=${encodeURIComponent(fullUrl)}`;\n }\n } catch {}\n\n const response = await fetch(fetchUrl);\n if (!response.ok) return null;\n \n return await response.blob();\n } catch (error) {\n console.error('Failed to fetch logo as blob:', error);\n return null;\n }\n}\n\n/**\n * Fetch logo metadata from logoapi.sportcreative.eu\n * Returns logo URL if available, null if not found\n */\nexport type SportLogoMetadata = {\n id: string;\n club_name: string;\n club_type?: string;\n club_website?: string;\n has_svg?: boolean;\n has_png?: boolean;\n primary_format?: string;\n logo_url?: string;\n logo_url_svg?: string;\n logo_url_png?: string;\n file_size_svg?: number;\n file_size_png?: number;\n created_at?: string;\n updated_at?: string;\n};\n\nexport async function fetchLogoFromSportLogosAPI(clubId: string): Promise<string | null> {\n try {\n const response = await fetch(`https://logoapi.sportcreative.eu/logos/${clubId}/json`, {\n method: 'GET',\n headers: {\n 'Accept': 'application/json',\n },\n });\n\n if (!response.ok) {\n return null; // Logo not found or error\n }\n\n const data: SportLogoMetadata = await response.json();\n \n // Prefer SVG, fallback to PNG, fallback to generic logo_url\n return data.logo_url_svg || data.logo_url_png || data.logo_url || null;\n } catch (error) {\n console.error('Failed to fetch logo from logoapi.sportcreative.eu:', error);\n return null;\n }\n}\n\n/**\n * Fetch logo with priority: logoapi.sportcreative.eu -> local overrides -> FACR original\n */\nexport async function fetchLogoWithFallback(\n clubId: string | null | undefined,\n teamName: string,\n facrLogoUrl?: string,\n localOverrides?: Record<string, string>\n): Promise<string> {\n const defaultLogo = '/dist/img/logo-club-empty.svg';\n \n // Try logoapi.sportcreative.eu first if we have a club ID\n if (clubId) {\n const sportLogo = await fetchLogoFromSportLogosAPI(clubId);\n if (sportLogo) {\n return sportLogo;\n }\n }\n \n // Try local overrides\n if (localOverrides && teamName) {\n const overrideLogo = localOverrides[teamName];\n if (overrideLogo) {\n return overrideLogo;\n }\n }\n \n // Fallback to FACR original\n if (facrLogoUrl) {\n return facrLogoUrl;\n }\n \n // Final fallback to default empty logo\n return defaultLogo;\n}\n\n/**\n * Batch fetch logos from sportlogos.tdvorak.dev for multiple teams\n * Returns a map of team_id -> logo URL\n * This is more efficient than fetching one by one\n */\nexport async function batchFetchLogosFromSportLogosAPI(\n clubIds: string[]\n): Promise<Record<string, string>> {\n const logoMap: Record<string, string> = {};\n \n // Fetch in parallel with a limit to avoid overwhelming the server\n const BATCH_SIZE = 10;\n for (let i = 0; i < clubIds.length; i += BATCH_SIZE) {\n const batch = clubIds.slice(i, i + BATCH_SIZE);\n const promises = batch.map(async (clubId) => {\n const logo = await fetchLogoFromSportLogosAPI(clubId);\n if (logo) {\n logoMap[clubId] = logo;\n }\n });\n await Promise.all(promises);\n }\n \n return logoMap;\n}\n\nexport async function uploadImage(file: File): Promise<{ url: string }> {\n const fd = new FormData();\n fd.append('file', file);\n const res = await api.post('/upload', fd, {\n headers: { 'Content-Type': 'multipart/form-data' },\n });\n const data = res.data;\n let url = data?.url || '';\n try {\n const parsed = new URL(url, window.location.origin);\n const appOrigin = window.location.origin;\n const apiOrigin = new URL(API_URL).origin;\n if (parsed.origin === appOrigin || parsed.origin === apiOrigin) {\n // store backend-relative path so DB records are consistent\n url = parsed.pathname + parsed.search + parsed.hash;\n }\n } catch (e) {\n // ignore and return whatever the backend provided\n }\n return { ...(data || {}), url };\n}\n\nexport type ClubSearchResult = { id: string; name: string; logo_url?: string };\nexport async function searchClubs(query: string): Promise<ClubSearchResult[]> {\n if (!query || query.trim().length < 2) return [];\n const res = await api.get(`/facr/club/search`, { params: { q: query } });\n const raw = res.data?.results ?? res.data ?? [];\n // Normalize backend payload (which uses club_id) to { id, name, logo_url }\n const mapped = Array.isArray(raw)\n ? raw.map((r: any) => ({\n id: r?.id ?? r?.club_id ?? r?.ClubID ?? '',\n name: r?.name ?? r?.Name ?? '',\n logo_url: r?.logo_url ?? r?.LogoURL ?? undefined,\n }))\n : [];\n return mapped.filter((x: ClubSearchResult) => x.id && x.name);\n}\n\n// Public team-logo overrides map to apply on cache-fed widgets/pages.\n// Shape: { by_name: { [teamName: string]: string /* logo URL */ } }\nexport type TeamLogoOverrides = { by_name?: Record<string, string> };\nexport async function fetchTeamLogoOverrides(): Promise<TeamLogoOverrides> {\n try {\n // Try public endpoint first (recommended for widgets)\n // Add cache-busting param to avoid 120s public cache when user just saved changes\n const res = await api.get('/public/team-logo-overrides', { params: { t: Date.now() } });\n return res.data ?? {};\n } catch {\n // Fallback: try admin (requires auth); if that fails, return empty\n try {\n const res2 = await api.get('/admin/team-logo-overrides', { params: { t: Date.now() } });\n const data = res2.data;\n // If admin returns an array of overrides, normalize to { by_name }\n if (Array.isArray(data)) {\n const byName: Record<string, string> = {};\n for (const it of data) {\n const name = it?.team_name || it?.TeamName;\n const logo = it?.logo_url || it?.LogoURL;\n if (name && logo) byName[String(name)] = String(logo);\n }\n return { by_name: byName };\n }\n // If already in desired shape, return as-is\n if (data && typeof data === 'object' && data.by_name) return data;\n return {};\n } catch {\n return {};\n }\n }\n}\n","import { API_URL } from '../api';\n\n// Resolve a backend-served static path (e.g. /cache/prefetch/*.json) against the API origin\nfunction resolveBackend(path: string): string {\n try {\n if (/^https?:\\/\\//i.test(path)) return path;\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n return new URL(path.startsWith('/') ? path : `/${path}`, origin).toString();\n } catch {\n return path;\n }\n}\n\nexport async function getFacrClubInfoCache(): Promise<any | null> {\n const url = resolveBackend('/cache/prefetch/facr_club_info.json');\n const res = await fetch(url, { cache: 'no-cache' });\n if (!res.ok) return null;\n return res.json();\n}\n\nexport async function getFacrTablesCache(): Promise<any | null> {\n const url = resolveBackend('/cache/prefetch/facr_tables.json');\n const res = await fetch(url, { cache: 'no-cache' });\n if (!res.ok) return null;\n return res.json();\n}\n","export type AdminAction =\n | { type: 'nav'; at: number; path: string }\n | { type: 'request'; at: number; method: string; url: string; status?: number; ms?: number; ok?: boolean };\n\nconst CAP = 200;\nlet buf: AdminAction[] = [];\n\nexport function logAction(a: AdminAction) {\n buf.push(a);\n if (buf.length > CAP) buf = buf.slice(buf.length - CAP);\n}\n\nexport function getRecentActions(limit = 12): AdminAction[] {\n const n = Math.max(1, Math.min(limit, CAP));\n return buf.slice(-n);\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport MainLayout from '../components/layout/MainLayout';\nimport { Box, Breadcrumb, BreadcrumbItem, BreadcrumbLink, Button, Container, Flex, Heading, Image, Link, Spinner, Stack, Text, useToast } from '@chakra-ui/react';\nimport { Link as RouterLink, useParams } from 'react-router-dom';\nimport { getPublicSettings } from '../services/settings';\nimport { assetUrl } from '../utils/url';\nimport { usePublicSettings } from '../hooks/usePublicSettings';\nimport { useQuery } from '@tanstack/react-query';\nimport { getCompetitionAliasesPublic } from '../services/competitionAliases';\nimport NewsletterCTA from '../components/common/NewsletterCTA';\nimport { API_URL } from '../services/api';\n\ninterface MatchItem {\n id: string | number;\n date: string;\n time: string;\n home: string;\n away: string;\n venue?: string;\n home_logo_url?: string;\n away_logo_url?: string;\n report_url?: string;\n facr_link?: string;\n score?: string;\n}\n\nconst resolveBackendUrl = (path: string) => {\n try {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (path.startsWith('/cache') || path.startsWith('/uploads') || path.startsWith('/api/')) {\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n return new URL(path, origin).toString();\n }\n return path;\n } catch {\n return path;\n }\n};\n\nconst MatchDetailPage: React.FC = () => {\n const { id } = useParams<{ id: string }>();\n const toast = useToast();\n const { data: settings } = usePublicSettings();\n const [loading, setLoading] = useState(true);\n const [match, setMatch] = useState<MatchItem | null>(null);\n const [competitionName, setCompetitionName] = useState<string>(\"\");\n const [competitionId, setCompetitionId] = useState<string>(\"\");\n const [competitionCode, setCompetitionCode] = useState<string>(\"\");\n const [prevMatch, setPrevMatch] = useState<MatchItem | null>(null);\n const [nextMatch, setNextMatch] = useState<MatchItem | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n if (!id) return;\n setLoading(true);\n try {\n // Try main prefetch file first\n const res = await fetch(resolveBackendUrl('/cache/prefetch/facr_club_info.json'), { cache: 'no-cache' });\n let found: MatchItem | null = null;\n let neighborSource: MatchItem[] = [];\n if (res.ok) {\n const json = await res.json();\n for (const c of (json?.competitions || [])) {\n const listForNeighbors: MatchItem[] = [];\n for (const m of (c?.matches || [])) {\n const mid = String(m.match_id || '');\n if (mid && mid === String(id)) {\n const dt: string = String(m.date_time || '');\n const [d, t] = dt.includes(' ') ? dt.split(' ') : [dt, ''];\n const [day, month, year] = d.split('.');\n const isoDate = (day && month && year) ? `${year}-${month.padStart(2,'0')}-${day.padStart(2,'0')}` : new Date().toISOString().slice(0,10);\n const time = (t || '00:00').slice(0,5);\n const score = (m.score || m.result || (typeof m.goals_home === 'number' && typeof m.goals_away === 'number' ? `${m.goals_home}:${m.goals_away}` : '') || '').toString();\n found = {\n id: mid,\n date: isoDate,\n time,\n home: m.home,\n away: m.away,\n venue: m.venue,\n home_logo_url: m.home_logo_url,\n away_logo_url: m.away_logo_url,\n report_url: m.report_url,\n facr_link: m.facr_link,\n score: score && /\\d+\\s*:\\s*\\d+/.test(score) ? score.replace(/\\s+/g,'') : undefined,\n };\n setCompetitionName(String(c?.name || c?.code || ''));\n if (c?.id != null) setCompetitionId(String(c.id));\n if (c?.code) setCompetitionCode(String(c.code));\n break;\n }\n // also push into neighbor list when iterating\n const dt2: string = String(m.date_time || '');\n const [d2, t2] = dt2.includes(' ') ? dt2.split(' ') : [dt2, ''];\n const [day2, month2, year2] = d2.split('.');\n const iso2 = (day2 && month2 && year2) ? `${year2}-${month2.padStart(2,'0')}-${day2.padStart(2,'0')}` : new Date().toISOString().slice(0,10);\n const tshort = (t2 || '00:00').slice(0,5);\n listForNeighbors.push({ id: m.match_id || '', date: iso2, time: tshort, home: m.home, away: m.away } as MatchItem);\n }\n if (found) break;\n neighborSource = listForNeighbors;\n }\n }\n // Fallback to club-specific info file\n if (!found && settings?.club_id) {\n const clubType = settings.club_type || 'football';\n const infoPath = `/cache/facr/${clubType}_${settings.club_id}_info.json`;\n const res2 = await fetch(resolveBackendUrl(infoPath), { cache: 'no-cache' });\n if (res2.ok) {\n const j2 = await res2.json();\n for (const c of (j2?.competitions || [])) {\n const listForNeighbors: MatchItem[] = [];\n for (const m of (c?.matches || [])) {\n const mid = String(m.match_id || '');\n if (mid && mid === String(id)) {\n const dt: string = String(m.date_time || '');\n const [d, t] = dt.includes(' ') ? dt.split(' ') : [dt, ''];\n const [day, month, year] = d.split('.');\n const isoDate = (day && month && year) ? `${year}-${month.padStart(2,'0')}-${day.padStart(2,'0')}` : new Date().toISOString().slice(0,10);\n const time = (t || '00:00').slice(0,5);\n const score = (m.score || m.result || (typeof m.goals_home === 'number' && typeof m.goals_away === 'number' ? `${m.goals_home}:${m.goals_away}` : '') || '').toString();\n found = {\n id: mid,\n date: isoDate,\n time,\n home: m.home,\n away: m.away,\n venue: m.venue,\n home_logo_url: m.home_logo_url,\n away_logo_url: m.away_logo_url,\n report_url: m.report_url,\n facr_link: m.facr_link,\n score: score && /\\d+\\s*:\\s*\\d+/.test(score) ? score.replace(/\\s+/g,'') : undefined,\n };\n setCompetitionName(String(c?.name || c?.code || ''));\n if (c?.id != null) setCompetitionId(String(c.id));\n if (c?.code) setCompetitionCode(String(c.code));\n break;\n }\n // collect neighbor list\n const dt2: string = String(m.date_time || '');\n const [d2, t2] = dt2.includes(' ') ? dt2.split(' ') : [dt2, ''];\n const [day2, month2, year2] = d2.split('.');\n const iso2 = (day2 && month2 && year2) ? `${year2}-${month2.padStart(2,'0')}-${day2.padStart(2,'0')}` : new Date().toISOString().slice(0,10);\n const tshort = (t2 || '00:00').slice(0,5);\n listForNeighbors.push({ id: m.match_id || '', date: iso2, time: tshort, home: m.home, away: m.away } as MatchItem);\n }\n if (found) break;\n neighborSource = listForNeighbors;\n }\n }\n }\n // compute neighbors\n if (found && neighborSource.length) {\n const sorted = neighborSource.sort((a, b) => new Date(`${a.date}T${a.time}:00`).getTime() - new Date(`${b.date}T${b.time}:00`).getTime());\n const idx = sorted.findIndex(x => String(x.id) === String(found!.id));\n setPrevMatch(idx > 0 ? sorted[idx - 1] : null);\n setNextMatch(idx >= 0 && idx < sorted.length - 1 ? sorted[idx + 1] : null);\n } else {\n setPrevMatch(null); setNextMatch(null);\n }\n if (!cancelled) setMatch(found);\n } catch (e: any) {\n if (!cancelled) toast({ title: 'Chyba', description: e?.message || 'Nelze načíst zápas', status: 'error' });\n } finally {\n if (!cancelled) setLoading(false);\n }\n })();\n return () => { cancelled = true; };\n }, [id, settings, toast]);\n\n const isPast = useMemo(() => {\n if (!match) return false;\n return new Date(`${match.date}T${(match.time||'00:00')}:00`).getTime() < Date.now();\n }, [match]);\n\n // Load aliases and resolve display name for competition\n const { data: aliases } = useQuery({\n queryKey: ['public-competition-aliases'],\n queryFn: getCompetitionAliasesPublic,\n });\n const compDisplay = useMemo(() => {\n if (!competitionCode) return competitionName;\n const hit = (aliases || []).find(a => a.code === competitionCode);\n return hit?.alias || competitionName;\n }, [aliases, competitionCode, competitionName]);\n\n return (\n <MainLayout>\n <Container maxW=\"3xl\" py={{ base: 6, md: 10 }}>\n <Breadcrumb fontSize=\"sm\" mb={4} separator=\"/\">\n <BreadcrumbItem>\n <BreadcrumbLink as={RouterLink} to=\"/\">Domů</BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbItem>\n <BreadcrumbLink as={RouterLink} to={competitionId ? `/kalendar?comp=${competitionId}` : \"/kalendar\"}>Kalendář</BreadcrumbLink>\n </BreadcrumbItem>\n {compDisplay && (\n <BreadcrumbItem>\n <BreadcrumbLink as={RouterLink} to={competitionId ? `/kalendar?comp=${competitionId}` : \"/kalendar\"}>{compDisplay}</BreadcrumbLink>\n </BreadcrumbItem>\n )}\n {match && (\n <BreadcrumbItem isCurrentPage>\n <BreadcrumbLink>{match.home} vs {match.away}</BreadcrumbLink>\n </BreadcrumbItem>\n )}\n </Breadcrumb>\n <Box mb={4}>\n <Button as={RouterLink} to={competitionId ? `/kalendar?comp=${competitionId}` : \"/kalendar\"} size=\"sm\" variant=\"outline\">Zpět na kalendář</Button>\n </Box>\n {loading && (\n <Flex align=\"center\" gap={3} color=\"gray.600\"><Spinner size=\"sm\" /> Načítám…</Flex>\n )}\n {!loading && !match && (\n <Box color=\"gray.600\">Zápas nebyl nalezen.</Box>\n )}\n {match && (\n <Stack spacing={5}>\n <Heading size=\"lg\">{match.home} vs {match.away}</Heading>\n <Flex align=\"center\" justify=\"center\" gap={4}>\n {match.home_logo_url && (\n <Image src={assetUrl(match.home_logo_url) || match.home_logo_url} alt={match.home} boxSize=\"56px\" borderRadius=\"full\" />\n )}\n <Text fontSize=\"2xl\" fontWeight=\"bold\">{isPast && match.score ? match.score : 'vs'}</Text>\n {match.away_logo_url && (\n <Image src={assetUrl(match.away_logo_url) || match.away_logo_url} alt={match.away} boxSize=\"56px\" borderRadius=\"full\" />\n )}\n </Flex>\n <Text textAlign=\"center\" color=\"gray.700\">{match.date} {match.time} {match.venue ? `• ${match.venue}` : ''}</Text>\n {(prevMatch || nextMatch) && (\n <Flex justify=\"space-between\" mt={2}>\n <Box>\n {prevMatch && (\n <Button as={RouterLink} to={`/zapas/${prevMatch.id}`} size=\"sm\" variant=\"ghost\">← {prevMatch.home} vs {prevMatch.away}</Button>\n )}\n </Box>\n <Box>\n {nextMatch && (\n <Button as={RouterLink} to={`/zapas/${nextMatch.id}`} size=\"sm\" variant=\"ghost\">{nextMatch.home} vs {nextMatch.away} →</Button>\n )}\n </Box>\n </Flex>\n )}\n {(match.facr_link || match.report_url) && (\n <Flex justify=\"center\" gap={3}>\n {match.facr_link && (\n <Button \n colorScheme=\"red\" \n variant=\"outline\"\n onClick={(e) => {\n e.preventDefault();\n // Open in background tab without switching focus\n const link = document.createElement('a');\n link.href = match.facr_link || '';\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }}\n >\n FAČR detail\n </Button>\n )}\n {match.report_url && (\n <Button \n variant=\"outline\"\n onClick={(e) => {\n e.preventDefault();\n // Open in background tab without switching focus\n const link = document.createElement('a');\n link.href = match.report_url || '';\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }}\n >\n Zápis\n </Button>\n )}\n </Flex>\n )}\n </Stack>\n )}\n </Container>\n \n {/* Newsletter CTA */}\n <NewsletterCTA />\n </MainLayout>\n );\n};\n\nexport default MatchDetailPage;\n","import i18n from 'i18next';\nimport { initReactI18next } from 'react-i18next';\n\n// Real translations for the football club website\nconst resources = {\n cs: {\n translation: {\n // Navigation\n nav: {\n home: \"Domů\",\n matches: \"Zápasy\",\n calendar: \"Kalendář\",\n tables: \"Tabulky\",\n players: \"Hráči\",\n gallery: \"Galerie\",\n videos: \"Videa\",\n articles: \"Články\",\n activities: \"Aktivity\",\n contact: \"Kontakt\",\n shop: \"E-shop\",\n sponsors: \"Sponzoři\",\n club: \"Klub\",\n news: \"Aktuality\",\n all_articles: \"Další články\",\n all_matches: \"Všechny zápasy\",\n all_tables: \"Zobrazit vše\",\n login: \"Přihlásit se\",\n register: \"Registrovat se\",\n admin: \"Administrace\",\n logout: \"Odhlásit\",\n view_all: \"Zobrazit vše\"\n },\n \n // Homepage sections\n homepage: {\n nearest_matches: \"Nejbližší zápasy\",\n latest_news: \"Aktuality\",\n latest_title: \"Nejnovější titulek\",\n more_articles_home: \"Další aktuality\",\n tables: \"Tabulky\",\n gallery: \"Photos\",\n sponsors: \"Partneři\",\n shop: \"Fanshop\",\n calendar: \"Kalendář\",\n activities: \"Aktivity\",\n videos: \"Videa\",\n club: \"Klub\",\n contact: \"Kontakt\",\n welcome_to_club: \"Vítejte v našem fotbalovém klubu\",\n official_website: \"Oficiální web klubu\",\n read_more: \"Číst více\",\n view_all: \"Zobrazit vše\",\n next_match: \"Příští zápas\",\n match_details: \"Detail zápasu\",\n competition: \"Soutěž\",\n venue: \"Místo konání\",\n result: \"Výsledek\",\n standings: \"Tabulka\",\n position: \"Poz.\",\n team: \"Tým\",\n points: \"Body\",\n played: \"Zápasy\",\n won: \"V\",\n drawn: \"R\",\n lost: \"P\",\n goals: \"Góly\",\n goal_difference: \"Rozdíl\",\n latest_results: \"Poslední výsledky\",\n upcoming_events: \"Nadcházející akce\",\n featured_articles: \"Doporučené články\",\n more_articles: \"Další články\",\n photo_gallery: \"Photos\",\n video_gallery: \"Video galerie\",\n our_partners: \"Naši partneři\",\n more_videos: \"Více videí\",\n all_matches: \"Všechny zápasy\",\n partner_categories: {\n general: \"Generální partner\",\n main: \"Hlavní partner\",\n official: \"Oficiální partner\",\n media: \"Mediální partner\",\n technical: \"Technický partner\",\n supplier: \"Dodavatel\"\n }\n },\n \n // News section\n news: {\n no_news: \"Zatím nejsou k dispozici žádné aktuality.\",\n view_all_news: \"Zobrazit všechny aktuality\"\n },\n \n // Common actions\n action: {\n save: \"Uložit\",\n edit: \"Upravit\",\n delete: \"Smazat\",\n add: \"Přidat\",\n create: \"Vytvořit\",\n update: \"Aktualizovat\",\n cancel: \"Zrušit\",\n confirm: \"Potvrdit\",\n close: \"Zavřít\",\n back: \"Zpět\",\n next: \"Další\",\n previous: \"Předchozí\",\n search: \"Hledat\",\n filter: \"Filtrovat\",\n sort: \"Seřadit\",\n loading: \"Načítám...\",\n error: \"Chyba\",\n success: \"Úspěch\",\n warning: \"Varování\",\n info: \"Informace\",\n view: \"Zobrazit\",\n download: \"Stáhnout\",\n upload: \"Nahrát\",\n share: \"Sdílet\",\n copy: \"Kopírovat\",\n send: \"Odeslat\",\n submit: \"Odeslat\",\n reset: \"Resetovat\",\n refresh: \"Obnovit\",\n open: \"Otevřít\",\n close_window: \"Zavřít okno\",\n continue: \"Pokračovat\",\n finish: \"Dokončit\",\n start: \"Začít\",\n stop: \"Zastavit\",\n pause: \"Pauza\",\n resume: \"Pokračovat\",\n select: \"Vybrat\",\n choose: \"Vybrat\",\n clear: \"Vymazat\",\n apply: \"Použít\",\n ok: \"OK\",\n yes: \"Ano\",\n no: \"Ne\",\n more: \"Další\",\n open_menu: \"Otevřít menu\",\n content_admin: \"Správa obsahu\",\n play: \"Přehrát\",\n open_on_youtube: \"Otevřít na YouTube\"\n },\n \n // Messages and notifications\n message: {\n loading: \"Načítám...\",\n saving: \"Ukládám...\",\n saved: \"Uloženo\",\n deleted: \"Smazáno\",\n updated: \"Aktualizováno\",\n created: \"Vytvořeno\",\n error_occurred: \"Došlo k chybě\",\n success_message: \"Operace proběhla úspěšně\",\n confirm_delete: \"Opravdu chcete smazat tuto položku?\",\n no_data_found: \"Žádná data nenalezena\",\n network_error: \"Chyba sítě\",\n server_error: \"Chyba serveru\",\n validation_error: \"Chyba validace\",\n permission_denied: \"Přístup zamítnut\",\n page_not_found: \"Stránka nenalezena\",\n session_expired: \"Relace vypršela\",\n login_required: \"Vyžadováno přihlášení\",\n invalid_credentials: \"Neplatné přihlašovací údaje\",\n email_sent: \"E-mail odeslán\",\n email_error: \"Chyba při odesílání e-mailu\",\n file_uploaded: \"Soubor nahrán\",\n file_error: \"Chyba při nahrávání souboru\",\n image_uploaded: \"Obrázek nahrán\",\n image_error: \"Chyba při nahrávání obrázku\"\n },\n \n // Footer\n footer: {\n articles: \"Články\",\n matches: \"Zápasy\",\n table: \"Tabulka\",\n sponsors: \"Sponzoři\",\n contact: \"Kontakt\",\n cookies: \"Cookies\",\n terms: \"Obchodní podmínky\",\n privacy: \"Zásady ochrany osobních údajů\",\n eshop: \"Eshop\",\n partners: \"Naši partneři\",\n follow_us: \"Sledujte nás\",\n copyright: \"© {year} {club}. Všechna práva vyhrazena.\",\n all_rights_reserved: \"Všechna práva vyhrazena {year}\",\n powered_by: \"Stránku provozuje MyClub\",\n powered_by_desc: \"Profesionální webové stránky pro sportovní kluby\",\n order_now: \"Objednat\",\n learn_more: \"Zjistit více\",\n quick_links: \"Rychlé odkazy\",\n contact_info: \"Kontaktní informace\",\n address: \"Adresa\",\n phone: \"Telefon\",\n email: \"E-mail\",\n opening_hours: \"Otevírací doba\"\n },\n \n // Search page\n search: {\n title: \"Vyhledávání\",\n description: \"Prohledávejte kluby, zápasy, články, hráče, akce a další obsah\",\n placeholder: \"Hledat...\",\n search_button: \"Vyhledat\",\n search_error: \"Chyba vyhledávání\",\n error_title: \"Chyba při vyhledávání\",\n no_results: \"Žádné výsledky\",\n no_results_desc: \"Pro dotaz \\\"{query}\\\" nebyly nalezeny žádné výsledky\",\n try_different: \"Zkuste jiné klíčové slovo nebo hledejte obecnější termín\",\n searching: \"Hledám...\",\n filters: \"Filtry\",\n results: \"výsledky\",\n search_hint: \"Zadejte klíčová slova pro vyhledávání\",\n loading: \"Vyhledávám...\",\n all: \"Vše\",\n clubs: \"Kluby\",\n matches: \"Zápasy\",\n articles: \"Články\",\n players: \"Hráči\",\n events: \"Akce\",\n others: \"Ostatní\",\n upcoming_matches: \"Nadcházející zápasy\",\n past_matches: \"Minulé zápasy\",\n show_all_clubs: \"Zobrazit všech {count} klubů\",\n show_all_players: \"Zobrazit všech {count} hráčů\",\n show_all_matches: \"Zobrazit všechny zápasy\",\n show_all_articles: \"Zobrazit všech {count} článků\",\n show_all_events: \"Zobrazit všechny akce\",\n no_clubs_found: \"Žádné kluby nenalezeny\",\n no_matches_found: \"Žádné zápasy nenalezeny\",\n no_articles_found: \"Žádné články nenalezeny\",\n no_players_found: \"Žádní hráči nenalezeni\",\n no_events_found: \"Žádné akce nenalezeny\",\n no_sponsors_found: \"Žádní sponzoři nenalezeni\",\n no_contacts_found: \"Žádné kontakty nenalezeny\",\n no_gallery_found: \"Žádná galerie nenalezena\",\n no_categories_found: \"Žádné kategorie nenalezeny\",\n teams: \"Týmy\",\n sponsors: \"Sponzoři\",\n contacts: \"Kontakty\",\n gallery: \"Galerie\",\n photos: \"fotek\",\n no_other_results: \"Žádné další výsledky\"\n },\n \n // Tables page\n tables: {\n select_club: \"Vyberte klub pro zobrazení tabulky soutěže.\",\n loading_table: \"Načítám tabulku...\",\n table_error: \"Chyba při načítání tabulky\",\n rank: \"#\",\n team: \"Tým\",\n played: \"Z\",\n wins: \"V\",\n draws: \"R\",\n losses: \"P\",\n score: \"Skóre\",\n points: \"Body\",\n position_place: \"{{position}}. místo\"\n },\n \n // Club modal\n club_modal: {\n statistics: \"Statistiky\",\n matches_played: \"Odehráno zápasů\",\n wins: \"Výhry\",\n draws: \"Remízy\",\n losses: \"Prohry\",\n score: \"Skóre\",\n goals_scored: \"Vstřelené góly\",\n goals_conceded: \"Obdržené góly\",\n goal_difference: \"Rozdíl skóre\",\n points: \"Body\",\n form_last_5: \"Forma (posledních 5 zápasů)\",\n close: \"Zavřít\"\n },\n \n // Calendar page\n calendar: {\n title: \"Kalendář\",\n subtitle: \"Přehled zápasů podle soutěží (FACR).\",\n loading: \"Načítám rozpis…\",\n no_matches: \"Zatím nemáme žádné zápasy k zobrazení.\",\n check_settings: \"Zkontrolujte nastavení klubu v administraci\",\n all_competitions: \"Všechny soutěže\",\n month_view: \"Měsíční pohled\",\n week_view: \"Týdenní pohled\",\n today: \"Dnes\",\n no_events: \"Žádné akce\",\n match: \"Zápas\",\n event: \"Akce\",\n training: \"Trénink\",\n competition: \"Soutěž\",\n venue: \"Místo konání\",\n result: \"Výsledek\",\n upcoming: \"Nadcházející\",\n past: \"Minulé\",\n activities_title: \"Aktivity\",\n activities_subtitle: \"Kalendář tréninků, schůzek a dalších klubových aktivit.\",\n all_types: \"Všechny typy\",\n no_activities: \"Zatím nemáme žádné aktivity k zobrazení.\",\n oldest_first: \"Nejstarší první\",\n list_view: \"Seznam\",\n calendar_view: \"Kalendář\",\n club: \"Klub\",\n matches_filter: \"Zápasy\",\n training_filter: \"Tréninky\", \n meeting_filter: \"Schůzky\",\n other_filter: \"Ostatní\",\n previous_month: \"Předchozí měsíc\",\n next_month: \"Další měsíc\",\n loading_activities: \"Načítám aktivity…\",\n match_type: \"Zápas\",\n training_type: \"Trénink\",\n meeting_type: \"Schůzka\",\n other_type: \"Jiné\",\n more_events: \"+{count} další…\",\n win: \"Výhra\",\n draw: \"Remíza\", \n loss: \"Prohra\",\n show_more: \"+{count} další…\",\n show_less: \"Zobrazit méně\",\n show_past_matches: \"Zobrazit předchozí zápasy ({count})\",\n hide_past_matches: \"Skrýt předchozí zápasy\"\n },\n \n // Players page\n players: {\n title: \"Hráči\",\n search_placeholder: \"Hledat jméno, číslo, pozici\",\n gender: \"Pohlaví\",\n position: \"Pozice\",\n active_only: \"Pouze aktivní\",\n male: \"Muž\",\n female: \"Žena\",\n loading_error: \"Chyba při načítání hráčů\"\n },\n \n // Blog page\n blog: {\n title: \"Blog\",\n search_articles: \"Hledat články…\",\n search_match: \"Hledat zápas…\",\n all_categories: \"Všechny kategorie\",\n loading: \"Načítání…\",\n category: \"Kategorie\",\n publish_date: \"Datum publikace\",\n read_time: \"Doba čtení\",\n search_results: \"Výsledky hledání článků pro „{query}“.\",\n category_articles: \"Články v kategorii {category}.\",\n latest_articles: \"Nejnovější články, rozhovory a novinky z klubu.\",\n match: \"Zápas\",\n subscribe: \"Přihlaste se k odběru novinek\",\n subscribe_description: \"Budeme vás informovat o novinkách, zápasech a akcích našeho klubu. Současně pro vás vytvoříme fanouškovský účet a pošleme heslo emailem.\",\n email_label: \"Váš e-mail\",\n consent_text: \"Odesláním formuláře souhlasíte se zpracováním osobních údajů. Z odběru se můžete kdykoli odhlásit a nastavení upravit v zaslaném emailu. Heslo lze změnit přes stránku pro obnovení hesla.\",\n subscribe_button: \"Odeslat\"\n },\n \n // Videos page\n videos: {\n title: \"Videa\",\n description: \"Sledujte naše nejnovější videa a zápasy.\",\n loading: \"Načítám videa...\",\n watch_latest: \"Sledujte naše nejnovější videa a zápasy\",\n all_from_youtube: \"Všechna videa jsou z YouTube\",\n no_videos: \"Zatím nejsou k dispozici žádná videa\",\n play: \"Přehrát\",\n youtube_channel: \"YouTube kanál\",\n open_on_youtube: \"Otevřít na YouTube\",\n more_videos: \"Více videí\"\n },\n \n // Sponsors page\n sponsors: {\n title: \"Naši partneři\",\n main_partners: \"Hlavní partneři\",\n partners: \"Partneři\",\n become_partner: \"Staňte se partnerem klubu\",\n partnership_description: \"Máte zájem o spolupráci, reklamu nebo podporu klubu? Napište nám pár informací a my se vám ozveme zpět.\",\n name_label: \"Jméno a příjmení *\",\n name_placeholder: \"Jan Novák\",\n name_required: \"Vyplňte prosím jméno\",\n email_label: \"Email *\",\n email_placeholder: \"vas@email.cz\",\n email_required: \"Vyplňte prosím email\",\n subject_label: \"Předmět *\",\n subject_placeholder: \"Partnerství, reklama, podpora...\",\n subject_required: \"Předmět je povinný\",\n message_label: \"Zpráva *\",\n message_placeholder: \"Stručně nám napište, o jakou spolupráci máte zájem...\",\n message_required: \"Napište prosím krátkou zprávu\",\n sending: \"Odesílám...\",\n send_message: \"Odeslat zprávu\",\n message_sent: \"Zpráva odeslána\",\n message_sent_desc: \"Děkujeme za zprávu.\",\n error_loading: \"Chyba při načítání sponzorů\",\n timeout_error: \"Vypršel časový limit požadavku. Zkuste to prosím znovu.\",\n network_error: \"Požadavek se nezdařil (síť/CORS). Obnovte stránku a zkuste znovu.\",\n send_error: \"Odeslání se nezdařilo\",\n error_title: \"Chyba\"\n },\n \n // Contact page\n contact: {\n title: \"Kontakt\",\n contact_info: \"Kontaktní údaje\",\n address: \"Adresa\",\n phone: \"Telefon\",\n email: \"Email\",\n contact_persons: \"Kontaktní osoby\",\n others: \"Ostatní\",\n no_contacts: \"Pro tuto kategorii zatím nemáme kontaktní osobu.\",\n contact_us: \"Kontaktujte nás\",\n contact_description: \"Máte dotaz nebo připomínku? Napište nám zprávu a my se vám ozveme co nejdříve zpět.\",\n name_label: \"Jméno a příjmení *\",\n name_placeholder: \"Jan Novák\",\n name_required: \"Toto pole je povinné\",\n name_min_length: \"Jméno musí mít alespoň 2 znaky\",\n email_label: \"E-mailová adresa *\",\n email_placeholder: \"vas@email.cz\",\n email_required: \"Toto pole je povinné\",\n email_invalid: \"Neplatná e-mailová adresa\",\n subject_label: \"Předmět\",\n subject_placeholder: \"Předmět zprávy\",\n subject_required: \"Předmět je povinný\",\n subject_max_length: \"Předmět může mít maximálně 100 znaků\",\n message_label: \"Zpráva *\",\n message_placeholder: \"Napište nám zprávu...\",\n message_required: \"Toto pole je povinné\",\n message_min_length: \"Zpráva musí mít alespoň 10 znaků\",\n message_max_length: \"Zpráva může mít maximálně 2000 znaků\",\n sending: \"Odesílám...\",\n send_message: \"Odeslat zprávu\",\n message_sent: \"Zpráva odeslána\",\n message_sent_desc: \"Děkujeme za vaši zprávu. Brzy se vám ozveme zpět.\",\n timeout_error: \"Vypršel časový limit požadavku. Zkuste to prosím znovu za chvíli.\",\n network_error: \"Požadavek se nezdařil (síť/CORS). Zkuste to znovu nebo obnovte stránku.\",\n general_error: \"Něco se pokazilo. Zkuste to prosím znovu později.\"\n },\n \n // Matches page\n matches: {\n title: \"Zápasy\",\n all_matches: \"Všechny zápasy\",\n upcoming_matches: \"Nadcházející zápasy\",\n past_matches: \"Minulé zápasy\",\n competition: \"Soutěž\",\n date: \"Datum\",\n time: \"Čas\",\n venue: \"Místo\",\n result: \"Výsledek\",\n score: \"Skóre\",\n report: \"Report\",\n details: \"Detaily\",\n no_matches: \"Žádné zápasy\",\n load_more: \"Načíst více\",\n show_all: \"Zobrazit vše\",\n home_team: \"Domácí\",\n away_team: \"Hosté\",\n versus: \"vs\",\n postponed: \"Přeloženo\",\n oldest_first: \"Nejstarší první\",\n newest_first: \"Nejnovější první\",\n no_matches_to_display: \"Žádné zápasy k zobrazení\",\n check_club_settings: \"Zkontrolujte nastavení klubu v administraci\",\n played: \"Odehráno\",\n upcoming: \"Nadcházející\",\n load_more_matches: \"Načíst další zápasy\",\n showing_matches: \"Zobrazeno {shown} z {total} zápasů\",\n win: \"Výhra\",\n draw: \"Remíza\",\n loss: \"Prohra\",\n all_categories: \"Všechny kategorie\",\n cancelled: \"Zrušeno\"\n },\n \n // Gallery page\n gallery: {\n no_albums: \"Zatím nejsou k dispozici žádná alba\",\n albums_will_appear: \"Alba se zde zobrazí po jejich načtení ze Zonerama.\",\n loading_albums: \"Načítám alba...\",\n error_loading_albums: \"Nepodařilo se načíst alba\",\n page_title: \"Photos\",\n page_description: \"Prohlédněte si alba a fotografie našeho klubu.\",\n photos_count: \"{{count}} fotografií\",\n photos_count_one: \"{{count}} fotografie\",\n photos_count_few: \"{{count}} fotografie\",\n photos_count_many: \"{{count}} fotografií\",\n photos_count_other: \"{{count}} fotografií\",\n views_count: \"{{count}} zhlédnutí\",\n views_count_one: \"{{count}} zhlédnutí\",\n views_count_few: \"{{count}} zhlédnutí\",\n views_count_many: \"{{count}} zhlédnutí\",\n views_count_other: \"{{count}} zhlédnutí\",\n show_more_on_zonerama: \"Zobrazit na Zonerama\",\n latest_albums: \"Nejnovější alba z našich akcí\",\n view_all_albums: \"Zobrazit všechna alba\",\n // Album detail page\n album_not_found: \"Album nenalezeno\",\n error_loading_album: \"Chyba při načítání alba\",\n back_to_gallery: \"Zpět na galerii\",\n loading_album: \"Načítám album...\",\n view_on_zonerama: \"Zobrazit na Zonerama\",\n photos_from_zonerama: \"📸 Všechny fotografie jsou z platformy Zonerama\",\n no_photos_in_album: \"V tomto albu nejsou žádné fotografie.\",\n // Photo modal\n view_original: \"Zobrazit originál\",\n photo_modal_title: \"Fotka\"\n },\n \n // Authentication\n auth: {\n login: \"Přihlásit se\",\n register: \"Registrovat se\",\n logout: \"Odhlásit\",\n forgot_password: \"Zapomněli jste heslo?\",\n reset_password: \"Obnovit heslo\",\n change_password: \"Změnit heslo\",\n profile: \"Profil\",\n account: \"Účet\",\n sign_in: \"Přihlásit se\",\n sign_up: \"Registrovat se\",\n sign_out: \"Odhlásit se\",\n email: \"E-mail\",\n password: \"Heslo\",\n confirm_password: \"Potvrdit heslo\",\n old_password: \"Staré heslo\",\n new_password: \"Nové heslo\",\n remember_me: \"Zapamatovat si mě\",\n already_have_account: \"Již máte účet?\",\n dont_have_account: \"Nemáte účet?\",\n create_account: \"Vytvořit účet\",\n login_required: \"Vyžadováno přihlášení\",\n invalid_credentials: \"Neplatné přihlašovací údaje\",\n session_expired: \"Relace vypršela\"\n },\n \n // Common words\n common: {\n welcome_message: \"Vítejte v našem fotbalovém klubu\",\n welcome_subtitle: \"Oficiální stránky fotbalového klubu\",\n club: \"Klub\",\n team: \"Tým\",\n player: \"Hráč\",\n players: \"Hráči\",\n coach: \"Trenér\",\n staff: \"Tým\",\n match: \"Zápas\",\n matches: \"Zápasy\",\n season: \"Sezóna\",\n competition: \"Soutěž\",\n league: \"Liga\",\n cup: \"Pohár\",\n tournament: \"Turnaj\",\n training: \"Trénink\",\n event: \"Akce\",\n events: \"Akce\",\n news: \"Aktuality\",\n article: \"Článek\",\n articles: \"Články\",\n gallery: \"Galerie\",\n photo: \"Fotka\",\n photos: \"Fotky\",\n video: \"Video\",\n videos: \"Videa\",\n sponsor: \"Sponzor\",\n sponsors: \"Sponzoři\",\n partner: \"Partner\",\n partners: \"Partneři\",\n fan: \"Fanoušek\",\n fans: \"Fanoušci\",\n member: \"Člen\",\n members: \"Členové\",\n contact: \"Kontakt\",\n address: \"Adresa\",\n phone: \"Telefon\",\n email: \"E-mail\",\n website: \"Webové stránky\",\n facebook: \"Facebook\",\n instagram: \"Instagram\",\n youtube: \"YouTube\",\n twitter: \"Twitter\",\n linkedin: \"LinkedIn\",\n date: \"Datum\",\n time: \"Čas\",\n place: \"Místo\",\n result: \"Výsledek\",\n score: \"Skóre\",\n goals: \"Góly\",\n points: \"Body\",\n position: \"Pozice\",\n rank: \"Pořadí\",\n table: \"Tabulka\",\n standings: \"Tabulka\",\n schedule: \"Program\",\n calendar: \"Kalendář\",\n archive: \"Archiv\",\n history: \"Historie\",\n statistics: \"Statistiky\",\n stats: \"Statistiky\",\n profile: \"Profil\",\n settings: \"Nastavení\",\n account: \"Účet\",\n user: \"Uživatel\",\n users: \"Uživatelé\",\n admin: \"Administrátor\",\n role: \"Role\",\n permission: \"Oprávnění\",\n login: \"Přihlášení\",\n logout: \"Odhlášení\",\n password: \"Heslo\",\n register: \"Registrace\",\n signup: \"Registrace\",\n signin: \"Přihlášení\",\n signout: \"Odhlášení\",\n forgot_password: \"Zapomněli jste heslo?\",\n reset_password: \"Obnovit heslo\",\n change_password: \"Změnit heslo\",\n old_password: \"Staré heslo\",\n new_password: \"Nové heslo\",\n confirm_password: \"Potvrdit heslo\",\n first_name: \"Jméno\",\n last_name: \"Příjmení\",\n full_name: \"Celé jméno\",\n name: \"Název\",\n title: \"Název\",\n description: \"Popis\",\n content: \"Obsah\",\n category: \"Kategorie\",\n categories: \"Kategorie\",\n tag: \"Štítek\",\n tags: \"Štítky\",\n image: \"Obrázek\",\n images: \"Obrázky\",\n file: \"Soubor\",\n files: \"Soubory\",\n link: \"Odkaz\",\n url: \"URL\",\n read_time: \"min čtení\",\n price: \"Cena\",\n cost: \"Cena\",\n amount: \"Částka\",\n quantity: \"Množství\",\n size: \"Velikost\",\n weight: \"Váha\",\n color: \"Barva\",\n colors: \"Barvy\",\n type: \"Typ\",\n types: \"Typy\",\n status: \"Stav\",\n active: \"Aktivní\",\n inactive: \"Neaktivní\",\n enabled: \"Povoleno\",\n disabled: \"Zakázáno\",\n visible: \"Viditelný\",\n hidden: \"Skrytý\",\n public: \"Veřejný\",\n private: \"Soukromý\",\n published: \"Publikováno\",\n draft: \"Koncept\",\n featured: \"Doporučené\",\n new: \"Nové\",\n old: \"Staré\",\n latest: \"Nejnovější\",\n popular: \"Populární\",\n recommended: \"Doporučené\",\n all: \"Vše\",\n none: \"Žádný\",\n other: \"Ostatní\",\n more: \"Více\",\n less: \"Méně\",\n show: \"Zobrazit\",\n hide: \"Skrýt\",\n expand: \"Rozbalit\",\n collapse: \"Sbalit\",\n search: \"Hledat\",\n filter: \"Filtr\",\n sort: \"Seřadit\",\n order: \"Pořadí\",\n ascending: \"Vzestupně\",\n descending: \"Sestupně\",\n first: \"První\",\n last: \"Poslední\",\n next: \"Další\",\n previous: \"Předchozí\",\n page: \"Stránka\",\n pages: \"Stránky\",\n total: \"Celkem\",\n count: \"Počet\",\n number: \"Číslo\",\n index: \"Index\",\n id: \"ID\",\n code: \"Kód\",\n key: \"Klíč\",\n value: \"Hodnota\",\n data: \"Data\",\n info: \"Informace\",\n details: \"Detaily\",\n summary: \"Shrnutí\",\n overview: \"Přehled\",\n list: \"Seznam\",\n grid: \"Mřížka\",\n graph: \"Graf\",\n map: \"Mapa\",\n location: \"Lokace\",\n country: \"Země\",\n region: \"Region\",\n district: \"Okres\",\n zip: \"PSČ\",\n street: \"Ulice\",\n building: \"Budova\",\n floor: \"Patro\",\n room: \"Místnost\",\n stadium: \"Stadion\",\n field: \"Hřiště\",\n pitch: \"Hřiště\",\n locker_room: \"Šatna\",\n office: \"Kancelář\",\n shop: \"Obchod\",\n store: \"Obchod\",\n restaurant: \"Restaurace\",\n cafe: \"Kavárna\",\n parking: \"Parkoviště\",\n entrance: \"Vchod\",\n exit: \"Východ\",\n emergency_exit: \"Nouzový východ\",\n toilet: \"Toaleta\",\n wc: \"WC\",\n men: \"Muži\",\n women: \"Ženy\",\n accessible: \"Bezbariérový\",\n wheelchair: \"Invalidní vozík\",\n elevator: \"Výtah\",\n stairs: \"Schody\",\n ramp: \"Rampa\",\n door: \"Dveře\",\n window: \"Okno\",\n roof: \"Střecha\",\n wall: \"Zeď\",\n floor_surface: \"Podlaha\",\n ceiling: \"Strop\",\n lighting: \"Osvětlení\",\n heating: \"Topení\",\n cooling: \"Chlazení\",\n ventilation: \"Větrání\",\n security: \"Bezpečnost\",\n safety: \"Bezpečnost\",\n fire_safety: \"Požární bezpečnost\",\n first_aid: \"První pomoc\",\n emergency: \"Nouzové\",\n warning: \"Varování\",\n danger: \"Nebezpečí\",\n caution: \"Opatrně\",\n notice: \"Oznámení\",\n information: \"Informace\",\n help: \"Pomoc\",\n support: \"Podpora\",\n tiktok: \"TikTok\",\n snapchat: \"Snapchat\",\n pinterest: \"Pinterest\",\n reddit: \"Reddit\",\n whatsapp: \"WhatsApp\",\n telegram: \"Telegram\",\n signal: \"Signal\",\n viber: \"Viber\",\n messenger: \"Messenger\",\n skype: \"Skype\",\n zoom: \"Zoom\",\n teams: \"Teams\",\n slack: \"Slack\",\n discord: \"Discord\",\n github: \"GitHub\",\n gitlab: \"GitLab\",\n bitbucket: \"Bitbucket\",\n language: \"Jazyk\",\n my_account: \"Můj účet\"\n },\n \n // Engagement system\n engagement: {\n level: \"Úroveň\",\n points: \"bodů\",\n progress: \"Progres\",\n achievements: \"Úspěchy\",\n rewards: \"Odměny\"\n },\n \n // Newsletter\n newsletter: {\n email_preferences: \"E-mailové preference\",\n subscribe: \"Přihlaste se k odběru novinek\",\n subscribe_description: \"Budeme vás informovat o novinkách, zápasech a akcích našeho klubu. Současně pro vás vytvoříme fanouškovský účet a pošleme heslo emailem.\",\n email_label: \"Váš e-mail\",\n consent_text: \"Odesláním formuláře souhlasíte se zpracováním osobních údajů. Z odběru se můžete kdykoli odhlásit a nastavení upravit v zaslaném emailu. Heslo lze změnit přes stránku pro obnovení hesla.\",\n subscribe_button: \"Odeslat\",\n subscribe_success: \"Přihlášení k odběru proběhlo úspěšně\",\n subscribe_success_desc: \"Vytvořili jsme vám fanouškovský účet a poslali email s heslem a odkazy pro správu newsletteru.\",\n subscribe_error: \"Chyba\",\n subscribe_error_desc: \"Nastala chyba při přihlašování k odběru\",\n email_required: \"E-mail je povinný\",\n email_invalid: \"Neplatná e-mailová adresa\",\n loading: \"Odesílám...\"\n },\n \n // Admin\n admin: {\n page_settings: \"Nastavení stránky\"\n },\n \n // About page\n about: {\n page_not_setup: \"Tato stránka ještě není nastavena. Zde je přehled klubu, soutěží a rubrik.\",\n matches_by_competition: \"Zápasy podle soutěží\",\n club_info: \"Oficiální informace o klubu\",\n meta_description: \"Informace o našem klubu, soutěžích, nadcházejících zápasech a rubrikách.\"\n }\n }\n },\n en: {\n translation: {\n // Navigation\n nav: {\n home: \"Home\",\n matches: \"Matches\",\n calendar: \"Calendar\",\n tables: \"Tables\",\n players: \"Players\",\n gallery: \"Photo Gallery\",\n videos: \"Videos\",\n articles: \"Articles\",\n activities: \"Activities\",\n contact: \"Contact\",\n shop: \"E-shop\",\n sponsors: \"Sponsors\",\n club: \"Club\",\n news: \"News\",\n all_articles: \"More articles\",\n all_matches: \"All matches\",\n all_tables: \"View all\",\n login: \"Login\",\n register: \"Register\",\n admin: \"Admin\",\n logout: \"Logout\",\n view_all: \"View all\"\n },\n \n // Homepage sections\n homepage: {\n nearest_matches: \"Next matches\",\n latest_news: \"Latest news\",\n latest_title: \"Latest title\",\n more_articles_home: \"More articles\",\n tables: \"Tables\",\n gallery: \"Photo gallery\",\n sponsors: \"Partners\",\n shop: \"Fanshop\",\n calendar: \"Calendar\",\n activities: \"Activities\",\n videos: \"Videos\",\n club: \"Club\",\n contact: \"Contact\",\n welcome_to_club: \"Welcome to our football club\",\n official_website: \"Official club website\",\n read_more: \"Read more\",\n view_all: \"View all\",\n next_match: \"Next match\",\n match_details: \"Match details\",\n competition: \"Competition\",\n venue: \"Venue\",\n result: \"Result\",\n standings: \"Standings\",\n position: \"Pos.\",\n team: \"Team\",\n points: \"Points\",\n played: \"Played\",\n won: \"W\",\n drawn: \"D\",\n lost: \"L\",\n goals: \"Goals\",\n goal_difference: \"Diff\",\n latest_results: \"Latest results\",\n upcoming_events: \"Upcoming events\",\n featured_articles: \"Featured articles\",\n more_articles: \"More articles\",\n photo_gallery: \"Photo gallery\",\n video_gallery: \"Video gallery\",\n our_partners: \"Our partners\",\n more_videos: \"More videos\",\n all_matches: \"All matches\",\n partner_categories: {\n general: \"General partner\",\n main: \"Main partner\",\n official: \"Official partner\",\n media: \"Media partner\",\n technical: \"Technical partner\",\n supplier: \"Supplier\"\n }\n },\n \n // News section\n news: {\n no_news: \"No news available yet.\",\n view_all_news: \"View all articles\"\n },\n \n // Common actions\n action: {\n save: \"Save\",\n edit: \"Edit\",\n delete: \"Delete\",\n add: \"Add\",\n create: \"Create\",\n update: \"Update\",\n cancel: \"Cancel\",\n confirm: \"Confirm\",\n close: \"Close\",\n back: \"Back\",\n next: \"Next\",\n previous: \"Previous\",\n search: \"Search\",\n filter: \"Filter\",\n sort: \"Sort\",\n loading: \"Loading...\",\n error: \"Error\",\n success: \"Success\",\n warning: \"Warning\",\n info: \"Info\",\n view: \"View\",\n download: \"Download\",\n upload: \"Upload\",\n share: \"Share\",\n copy: \"Copy\",\n send: \"Send\",\n submit: \"Submit\",\n reset: \"Reset\",\n refresh: \"Refresh\",\n open: \"Open\",\n close_window: \"Close window\",\n continue: \"Continue\",\n finish: \"Finish\",\n start: \"Start\",\n stop: \"Stop\",\n pause: \"Pause\",\n resume: \"Resume\",\n select: \"Select\",\n choose: \"Choose\",\n clear: \"Clear\",\n apply: \"Apply\",\n ok: \"OK\",\n yes: \"Yes\",\n no: \"No\",\n more: \"More\",\n open_menu: \"Open menu\",\n content_admin: \"Content Admin\",\n play: \"Play\",\n open_on_youtube: \"Open on YouTube\"\n },\n \n // Messages and notifications\n message: {\n loading: \"Loading...\",\n saving: \"Saving...\",\n saved: \"Saved\",\n deleted: \"Deleted\",\n updated: \"Updated\",\n created: \"Created\",\n error_occurred: \"An error occurred\",\n success_message: \"Operation completed successfully\",\n confirm_delete: \"Are you sure you want to delete this item?\",\n no_data_found: \"No data found\",\n network_error: \"Network error\",\n server_error: \"Server error\",\n validation_error: \"Validation error\",\n permission_denied: \"Access denied\",\n page_not_found: \"Page not found\",\n session_expired: \"Session expired\",\n login_required: \"Login required\",\n invalid_credentials: \"Invalid credentials\",\n email_sent: \"Email sent\",\n email_error: \"Error sending email\",\n file_uploaded: \"File uploaded\",\n file_error: \"Error uploading file\",\n image_uploaded: \"Image uploaded\",\n image_error: \"Error uploading image\"\n },\n \n // Footer\n footer: {\n articles: \"Articles\",\n matches: \"Matches\",\n table: \"Table\",\n sponsors: \"Sponsors\",\n contact: \"Contact\",\n cookies: \"Cookies\",\n terms: \"Terms of Service\",\n privacy: \"Privacy Policy\",\n eshop: \"Eshop\",\n partners: \"Our Partners\",\n follow_us: \"Follow Us\",\n copyright: \"© {year} {club}. All rights reserved.\",\n all_rights_reserved: \"All rights reserved {year}\",\n powered_by: \"Powered by MyClub\",\n powered_by_desc: \"Professional websites for sports clubs\",\n order_now: \"Order Now\",\n learn_more: \"Learn More\",\n quick_links: \"Quick Links\",\n contact_info: \"Contact Information\",\n address: \"Address\",\n phone: \"Phone\",\n email: \"Email\",\n opening_hours: \"Opening Hours\"\n },\n \n // Search page\n search: {\n title: \"Search\",\n description: \"Search clubs, matches, articles, players, events and more content\",\n placeholder: \"Search clubs, matches, articles, players, events...\",\n search_button: \"Search\",\n search_error: \"Search error\",\n error_title: \"Search error\",\n no_results: \"No results\",\n no_results_desc: \"No results found for query \\\"{query}\\\"\",\n try_different: \"Try different keywords or search for more general terms\",\n search_hint: \"Enter keywords to search\",\n loading: \"Searching...\",\n all: \"All\",\n clubs: \"Clubs\",\n matches: \"Matches\",\n articles: \"Articles\",\n players: \"Players\",\n events: \"Events\",\n others: \"Others\",\n upcoming_matches: \"Upcoming Matches\",\n past_matches: \"Past Matches\",\n show_all_clubs: \"Show all {count} clubs\",\n show_all_players: \"Show all {count} players\",\n show_all_matches: \"Show all matches\",\n show_all_articles: \"Show all {count} articles\",\n show_all_events: \"Show all events\",\n no_clubs_found: \"No clubs found\",\n no_matches_found: \"No matches found\",\n no_articles_found: \"No articles found\",\n no_players_found: \"No players found\",\n no_events_found: \"No events found\",\n no_sponsors_found: \"No sponsors found\",\n no_contacts_found: \"No contacts found\",\n no_gallery_found: \"No gallery found\",\n no_categories_found: \"No categories found\",\n teams: \"Teams\",\n sponsors: \"Sponsors\",\n contacts: \"Contacts\",\n gallery: \"Gallery\",\n photos: \"photos\",\n no_other_results: \"No other results\"\n },\n \n // Tables page\n tables: {\n title: \"Tables\",\n subtitle: \"Official FACR tables by competition.\",\n loading: \"Loading tables…\",\n no_tables: \"No tables available for this club.\",\n schedule_link: \"Schedule and competition details\",\n rank: \"#\",\n team: \"Team\",\n played: \"P\",\n wins: \"W\",\n draws: \"D\",\n losses: \"L\",\n score: \"Score\",\n points: \"Points\",\n position_place: \"{{position}}. place\",\n select_club: \"Select a club to view competition table.\",\n loading_table: \"Loading table...\",\n table_error: \"Error loading table\"\n },\n \n // Club modal\n club_modal: {\n statistics: \"Statistics\",\n matches_played: \"Matches Played\",\n wins: \"Wins\",\n draws: \"Draws\",\n losses: \"Losses\",\n score: \"Score\",\n goals_scored: \"Goals Scored\",\n goals_conceded: \"Goals Conceded\",\n goal_difference: \"Goal Difference\",\n points: \"Points\",\n form_last_5: \"Form (Last 5 Matches)\",\n close: \"Close\"\n },\n \n // Calendar page\n calendar: {\n title: \"Calendar\",\n subtitle: \"Overview of matches by competition (FACR).\",\n loading: \"Loading schedule...\",\n no_matches: \"No matches to display yet.\",\n check_settings: \"Check club settings in administration\",\n all_competitions: \"All Matches\",\n month_view: \"Month View\",\n week_view: \"Week View\",\n today: \"Today\",\n no_events: \"No Events\",\n match: \"Match\",\n event: \"Event\",\n training: \"Training\",\n competition: \"Competition\",\n venue: \"Venue\",\n result: \"Result\",\n upcoming: \"Upcoming\",\n past: \"Past\",\n activities_title: \"Activities\",\n activities_subtitle: \"Training calendar, meetings and other club activities.\",\n all_types: \"All Types\",\n no_activities: \"No activities to display yet.\",\n oldest_first: \"Oldest First\",\n list_view: \"List\",\n calendar_view: \"Calendar\",\n club: \"Club\",\n matches_filter: \"Matches\",\n training_filter: \"Training\", \n meeting_filter: \"Meetings\",\n other_filter: \"Other\",\n previous_month: \"Previous Month\",\n next_month: \"Next Month\",\n loading_activities: \"Loading activities…\",\n match_type: \"Match\",\n training_type: \"Training\",\n meeting_type: \"Meeting\",\n other_type: \"Other\",\n more_events: \"+{count} more…\",\n win: \"Win\",\n draw: \"Draw\", \n loss: \"Loss\",\n show_more: \"+{count} more…\",\n show_less: \"Show Less\",\n show_past_matches: \"Show Past Matches ({count})\",\n hide_past_matches: \"Hide Past Matches\",\n },\n \n // Players page\n players: {\n title: \"Players\",\n search_placeholder: \"Search name, number, position\",\n gender: \"Gender\",\n position: \"Position\",\n active_only: \"Active only\",\n male: \"Male\",\n female: \"Female\",\n loading_error: \"Error loading players\"\n },\n \n // Blog page\n blog: {\n title: \"Blog\",\n search_articles: \"Search articles…\",\n search_match: \"Search match…\",\n all_categories: \"All Categories\",\n loading: \"Loading…\",\n category: \"Category\",\n publish_date: \"Publish Date\",\n read_time: \"Read Time\",\n search_results: \"Search results for articles „{query}“.\",\n category_articles: \"Articles in category {category}.\",\n latest_articles: \"Latest articles, reviews and news from the club.\",\n match: \"Match\",\n subscribe: \"Subscribe to newsletter\",\n subscribe_description: \"We will inform you about news, matches and events of our club. We will also create a fan account for you and send a password by email.\",\n email_label: \"Your email\",\n consent_text: \"By submitting the form you agree to the processing of personal data. You can unsubscribe at any time and adjust the settings in the sent email. Password can be changed via the password recovery page.\",\n subscribe_button: \"Subscribe\"\n },\n \n // Videos page\n videos: {\n title: \"Videos\",\n description: \"Watch our latest videos and matches.\",\n loading: \"Loading videos...\",\n watch_latest: \"Watch our latest videos and matches\",\n all_from_youtube: \"All videos are from YouTube\",\n no_videos: \"No videos available yet\",\n play: \"Play\",\n youtube_channel: \"YouTube Channel\",\n open_on_youtube: \"Open on YouTube\",\n more_videos: \"More videos\"\n },\n \n // Sponsors page\n sponsors: {\n title: \"Our Partners\",\n main_partners: \"Main Partners\",\n partners: \"Partners\",\n become_partner: \"Become a Club Partner\",\n partnership_description: \"Interested in cooperation, advertising or club support? Write us some information and we'll get back to you.\",\n name_label: \"Name and Surname *\",\n name_placeholder: \"John Doe\",\n name_required: \"Please fill in your name\",\n email_label: \"Email *\",\n email_placeholder: \"your@email.com\",\n email_required: \"Please fill in your email\",\n subject_label: \"Subject *\",\n subject_placeholder: \"Partnership, advertising, support...\",\n subject_required: \"Subject is required\",\n message_label: \"Message *\",\n message_placeholder: \"Briefly write us what kind of cooperation you're interested in...\",\n message_required: \"Please write a short message\",\n sending: \"Sending...\",\n send_message: \"Send Message\",\n message_sent: \"Message Sent\",\n message_sent_desc: \"Thank you for your message.\",\n error_loading: \"Error loading sponsors\",\n timeout_error: \"Request timed out. Please try again.\",\n network_error: \"Request failed (network/CORS). Refresh page and try again.\",\n send_error: \"Sending failed\",\n error_title: \"Error\"\n },\n \n // Contact page\n contact: {\n title: \"Contact\",\n contact_info: \"Contact Information\",\n address: \"Address\",\n phone: \"Phone\",\n email: \"Email\",\n contact_persons: \"Contact Persons\",\n others: \"Others\",\n no_contacts: \"No contact person for this category yet.\",\n contact_us: \"Contact Us\",\n contact_description: \"Have a question or comment? Write us a message and we'll get back to you as soon as possible.\",\n name_label: \"Name and Surname *\",\n name_placeholder: \"John Doe\",\n name_required: \"This field is required\",\n name_min_length: \"Name must be at least 2 characters\",\n email_label: \"Email Address *\",\n email_placeholder: \"your@email.com\",\n email_required: \"This field is required\",\n email_invalid: \"Invalid email address\",\n subject_label: \"Subject\",\n subject_placeholder: \"Message subject\",\n subject_required: \"Subject is required\",\n subject_max_length: \"Subject can be maximum 100 characters\",\n message_label: \"Message *\",\n message_placeholder: \"Write us a message...\",\n message_required: \"This field is required\",\n message_min_length: \"Message must be at least 10 characters\",\n message_max_length: \"Message can be maximum 2000 characters\",\n sending: \"Sending...\",\n send_message: \"Send Message\",\n message_sent: \"Message Sent\",\n message_sent_desc: \"Thank you for your message. We'll get back to you soon.\",\n timeout_error: \"Request timed out. Please try again in a moment.\",\n network_error: \"Request failed (network/CORS). Try again or refresh page.\",\n general_error: \"Something went wrong. Please try again later.\"\n },\n \n // Matches page\n matches: {\n title: \"Matches\",\n all_matches: \"All Matches\",\n upcoming_matches: \"Upcoming Matches\",\n past_matches: \"Past Matches\",\n competition: \"Competition\",\n date: \"Date\",\n time: \"Time\",\n venue: \"Venue\",\n result: \"Result\",\n score: \"Score\",\n report: \"Report\",\n details: \"Details\",\n no_matches: \"No Matches\",\n load_more: \"Load More\",\n show_all: \"Show All\",\n home_team: \"Home\",\n away_team: \"Away\",\n versus: \"vs\",\n postponed: \"Postponed\",\n oldest_first: \"Oldest First\",\n newest_first: \"Newest First\",\n no_matches_to_display: \"No matches to display\",\n check_club_settings: \"Check club settings in administration\",\n played: \"Played\",\n upcoming: \"Upcoming\",\n load_more_matches: \"Load more matches\",\n showing_matches: \"Showing {shown} of {total} matches\",\n win: \"Win\",\n draw: \"Draw\",\n loss: \"Loss\",\n all_categories: \"All Categories\",\n cancelled: \"Cancelled\"\n },\n \n // Gallery page\n gallery: {\n no_albums: \"No albums available yet\",\n albums_will_appear: \"Albums will appear here after loading from Zonerama.\",\n loading_albums: \"Loading albums...\",\n error_loading_albums: \"Failed to load albums\",\n page_title: \"Photo Gallery\",\n page_description: \"Browse albums and photos of our club.\",\n photos_count: \"{{count}} photos\",\n photos_count_one: \"{{count}} photo\",\n photos_count_few: \"{{count}} photos\",\n photos_count_many: \"{{count}} photos\",\n photos_count_other: \"{{count}} photos\",\n views_count: \"{{count}} views\",\n views_count_one: \"{{count}} view\",\n views_count_few: \"{{count}} views\",\n views_count_many: \"{{count}} views\",\n views_count_other: \"{{count}} views\",\n show_more_on_zonerama: \"Show more on Zonerama\",\n latest_albums: \"Latest albums from our events\",\n view_all_albums: \"View all albums\",\n // Album detail page\n album_not_found: \"Album not found\",\n error_loading_album: \"Error loading album\",\n back_to_gallery: \"Back to gallery\",\n loading_album: \"Loading album...\",\n view_on_zonerama: \"View on Zonerama\",\n photos_from_zonerama: \"📸 All photos are from Zonerama platform\",\n no_photos_in_album: \"There are no photos in this album.\",\n // Photo modal\n view_original: \"View original\",\n photo_modal_title: \"Photo\"\n },\n \n // Authentication\n auth: {\n login: \"Login\",\n register: \"Register\",\n logout: \"Logout\",\n forgot_password: \"Forgot Password?\",\n reset_password: \"Reset Password\",\n change_password: \"Change Password\",\n profile: \"Profile\",\n account: \"Account\",\n sign_in: \"Sign In\",\n sign_up: \"Sign Up\",\n sign_out: \"Sign Out\",\n email: \"Email\",\n password: \"Password\",\n confirm_password: \"Confirm Password\",\n old_password: \"Old Password\",\n new_password: \"New Password\",\n remember_me: \"Remember Me\",\n already_have_account: \"Already have an account?\",\n dont_have_account: \"Don't have an account?\",\n create_account: \"Create Account\",\n login_required: \"Login Required\",\n invalid_credentials: \"Invalid Credentials\",\n session_expired: \"Session Expired\"\n },\n \n // Common words\n common: {\n welcome_message: \"Welcome to our football club\",\n welcome_subtitle: \"Official website of the football club\",\n club: \"Club\",\n team: \"Team\",\n player: \"Player\",\n players: \"Players\",\n coach: \"Coach\",\n staff: \"Staff\",\n match: \"Match\",\n matches: \"Matches\",\n season: \"Season\",\n competition: \"Competition\",\n league: \"League\",\n cup: \"Cup\",\n tournament: \"Tournament\",\n training: \"Training\",\n event: \"Event\",\n events: \"Events\",\n news: \"News\",\n article: \"Article\",\n articles: \"Articles\",\n gallery: \"Gallery\",\n photo: \"Photo\",\n photos: \"Photos\",\n video: \"Video\",\n videos: \"Videos\",\n sponsor: \"Sponsor\",\n sponsors: \"Sponsors\",\n partner: \"Partner\",\n partners: \"Partners\",\n fan: \"Fan\",\n fans: \"Fans\",\n member: \"Member\",\n members: \"Members\",\n contact: \"Contact\",\n address: \"Address\",\n phone: \"Phone\",\n email: \"Email\",\n website: \"Website\",\n facebook: \"Facebook\",\n instagram: \"Instagram\",\n youtube: \"YouTube\",\n twitter: \"Twitter\",\n linkedin: \"LinkedIn\",\n date: \"Date\",\n time: \"Time\",\n place: \"Place\",\n result: \"Result\",\n score: \"Score\",\n goals: \"Goals\",\n points: \"Points\",\n position: \"Position\",\n rank: \"Rank\",\n table: \"Table\",\n standings: \"Standings\",\n schedule: \"Schedule\",\n calendar: \"Calendar\",\n archive: \"Archive\",\n history: \"History\",\n statistics: \"Statistics\",\n stats: \"Stats\",\n profile: \"Profile\",\n settings: \"Settings\",\n account: \"Account\",\n user: \"User\",\n users: \"Users\",\n admin: \"Admin\",\n role: \"Role\",\n permission: \"Permission\",\n login: \"Login\",\n logout: \"Logout\",\n password: \"Password\",\n register: \"Register\",\n signup: \"Sign up\",\n signin: \"Sign in\",\n signout: \"Sign out\",\n forgot_password: \"Forgot password?\",\n reset_password: \"Reset password\",\n change_password: \"Change password\",\n old_password: \"Old password\",\n new_password: \"New password\",\n confirm_password: \"Confirm password\",\n first_name: \"First name\",\n last_name: \"Last name\",\n full_name: \"Full name\",\n name: \"Name\",\n title: \"Title\",\n description: \"Description\",\n content: \"Content\",\n category: \"Category\",\n categories: \"Categories\",\n tag: \"Tag\",\n tags: \"Tags\",\n image: \"Image\",\n images: \"Images\",\n file: \"File\",\n files: \"Files\",\n link: \"Link\",\n url: \"URL\",\n read_time: \"min read\",\n price: \"Price\",\n cost: \"Cost\",\n amount: \"Amount\",\n quantity: \"Quantity\",\n size: \"Size\",\n weight: \"Weight\",\n color: \"Color\",\n colors: \"Colors\",\n type: \"Type\",\n types: \"Types\",\n status: \"Status\",\n active: \"Active\",\n inactive: \"Inactive\",\n enabled: \"Enabled\",\n disabled: \"Disabled\",\n visible: \"Visible\",\n hidden: \"Hidden\",\n public: \"Public\",\n private: \"Private\",\n published: \"Published\",\n draft: \"Draft\",\n featured: \"Featured\",\n new: \"New\",\n old: \"Old\",\n latest: \"Latest\",\n popular: \"Popular\",\n recommended: \"Recommended\",\n all: \"All\",\n none: \"None\",\n other: \"Other\",\n more: \"More\",\n less: \"Less\",\n show: \"Show\",\n hide: \"Hide\",\n expand: \"Expand\",\n collapse: \"Collapse\",\n search: \"Search\",\n filter: \"Filter\",\n sort: \"Sort\",\n order: \"Order\",\n ascending: \"Ascending\",\n descending: \"Descending\",\n first: \"First\",\n last: \"Last\",\n next: \"Next\",\n previous: \"Previous\",\n page: \"Page\",\n pages: \"Pages\",\n total: \"Total\",\n count: \"Count\",\n number: \"Number\",\n index: \"Index\",\n id: \"ID\",\n code: \"Code\",\n key: \"Key\",\n value: \"Value\",\n data: \"Data\",\n info: \"Info\",\n details: \"Details\",\n summary: \"Summary\",\n overview: \"Overview\",\n list: \"List\",\n grid: \"Grid\",\n graph: \"Graph\",\n map: \"Map\",\n location: \"Location\",\n country: \"Country\",\n region: \"Region\",\n district: \"District\",\n zip: \"ZIP\",\n street: \"Street\",\n building: \"Building\",\n floor: \"Floor\",\n room: \"Room\",\n stadium: \"Stadium\",\n field: \"Field\",\n pitch: \"Pitch\",\n locker_room: \"Locker room\",\n office: \"Office\",\n shop: \"Shop\",\n store: \"Store\",\n restaurant: \"Restaurant\",\n cafe: \"Cafe\",\n parking: \"Parking\",\n entrance: \"Entrance\",\n exit: \"Exit\",\n emergency_exit: \"Emergency exit\",\n toilet: \"Toilet\",\n wc: \"WC\",\n men: \"Men\",\n women: \"Women\",\n accessible: \"Accessible\",\n wheelchair: \"Wheelchair\",\n elevator: \"Elevator\",\n stairs: \"Stairs\",\n ramp: \"Ramp\",\n door: \"Door\",\n window: \"Window\",\n roof: \"Roof\",\n wall: \"Wall\",\n floor_surface: \"Floor\",\n ceiling: \"Ceiling\",\n lighting: \"Lighting\",\n heating: \"Heating\",\n cooling: \"Cooling\",\n ventilation: \"Ventilation\",\n security: \"Security\",\n safety: \"Safety\",\n fire_safety: \"Fire safety\",\n first_aid: \"First aid\",\n emergency: \"Emergency\",\n warning: \"Warning\",\n danger: \"Danger\",\n caution: \"Caution\",\n notice: \"Notice\",\n information: \"Information\",\n help: \"Help\",\n support: \"Support\",\n tiktok: \"TikTok\",\n snapchat: \"Snapchat\",\n pinterest: \"Pinterest\",\n reddit: \"Reddit\",\n whatsapp: \"WhatsApp\",\n telegram: \"Telegram\",\n signal: \"Signal\",\n viber: \"Viber\",\n messenger: \"Messenger\",\n skype: \"Skype\",\n zoom: \"Zoom\",\n teams: \"Teams\",\n slack: \"Slack\",\n discord: \"Discord\",\n github: \"GitHub\",\n gitlab: \"GitLab\",\n bitbucket: \"Bitbucket\",\n language: \"Language\",\n my_account: \"My Account\"\n },\n \n // Engagement system\n engagement: {\n level: \"Level\",\n points: \"points\",\n progress: \"Progress\",\n achievements: \"Achievements\",\n rewards: \"Rewards\"\n },\n \n // Newsletter\n newsletter: {\n email_preferences: \"Email Preferences\",\n subscribe: \"Subscribe to newsletter\",\n subscribe_description: \"We will inform you about news, matches and events of our club. We will also create a fan account for you and send the password by email.\",\n email_label: \"Your email\",\n consent_text: \"By submitting the form you agree to the processing of personal data. You can unsubscribe and manage settings at any time in the email sent. Password can be changed via the password reset page.\",\n subscribe_button: \"Submit\",\n subscribe_success: \"Newsletter subscription successful\",\n subscribe_success_desc: \"We have created a fan account for you and sent an email with password and links for newsletter management.\",\n subscribe_error: \"Error\",\n subscribe_error_desc: \"An error occurred while subscribing to newsletter\",\n email_required: \"Email is required\",\n email_invalid: \"Invalid email address\",\n },\n \n // Admin\n admin: {\n page_settings: \"Page settings\"\n },\n \n // About page\n about: {\n page_not_setup: \"This page is not set up yet. Here is an overview of the club, competitions and categories.\",\n matches_by_competition: \"Matches by competition\",\n club_info: \"Official club information\",\n meta_description: \"Information about our club, competitions, upcoming matches and categories.\"\n }\n }\n }\n};\n\n// Detect language from localStorage, cookie, or browser\nconst detectLanguage = () => {\n // Try localStorage first\n try {\n const stored = localStorage.getItem('language');\n if (stored && ['cs', 'en'].includes(stored)) {\n return stored;\n }\n } catch (e) {\n // Ignore localStorage errors\n }\n \n // Try cookie\n try {\n const cookies = document.cookie.split(';');\n for (const cookie of cookies) {\n const [name, value] = cookie.trim().split('=');\n if (name === 'lang' && ['cs', 'en'].includes(value)) {\n return value;\n }\n }\n } catch (e) {\n // Ignore cookie errors\n }\n \n // Fallback to browser language or default to Czech\n const browserLang = navigator.language.split('-')[0];\n return ['cs', 'en'].includes(browserLang) ? browserLang : 'cs';\n};\n\ni18n\n // Pass i18n down to react-i18next\n .use(initReactI18next)\n // Init i18next\n .init({\n // Detect language from storage or browser\n lng: detectLanguage(),\n fallbackLng: 'cs',\n debug: false,\n \n // Resources\n resources,\n \n // Namespace configuration - simplified to use default namespace\n ns: ['translation'],\n defaultNS: 'translation',\n \n // Interpolation\n interpolation: {\n escapeValue: false, // React already escapes\n formatSeparator: ',',\n format: function(value, format, lng) {\n if (format === 'uppercase') return value.toUpperCase();\n if (format === 'lowercase') return value.toLowerCase();\n if (format === 'currency') return new Intl.NumberFormat(lng, { style: 'currency', currency: 'CZK' }).format(value);\n if (format === 'date') return new Intl.DateTimeFormat(lng).format(new Date(value));\n return value;\n },\n },\n \n // React options\n react: {\n useSuspense: false, // Disable suspense for loading\n bindI18n: 'languageChanged',\n bindI18nStore: 'added removed',\n transEmptyNodeValue: '',\n transSupportBasicHtmlNodes: true,\n transKeepBasicHtmlNodesFor: ['br', 'strong', 'i', 'em', 'span'],\n },\n }).catch(err => {\n console.error('i18n: Initialization failed:', err);\n });\n\n// Add language change listener to save to localStorage\ni18n.on('languageChanged', (lng) => {\n try {\n localStorage.setItem('language', lng);\n // Also update cookie for compatibility\n document.cookie = `lang=${lng}; max-age=${365 * 24 * 60 * 60}; path=/`;\n } catch (e) {\n // Ignore storage errors\n }\n});\n\nexport default i18n;\n","import React, { useEffect } from 'react';\nimport { useConfirmDialog } from '../../contexts/ConfirmDialogContext';\n\nconst ServiceWorkerUpdateListener: React.FC = () => {\n const { confirm } = useConfirmDialog();\n\n useEffect(() => {\n const handler = (event: Event) => {\n const ev = event as CustomEvent<{ registration?: ServiceWorkerRegistration }>;\n const registration = ev.detail?.registration;\n if (!registration) return;\n (async () => {\n const ok = await confirm({\n title: 'Aktualizace aplikace',\n message: 'Nová verze aplikace je k dispozici. Chcete aktualizovat?',\n confirmText: 'Aktualizovat',\n cancelText: 'Později',\n });\n if (ok && registration.waiting) {\n registration.waiting.postMessage({ type: 'SKIP_WAITING' });\n window.location.reload();\n }\n })();\n };\n window.addEventListener('sw-update-available', handler as EventListener);\n return () => {\n window.removeEventListener('sw-update-available', handler as EventListener);\n };\n }, [confirm]);\n\n return null;\n};\n\nexport default ServiceWorkerUpdateListener;\n","import { Box, Button, Flex, Text, Link, Checkbox } from '@chakra-ui/react';\nimport { useEffect, useState } from 'react';\n\nconst STORAGE_KEY = 'cookie_consent';\n\ntype Consent = {\n version: number;\n necessary: true; // always true\n preferences: boolean;\n analytics: boolean;\n marketing: boolean;\n timestamp: string; // ISO\n};\n\nconst defaultConsent: Consent = {\n version: 1,\n necessary: true,\n preferences: false,\n analytics: false,\n marketing: false,\n timestamp: new Date().toISOString(),\n};\n\nconst CookieBanner: React.FC = () => {\n const [visible, setVisible] = useState(false);\n const [managing, setManaging] = useState(false);\n const [consent, setConsent] = useState<Consent>(defaultConsent);\n\n useEffect(() => {\n try {\n const saved = localStorage.getItem(STORAGE_KEY);\n if (saved) {\n const parsed = JSON.parse(saved) as Consent;\n setConsent(parsed);\n setVisible(false);\n } else {\n setVisible(true);\n }\n } catch {\n setVisible(true);\n }\n }, []);\n\n // Allow opening the preferences from anywhere (e.g. Cookie Policy page)\n useEffect(() => {\n const openHandler = (_e: Event) => {\n setManaging(true);\n setVisible(true);\n };\n window.addEventListener('cookie-consent-open', openHandler);\n return () => {\n window.removeEventListener('cookie-consent-open', openHandler);\n };\n }, []);\n\n const saveAndClose = (c: Consent) => {\n const payload = { ...c, timestamp: new Date().toISOString() };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(payload));\n setConsent(payload);\n setVisible(false);\n setManaging(false);\n // Dispatch a small custom event so analytics loaders can react\n window.dispatchEvent(new CustomEvent('cookie-consent-change', { detail: payload }));\n };\n\n const acceptAll = () => {\n saveAndClose({ ...defaultConsent, preferences: true, analytics: true, marketing: true });\n };\n\n const rejectNonEssential = () => {\n saveAndClose({ ...defaultConsent });\n };\n\n if (!visible) return null;\n\n return (\n <Box\n role=\"dialog\"\n aria-live=\"polite\"\n position=\"fixed\"\n bottom={{ base: 4, md: 6 }}\n left=\"50%\"\n transform=\"translateX(-50%)\"\n bg=\"blackAlpha.800\"\n color=\"gray.100\"\n zIndex={1000}\n px={{ base: 4, md: 6 }}\n py={{ base: 4, md: 5 }}\n borderRadius=\"xl\"\n boxShadow=\"xl\"\n borderWidth=\"1px\"\n borderColor=\"whiteAlpha.300\"\n w={{ base: 'calc(100% - 2rem)', sm: 'calc(100% - 3rem)', md: 'auto' }}\n maxW=\"3xl\"\n style={{ backdropFilter: 'blur(6px)' }}\n >\n <Flex align=\"start\" justify=\"space-between\" gap={6} wrap=\"wrap\">\n <Box maxW={{ base: '100%', md: '75%' }}>\n <Text fontSize=\"sm\" mb={2}>\n <span role=\"img\" aria-label=\"cookie\">🍪</span>{' '}\n Tento web používá soubory cookies pro zajištění správného fungování (nezbytné) a za účelem vylepšení obsahu.\n O vybraných kategoriích rozhodujete vy. Podrobnosti najdete v&nbsp;\n <Link href=\"/pravidla-cookies\" color=\"blue.300\" textDecoration=\"underline\">Pravidlech cookies</Link>.\n </Text>\n {managing && (\n <Box mt={3} bg=\"gray.800\" borderRadius=\"lg\" p={4} borderWidth=\"1px\" borderColor=\"gray.700\">\n <Text fontWeight=\"semibold\" mb={2}>Nastavení preferencí</Text>\n <Flex direction=\"column\" gap={2}>\n <Checkbox isChecked isDisabled>\n <Text fontSize=\"sm\">Nezbytné cookies (vždy aktivní)</Text>\n </Checkbox>\n <Checkbox\n isChecked={!!consent.preferences}\n onChange={(e) => setConsent((c) => ({ ...c, preferences: e.target.checked }))}\n >\n <Text fontSize=\"sm\">Preferenční cookies (např. zapamatování voleb)</Text>\n </Checkbox>\n <Checkbox\n isChecked={!!consent.analytics}\n onChange={(e) => setConsent((c) => ({ ...c, analytics: e.target.checked }))}\n >\n <Text fontSize=\"sm\">Analytické cookies (anonymní měření návštěvnosti)</Text>\n </Checkbox>\n <Checkbox\n isChecked={!!consent.marketing}\n onChange={(e) => setConsent((c) => ({ ...c, marketing: e.target.checked }))}\n >\n <Text fontSize=\"sm\">Marketingové cookies</Text>\n </Checkbox>\n <Flex gap={2} mt={2} wrap=\"wrap\">\n <Button size=\"sm\" colorScheme=\"blue\" onClick={() => saveAndClose(consent)}>Uložit nastavení</Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setManaging(false)}>Zpět</Button>\n </Flex>\n </Flex>\n </Box>\n )}\n </Box>\n <Flex gap={2} align=\"center\" wrap=\"wrap\">\n <Button size=\"sm\" onClick={() => setManaging((v) => !v)} variant=\"ghost\">Nastavit</Button>\n <Button size=\"sm\" onClick={rejectNonEssential} variant=\"outline\" colorScheme=\"gray\">Odmítnout nepovinné</Button>\n <Button size=\"sm\" colorScheme=\"blue\" onClick={acceptAll}>Přijmout vše</Button>\n </Flex>\n </Flex>\n </Box>\n );\n};\n\nexport default CookieBanner;\n","import { Helmet } from 'react-helmet-async';\nimport { useEffect, useState } from 'react';\nimport api from '../../services/api';\nimport { assetUrl } from '../../utils/url';\nimport { usePublicSettings } from '../../hooks/usePublicSettings';\n\ninterface SEOData {\n site_title?: string;\n site_description?: string;\n meta_keywords?: string;\n default_og_image_url?: string;\n twitter_handle?: string;\n canonical_base_url?: string;\n additional_meta?: string; // raw HTML strings not injected for safety here\n enable_indexing?: boolean;\n}\n\nexport default function DefaultSEO() {\n const [seo, setSeo] = useState<SEOData | null>(null);\n const [social, setSocial] = useState<{ facebook?: string; instagram?: string; youtube?: string } | null>(null);\n const { data: publicSettings } = usePublicSettings();\n\n useEffect(() => {\n let mounted = true;\n api.get<SEOData>('/seo')\n .then(res => { if (mounted) setSeo(res.data as any); })\n .catch(() => {});\n // Socials can come from settings (hook). Set when available\n // We still keep axios SEO fetch above for dedicated SEO fields\n return () => { mounted = false; };\n }, []);\n\n // Keep socials in sync when settings load\n useEffect(() => {\n if (!publicSettings) return;\n setSocial({\n facebook: publicSettings.facebook_url,\n instagram: publicSettings.instagram_url,\n youtube: publicSettings.youtube_url,\n });\n }, [publicSettings]);\n\n const fallbackClubName = publicSettings?.club_name;\n const title = (seo?.site_title && seo.site_title.trim()) || (fallbackClubName && fallbackClubName.trim()) || 'MyClub';\n const desc = (seo?.site_description && seo.site_description.trim()) || (fallbackClubName ? `Official ${fallbackClubName} Website` : 'Official MyClub Website');\n const keywords = seo?.meta_keywords || '';\n const rawOg = seo?.default_og_image_url || publicSettings?.club_logo_url || '/logo512.png';\n const ogImg = assetUrl(rawOg) || rawOg;\n const twitter = seo?.twitter_handle || '';\n const origin = seo?.canonical_base_url || (typeof window !== 'undefined' ? window.location.origin : '');\n const sameAs: string[] = [];\n if (twitter) {\n const handle = twitter.startsWith('@') ? twitter.slice(1) : twitter;\n sameAs.push(`https://twitter.com/${handle}`);\n }\n if (social?.facebook) sameAs.push(social.facebook);\n if (social?.instagram) sameAs.push(social.instagram);\n if (social?.youtube) sameAs.push(social.youtube);\n\n // robots\n const robots = seo?.enable_indexing === false ? 'noindex, nofollow' : 'index, follow';\n\n // Ensure document title updates as soon as we have a computed title\n useEffect(() => {\n if (typeof document !== 'undefined' && title) {\n document.title = title;\n }\n }, [title]);\n\n return (\n <Helmet defaultTitle={title} titleTemplate={`%s | ${fallbackClubName || title}`}>\n <title>{title}</title>\n <meta name=\"description\" content={desc} />\n {keywords && <meta name=\"keywords\" content={keywords} />}\n <meta name=\"robots\" content={robots} />\n {/* Favicon and app icons based on club logo */}\n {publicSettings?.club_logo_url && (\n <>\n <link rel=\"icon\" href={assetUrl(publicSettings.club_logo_url)} />\n <link rel=\"shortcut icon\" href={assetUrl(publicSettings.club_logo_url)} />\n <link rel=\"apple-touch-icon\" href={assetUrl(publicSettings.club_logo_url)} />\n </>\n )}\n {/* Open Graph */}\n <meta property=\"og:type\" content=\"website\" />\n <meta property=\"og:title\" content={title} />\n <meta property=\"og:description\" content={desc} />\n <meta property=\"og:image\" content={ogImg} />\n {/* Twitter */}\n <meta name=\"twitter:card\" content=\"summary_large_image\" />\n {twitter && <meta name=\"twitter:site\" content={twitter} />}\n <meta name=\"twitter:title\" content={title} />\n <meta name=\"twitter:description\" content={desc} />\n <meta name=\"twitter:image\" content={ogImg} />\n {/* Canonical (best-effort: base only; pages can override) */}\n {seo?.canonical_base_url && <link rel=\"canonical\" href={seo.canonical_base_url} />}\n {/* JSON-LD: WebSite + SearchAction */}\n {origin && (\n <script type=\"application/ld+json\">\n {JSON.stringify({\n '@context': 'https://schema.org',\n '@type': 'WebSite',\n url: origin,\n name: title,\n potentialAction: {\n '@type': 'SearchAction',\n target: `${origin}/blog?q={search_term_string}`,\n 'query-input': 'required name=search_term_string'\n }\n })}\n </script>\n )}\n {/* JSON-LD: Organization */}\n {origin && (\n <script type=\"application/ld+json\">\n {JSON.stringify({\n '@context': 'https://schema.org',\n '@type': 'Organization',\n url: origin,\n name: title,\n logo: ogImg,\n sameAs: sameAs.length ? sameAs : undefined,\n })}\n </script>\n )}\n </Helmet>\n );\n}\n","import { Navigate, useLocation } from 'react-router-dom';\nimport { useAuth } from '../contexts/AuthContext';\nimport { useEffect, useState } from 'react';\nimport { getSetupStatus } from '../services/setup';\n\ninterface ProtectedRouteProps {\n children: JSX.Element;\n requiredRole?: string;\n}\n\nconst ProtectedRoute: React.FC<ProtectedRouteProps> = ({ children, requiredRole }) => {\n const { isAuthenticated, isLoading, user } = useAuth();\n const location = useLocation();\n const [checkingSetup, setCheckingSetup] = useState(true);\n const [requiresSetup, setRequiresSetup] = useState<boolean>(false);\n\n // Check if setup is required\n useEffect(() => {\n let mounted = true;\n (async () => {\n try {\n const s = await getSetupStatus();\n if (mounted) setRequiresSetup(!!s.requires_setup);\n } catch (_) {\n if (mounted) setRequiresSetup(false);\n } finally {\n if (mounted) setCheckingSetup(false);\n }\n })();\n return () => { mounted = false; };\n }, []);\n\n if (isLoading || checkingSetup) {\n // Show loading spinner or skeleton\n return <div>Načítání…</div>;\n }\n\n // If setup is required, redirect to setup page\n if (requiresSetup) {\n return <Navigate to=\"/setup\" replace />;\n }\n\n if (!isAuthenticated) {\n // Redirect to login page, but save the current location\n return <Navigate to=\"/login\" state={{ from: location }} replace />;\n }\n\n // Role-based access control\n if (requiredRole && user && user.role && user.role !== requiredRole && user.role !== 'admin') {\n // Redirect to 403 Forbidden page\n return <Navigate to=\"/403\" state={{ from: location.pathname }} replace />;\n }\n\n return children;\n};\n\nexport default ProtectedRoute;\n","import React, { useEffect, useState } from 'react';\nimport { ChakraProvider, extendTheme } from '@chakra-ui/react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { BrowserRouter as Router, Routes, Route, Navigate, Outlet, useLocation } from 'react-router-dom';\nimport './styles/custom-scrollbar.css';\nimport { AuthProvider, useAuth } from './contexts/AuthContext';\nimport AuthPage from './pages/AuthPage';\nimport RegisterPage from './pages/RegisterPage';\nimport DashboardPage from './pages/DashboardPage';\nimport ArticlesListPage from './pages/ArticlesListPage';\nimport HomePage from './pages/HomePage';\nimport BlogPage from './pages/BlogPage';\nimport PremiumHomePage from './pages/premium/PremiumHomePage';\nimport PremiumBlogPage from './pages/premium/PremiumBlogPage';\nimport PremiumNotFound from './pages/premium/PremiumNotFound';\nimport ArticleDetailPage from './pages/ArticleDetailPage';\nimport ActivityDetailPage from './pages/ActivityDetailPage';\nimport MatchDetailPage from './pages/MatchDetailPage';\nimport ClubPage from './pages/ClubPage';\nimport CalendarPage from './pages/CalendarPage';\nimport TablesPage from './pages/TablesPage';\nimport MatchesPage from './pages/MatchesPage';\nimport PlayersPage from './pages/PlayersPage';\nimport PlayerDetailPage from './pages/PlayerDetailPage';\nimport SponsorsPage from './pages/SponsorsPage';\nimport ContactPage from './pages/ContactPage';\nimport GalleryPage from './pages/GalleryPage';\nimport AlbumDetailPage from './pages/AlbumDetailPage';\nimport ForgotPasswordPage from './pages/ForgotPasswordPage';\nimport ResetPasswordPage from './pages/ResetPasswordPage';\nimport ActivitiesCalendarPage from './pages/ActivitiesCalendarPage';\nimport AdminDashboardPage from './pages/admin/AdminDashboardPage';\nimport ArticlesAdminPage from './pages/admin/ArticlesAdminPage';\nimport SponsorsAdminPage from './pages/admin/SponsorsAdminPage';\nimport MatchesAdminPage from './pages/admin/MatchesAdminPage';\nimport PlayersAdminPage from './pages/admin/PlayersAdminPage';\nimport TeamsAdminPage from './pages/admin/TeamsAdminPage';\nimport BannersAdminPage from './pages/admin/BannersAdminPage';\nimport MessagesAdminPage from './pages/admin/MessagesAdminPage';\nimport SettingsAdminPage from './pages/admin/SettingsAdminPage';\nimport UsersAdminPage from './pages/admin/UsersAdminPage';\nimport NewsletterAdminPage from './pages/admin/NewsletterAdminPage';\nimport CompetitionAliasesAdminPage from './pages/admin/CompetitionAliasesAdminPage';\nimport PrefetchAdminPage from './pages/admin/PrefetchAdminPage';\nimport AdminVideosPage from './pages/admin/AdminVideosPage';\nimport GalleryAdminPage from './pages/admin/GalleryAdminPage';\nimport AdminActivitiesPage from './pages/admin/AdminActivitiesPage';\nimport AdminMerchPage from './pages/admin/AdminMerchPage';\nimport AdminResetPasswordPage from './pages/admin/AdminResetPasswordPage';\nimport AboutAdminPage from './pages/admin/AboutAdminPage';\nimport AnalyticsAdminPage from './pages/admin/AnalyticsAdminPage';\nimport FilesAdminPage from './pages/admin/FilesAdminPage';\nimport ContactsAdminPage from './pages/admin/ContactsAdminPage';\nimport NavigationAdminPage from './pages/admin/NavigationAdminPage';\nimport ShortlinksAdminPage from './pages/admin/ShortlinksAdminPage';\nimport CommentsAdminPage from './pages/admin/CommentsAdminPage';\nimport EngagementAdminPage from './pages/admin/EngagementAdminPage';\nimport SweepstakesAdminPage from './pages/admin/SweepstakesAdminPage';\nimport FinancialDashboard from './pages/admin/FinancialDashboard';\nimport QRCodesAdminPage from './pages/admin/QRCodesAdminPage';\nimport SweepstakeVisualPage from './pages/admin/SweepstakeVisualPage';\nimport I18nAdminPage from './pages/admin/I18nAdminPage';\nimport SemiAdminPage from './pages/SemiAdminPage';\nimport PollsAdminPage from './pages/admin/PollsAdminPage';\n// Admin pages render their own AdminLayout internally\nimport SetupPage from './pages/SetupPage';\nimport StylePreviewPage from './pages/StylePreviewPage';\nimport AboutPage from './pages/AboutPage';\nimport AdminDocsPage from './pages/admin/AdminDocsPage';\nimport ManualFacrAdminPage from './pages/admin/ManualFacrAdminPage';\nimport ScoreboardAdminPage from './pages/admin/ScoreboardAdminPage';\nimport MobileScoreboardControlPage from './pages/admin/MobileScoreboardControlPage';\nimport { getSetupStatus } from './services/setup';\nimport NewsletterUnsubscribePage from './pages/NewsletterUnsubscribePage';\nimport NewsletterPreferencesPage from './pages/NewsletterPreferencesPage';\nimport { ClubThemeProvider } from './contexts/ClubThemeContext';\nimport { ConfirmDialogProvider } from './contexts/ConfirmDialogContext';\nimport ServiceWorkerUpdateListener from './components/common/ServiceWorkerUpdateListener';\nimport CookiePolicyPage from './pages/legal/CookiePolicyPage';\nimport OverlayScoreboardPage from './pages/OverlayScoreboardPage';\nimport OverlaySponsorsPage from './pages/OverlaySponsorsPage';\nimport CookieBanner from './components/CookieBanner';\nimport DefaultSEO from './components/seo/DefaultSEO';\nimport ProtectedRoute from './components/ProtectedRoute';\nimport TermsPage from './pages/legal/TermsPage';\nimport PrivacyPolicyPage from './pages/legal/PrivacyPolicyPage';\nimport ForbiddenPage from './pages/ForbiddenPage';\nimport NotFoundPage from './pages/NotFoundPage';\nimport VideosPage from './pages/VideosPage';\nimport SearchPage from './pages/SearchPage';\nimport ClothingPage from './pages/ClothingPage';\nimport PollsPage from './pages/PollsPage';\nimport { useUmami } from './hooks/useUmami';\nimport { checkin } from './services/engagement';\nimport { useFontLoader } from './hooks/useFontLoader';\nimport { usePublicSettings } from './hooks/usePublicSettings';\nimport { logAction } from './services/actionLog';\n\nconst RouteLogger: React.FC = () => {\n const loc = useLocation();\n useEffect(() => {\n logAction({ type: 'nav', at: Date.now(), path: loc.pathname + loc.search });\n }, [loc.pathname, loc.search]);\n return null;\n};\n\n// Create a client with better cache configuration\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000, // 5 minutes\n cacheTime: 10 * 60 * 1000, // 10 minutes\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n retry: 1,\n },\n },\n});\n\n// Theme configuration drawing colors from ClubTheme CSS variables for personalization\nexport const theme = extendTheme({\n config: {\n initialColorMode: 'light',\n useSystemColorMode: false,\n },\n // Provide a brand color scale so colorScheme=\"brand\" components style correctly\n colors: {\n brand: {\n 50: '#e6f7ff',\n 100: '#b3e0ff',\n 200: '#80caff',\n 300: '#4db3ff',\n 400: '#1a9cff',\n 500: 'var(--club-primary, #0b5cff)',\n 600: '#0066cc',\n 700: '#004d99',\n 800: '#003366',\n 900: '#001a33',\n },\n },\n // Semantic tokens allow live updates when ClubThemeContext changes CSS variables\n semanticTokens: {\n colors: {\n 'brand.primary': {\n default: 'var(--club-primary, #0b5cff)',\n },\n 'brand.secondary': {\n default: 'var(--club-secondary, #ffd200)',\n },\n 'brand.accent': {\n default: 'var(--club-accent, #141414)',\n },\n 'text.onPrimary': {\n default: 'var(--club-text-on-primary, #ffffff)',\n },\n 'bg.app': {\n default: '#f8f9fb',\n _dark: '#0f1115',\n },\n 'text.app': {\n default: '#1a1a1a',\n _dark: '#e8eaf0',\n },\n // Backdrop/outline shades\n 'border.subtle': {\n default: 'rgba(0,0,0,0.06)',\n _dark: 'rgba(255,255,255,0.12)',\n },\n 'bg.card': {\n default: '#ffffff',\n _dark: '#1a1d29',\n },\n 'bg.elevated': {\n default: '#ffffff',\n _dark: '#242831',\n },\n },\n },\n styles: {\n global: {\n 'html, body, #root': {\n height: '100%',\n fontFamily: 'var(--font-body, Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial)',\n },\n body: {\n bg: 'bg.app',\n color: 'text.app',\n lineHeight: 1.5,\n fontFamily: 'var(--font-body, Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial)',\n },\n 'h1, h2, h3, h4, h5, h6': {\n fontFamily: 'var(--font-heading, Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial)',\n },\n a: {\n transition: 'color 0.2s ease',\n },\n '::selection': {\n background: 'brand.accent',\n color: 'black',\n },\n },\n },\n components: {\n Container: {\n baseStyle: {\n px: { base: 4, md: 6 },\n },\n sizes: {\n '7xl': '88rem',\n },\n },\n Button: {\n baseStyle: {\n fontWeight: '700',\n borderRadius: 'md',\n letterSpacing: '0.4px',\n _hover: { transform: 'translateY(-1px)', boxShadow: 'md' },\n _active: { transform: 'translateY(0)' },\n },\n variants: {\n solid: {\n bg: 'brand.primary',\n color: 'text.onPrimary',\n _hover: { filter: 'brightness(0.95)' },\n },\n outline: {\n border: '2px solid',\n borderColor: 'brand.primary',\n color: 'brand.primary',\n _hover: { bg: 'rgba(0,0,0,0.02)' },\n },\n ghost: {\n color: 'brand.secondary',\n _hover: { bg: 'rgba(0,0,0,0.04)' },\n },\n },\n },\n Card: {\n baseStyle: {\n container: {\n borderRadius: 'lg',\n boxShadow: 'sm',\n overflow: 'hidden',\n transition: 'all 0.2s',\n borderWidth: '1px',\n borderColor: 'border.subtle',\n _hover: { transform: 'translateY(-4px)', boxShadow: 'lg' },\n },\n },\n },\n Divider: {\n baseStyle: {\n borderColor: 'border.subtle',\n },\n },\n Heading: {\n baseStyle: {\n fontFamily: 'var(--font-heading, Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial)',\n },\n },\n Text: {\n baseStyle: {\n fontFamily: 'var(--font-body, Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial)',\n },\n },\n },\n fonts: {\n heading: 'var(--font-heading, Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial)',\n body: 'var(--font-body, Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial)',\n },\n});\n\n// Component to initialize analytics inside Router context\nconst AnalyticsInitializer: React.FC = () => {\n useUmami();\n return null;\n};\n\n// Component to load and apply club fonts\nconst FontLoader: React.FC = () => {\n useFontLoader();\n return null;\n};\n\n// Component to trigger daily check-in for authenticated users (once per day)\nconst CheckinInitializer: React.FC = () => {\n const { isAuthenticated } = useAuth();\n useEffect(() => {\n if (!isAuthenticated) return;\n let cancelled = false;\n const todayKey = (() => {\n const d = new Date();\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `fc_checkin_${y}-${m}-${day}`;\n })();\n try {\n if (localStorage.getItem(todayKey) === '1') return;\n } catch {}\n // Fire and forget; backend caps ensure idempotence server-side\n (async () => {\n try { await checkin(); if (!cancelled) { try { localStorage.setItem(todayKey, '1'); } catch {} } } catch {}\n })();\n return () => { cancelled = true; };\n }, [isAuthenticated]);\n return null;\n};\n\n// Redirect /news -> /blog while preserving query parameters\nconst NewsRedirect: React.FC = () => {\n const loc = useLocation();\n return <Navigate to={`/blog${loc.search || ''}`} replace />;\n};\n\nconst App: React.FC = () => {\n // Uses shared ProtectedRoute component for auth guard\n\n // Public Route component - redirects to admin if already authenticated\n const PublicRoute = ({ children }: { children: React.ReactNode }) => {\n const { isAuthenticated, isLoading, user } = useAuth();\n const [checkingSetup, setCheckingSetup] = useState(true);\n const [requiresSetup, setRequiresSetup] = useState<boolean>(false);\n\n useEffect(() => {\n let mounted = true;\n (async () => {\n try {\n const s = await getSetupStatus();\n if (mounted) setRequiresSetup(!!s.requires_setup);\n } catch (_) {\n if (mounted) setRequiresSetup(false);\n } finally {\n if (mounted) setCheckingSetup(false);\n }\n })();\n return () => { mounted = false; };\n }, []);\n\n if (isLoading || checkingSetup) {\n return <div>Načítání…</div>;\n }\n\n if (isAuthenticated) {\n const role = String(user?.role || '').toLowerCase();\n if (role === 'admin') {\n return <Navigate to=\"/admin\" replace />;\n }\n if (role === 'editor') {\n return <Navigate to=\"/admin\" replace />;\n }\n if (role === 'fan') {\n return <Navigate to=\"/semiadmin\" replace />;\n }\n // Default: regular users to frontpage\n return <Navigate to=\"/\" replace />;\n }\n\n // If setup is required, redirect to setup wizard unless already on setup\n const currentPath = window.location.pathname;\n if (requiresSetup && currentPath !== '/setup') {\n return <Navigate to=\"/setup\" replace />;\n }\n\n return <>{children}</>;\n };\n\n // Admin routes group wrapper (no layout here; pages render their own AdminLayout)\n const AdminRoutesWrapper = () => {\n return <Outlet />;\n };\n\n // Admin index: admins see dashboard; editors are redirected to their first allowed page\n const AdminIndexRoute: React.FC = () => {\n const { user } = useAuth();\n const role = String(user?.role || '').toLowerCase();\n if (role === 'admin') {\n return <AdminDashboardPage />;\n }\n if (role === 'editor') {\n // Default first allowed page for editors; configurable nav may change links\n return <Navigate to=\"/admin/clanky\" replace />;\n }\n return <Navigate to=\"/403\" replace />;\n };\n\n // Premium-aware route elements\n const HomeRoute: React.FC = () => {\n const { data } = usePublicSettings();\n return data?.premium ? <PremiumHomePage /> : <HomePage />;\n };\n const BlogRoute: React.FC = () => {\n const { data } = usePublicSettings();\n return data?.premium ? <PremiumBlogPage /> : <BlogPage />;\n };\n const NotFoundRoute: React.FC = () => {\n const { data } = usePublicSettings();\n return data?.premium ? <PremiumNotFound /> : <NotFoundPage />;\n };\n\n return (\n <ChakraProvider theme={theme}>\n <QueryClientProvider client={queryClient}>\n <Router>\n <AuthProvider>\n <ClubThemeProvider>\n <ConfirmDialogProvider>\n <AnalyticsInitializer />\n <FontLoader />\n <RouteLogger />\n <CheckinInitializer />\n <ServiceWorkerUpdateListener />\n <DefaultSEO />\n <Routes>\n {/* Public routes */}\n <Route path=\"/\" element={<HomeRoute />} />\n <Route path=\"/hledat\" element={<SearchPage />} />\n <Route path=\"/search\" element={<SearchPage />} />\n <Route path=\"/overlay/scoreboard\" element={<OverlayScoreboardPage />} />\n <Route path=\"/overlay/sponsors\" element={<OverlaySponsorsPage />} />\n <Route path=\"/blog\" element={<BlogRoute />} />\n <Route path=\"/klub\" element={<ClubPage />} />\n <Route path=\"/o-klubu\" element={<AboutPage />} />\n <Route path=\"/kalendar\" element={<CalendarPage />} />\n <Route path=\"/aktivity\" element={<ActivitiesCalendarPage />} />\n <Route path=\"/tabulky\" element={<TablesPage />} />\n <Route path=\"/zapasy\" element={<MatchesPage />} />\n <Route path=\"/players\" element={<PlayersPage />} />\n <Route path=\"/hraci\" element={<PlayersPage />} />\n <Route path=\"/players/:id\" element={<PlayerDetailPage />} />\n <Route path=\"/hraci/:id\" element={<PlayerDetailPage />} />\n <Route path=\"/sponzori\" element={<SponsorsPage />} />\n <Route path=\"/kontakt\" element={<ContactPage />} />\n <Route path=\"/ankety\" element={<PollsPage />} />\n <Route path=\"/galerie\" element={<GalleryPage />} />\n <Route path=\"/galerie/album/:id\" element={<AlbumDetailPage />} />\n <Route path=\"/videa\" element={<VideosPage />} />\n <Route path=\"/obleceni\" element={<ClothingPage />} />\n {/* Legal pages */}\n <Route path=\"/pravidla-cookies\" element={<CookiePolicyPage />} />\n <Route path=\"/obchodni-podminky\" element={<TermsPage />} />\n <Route path=\"/zasady-ochrany-osobnich-udaju\" element={<PrivacyPolicyPage />} />\n {/* Short links are handled by nginx -> backend, not React Router */}\n <Route path=\"/news\" element={<NewsRedirect />} />\n {/* Slug routes must precede id route to avoid conflicts */}\n <Route path=\"/news/:slug\" element={<ArticleDetailPage />} />\n <Route path=\"/articles/slug/:slug\" element={<ArticleDetailPage />} />\n <Route path=\"/articles/:id\" element={<ArticleDetailPage />} />\n {/* Internal match detail */}\n <Route path=\"/zapas/:id\" element={<MatchDetailPage />} />\n <Route path=\"/aktivita/:id\" element={<ActivityDetailPage />} />\n {/* Legacy redirects */}\n <Route path=\"/clanky\" element={<Navigate to=\"/blog\" replace />} />\n <Route path=\"/aktuality\" element={<Navigate to=\"/blog\" replace />} />\n <Route \n path=\"/setup\" \n element={\n <PublicRoute>\n <SetupPage />\n </PublicRoute>\n } \n />\n <Route \n path=\"/setup/styl\" \n element={\n <PublicRoute>\n <StylePreviewPage />\n </PublicRoute>\n } \n />\n <Route \n path=\"/login\" \n element={\n <PublicRoute>\n <AuthPage />\n </PublicRoute>\n } \n />\n <Route \n path=\"/register\" \n element={\n <PublicRoute>\n <RegisterPage />\n </PublicRoute>\n } \n />\n <Route path=\"/forgot-password\" element={<ForgotPasswordPage />} />\n <Route path=\"/reset-password\" element={<ResetPasswordPage />} />\n <Route path=\"/newsletter/unsubscribe/:email\" element={<NewsletterUnsubscribePage />} />\n <Route path=\"/newsletter/preferences\" element={<NewsletterPreferencesPage />} />\n <Route \n path=\"/semiadmin\" \n element={\n <ProtectedRoute>\n <SemiAdminPage />\n </ProtectedRoute>\n } \n />\n <Route path=\"/403\" element={<ForbiddenPage />} />\n\n {/* Admin index: allow both admins and editors; decide inside */}\n <Route\n path=\"/admin\"\n element={\n <ProtectedRoute>\n <AdminIndexRoute />\n </ProtectedRoute>\n }\n />\n\n {/* Admin area (pages include AdminLayout themselves) */}\n <Route element={\n <ProtectedRoute requiredRole=\"admin\">\n <AdminRoutesWrapper />\n </ProtectedRoute>\n }>\n <Route path=\"/admin/docs\" element={<AdminDocsPage />} />\n {/* moved to editor-accessible routes below */}\n \n <Route path=\"/admin/obleceni\" element={<AdminMerchPage />} />\n <Route path=\"/admin/sponzori\" element={<SponsorsAdminPage />} />\n {/* moved to editor-accessible routes below */}\n \n <Route path=\"/admin/uzivatele\" element={<UsersAdminPage />} />\n <Route path=\"/admin/bannery\" element={<BannersAdminPage />} />\n <Route path=\"/admin/zpravy\" element={<MessagesAdminPage />} />\n <Route path=\"/admin/nastaveni\" element={<SettingsAdminPage />} />\n <Route path=\"/admin/newsletter\" element={<NewsletterAdminPage />} />\n <Route path=\"/admin/ankety\" element={<PollsAdminPage />} />\n \n <Route path=\"/admin/prefetch\" element={<PrefetchAdminPage />} />\n <Route path=\"/admin/users/send-reset\" element={<AdminResetPasswordPage />} />\n \n <Route path=\"/admin/analytika\" element={<AnalyticsAdminPage />} />\n <Route path=\"/admin/soubory\" element={<FilesAdminPage />} />\n <Route path=\"/admin/kontakty\" element={<ContactsAdminPage />} />\n <Route path=\"/admin/navigace\" element={<NavigationAdminPage />} />\n <Route path=\"/admin/komentare\" element={<CommentsAdminPage />} />\n <Route path=\"/admin/engagement\" element={<EngagementAdminPage />} />\n <Route path=\"/admin/sweepstakes\" element={<SweepstakesAdminPage />} />\n <Route path=\"/admin/sweepstakes/:id/visual\" element={<SweepstakeVisualPage />} />\n <Route path=\"/admin/jazyky\" element={<I18nAdminPage />} />\n </Route>\n\n {/* Remaining protected routes that don't use AdminLayout */}\n <Route\n path=\"/dashboard\"\n element={<Navigate to=\"/admin\" replace />}\n />\n <Route\n path=\"/admin/sponsors\"\n element={\n <ProtectedRoute requiredRole=\"admin\">\n <SponsorsAdminPage />\n </ProtectedRoute>\n }\n />\n <Route\n path=\"/admin/banners\"\n element={\n <ProtectedRoute requiredRole=\"admin\">\n <BannersAdminPage />\n </ProtectedRoute>\n }\n />\n <Route\n path=\"/admin/messages\"\n element={\n <ProtectedRoute requiredRole=\"admin\">\n <MessagesAdminPage />\n </ProtectedRoute>\n }\n />\n <Route\n path=\"/admin/settings\"\n element={\n <ProtectedRoute requiredRole=\"admin\">\n <SettingsAdminPage />\n </ProtectedRoute>\n }\n />\n\n {/* Editor-accessible content pages (also allow admin) */}\n <Route\n path=\"/admin/clanky\"\n element={\n <ProtectedRoute requiredRole=\"editor\">\n <ArticlesAdminPage />\n </ProtectedRoute>\n }\n />\n <Route\n path=\"/admin/aktivity\"\n element={\n <ProtectedRoute requiredRole=\"editor\">\n <AdminActivitiesPage />\n </ProtectedRoute>\n }\n />\n <Route\n path=\"/admin/shortlinks\"\n element={\n <ProtectedRoute requiredRole=\"editor\">\n <ShortlinksAdminPage />\n </ProtectedRoute>\n }\n />\n\n {/* Financial Management */}\n <Route\n path=\"/admin/financial-dashboard\"\n element={\n <ProtectedRoute requiredRole=\"admin\">\n <FinancialDashboard />\n </ProtectedRoute>\n }\n />\n\n {/* QR Codes */}\n <Route\n path=\"/admin/qr-codes\"\n element={\n <ProtectedRoute requiredRole=\"admin\">\n <QRCodesAdminPage />\n </ProtectedRoute>\n }\n />\n\n {/* Editor-level admin pages (also allow admin) */}\n <Route\n path=\"/admin/tymy\"\n element={\n <ProtectedRoute requiredRole=\"editor\">\n <TeamsAdminPage />\n </ProtectedRoute>\n }\n />\n <Route\n path=\"/admin/zapasy\"\n element={\n <ProtectedRoute requiredRole=\"editor\">\n <MatchesAdminPage />\n </ProtectedRoute>\n }\n />\n <Route\n path=\"/admin/hraci\"\n element={\n <ProtectedRoute requiredRole=\"editor\">\n <PlayersAdminPage />\n </ProtectedRoute>\n }\n />\n <Route\n path=\"/admin/aliasy-soutezi\"\n element={\n <ProtectedRoute requiredRole=\"editor\">\n <CompetitionAliasesAdminPage />\n </ProtectedRoute>\n }\n />\n <Route\n path=\"/admin/manual-data\"\n element={\n <ProtectedRoute requiredRole=\"admin\">\n <ManualFacrAdminPage />\n </ProtectedRoute>\n }\n />\n <Route\n path=\"/admin/o-klubu\"\n element={\n <ProtectedRoute requiredRole=\"editor\">\n <AboutAdminPage />\n </ProtectedRoute>\n }\n />\n <Route\n path=\"/admin/videa\"\n element={\n <ProtectedRoute requiredRole=\"editor\">\n <AdminVideosPage />\n </ProtectedRoute>\n }\n />\n <Route\n path=\"/admin/galerie\"\n element={\n <ProtectedRoute requiredRole=\"editor\">\n <GalleryAdminPage />\n </ProtectedRoute>\n }\n />\n <Route\n path=\"/admin/scoreboard\"\n element={\n <ProtectedRoute requiredRole=\"editor\">\n <ScoreboardAdminPage />\n </ProtectedRoute>\n }\n />\n <Route\n path=\"/admin/scoreboard/remote\"\n element={\n <ProtectedRoute requiredRole=\"editor\">\n <MobileScoreboardControlPage />\n </ProtectedRoute>\n }\n />\n\n {/* Not found route */}\n <Route path=\"*\" element={<NotFoundRoute />} />\n </Routes>\n {/* Cookie consent banner shown across the whole site */}\n <CookieBanner />\n </ConfirmDialogProvider>\n </ClubThemeProvider>\n </AuthProvider>\n </Router>\n </QueryClientProvider>\n </ChakraProvider>\n );\n};\n\nexport default App;\n","import { useEffect } from 'react';\nimport { usePublicSettings } from './usePublicSettings';\nimport { getFontPairing, applyFontPairing, getDefaultFontPairing } from '../config/fonts';\n\n/**\n * Hook to load and apply club fonts from settings\n */\nexport const useFontLoader = () => {\n const { data: settings } = usePublicSettings();\n\n useEffect(() => {\n // Determine which font pairing to use\n const fontId = settings?.font_heading || settings?.font_body;\n \n let pairing;\n if (fontId) {\n // Try to find matching pairing by heading or body font name\n pairing = getFontPairing(fontId);\n \n // If not found by ID, try to find by font name\n if (!pairing) {\n const allPairings = require('../config/fonts').FONT_PAIRINGS;\n pairing = allPairings.find((p: any) => \n p.heading === fontId || \n p.body === fontId ||\n p.id === fontId\n );\n }\n }\n \n // Fallback to default\n if (!pairing) {\n pairing = getDefaultFontPairing();\n }\n \n // Apply the font pairing\n applyFontPairing(pairing);\n \n }, [settings?.font_heading, settings?.font_body]);\n};\n","import React, { lazy, Suspense } from 'react';\nimport { ChakraProvider, extendTheme, Spinner, Center, Box } from '@chakra-ui/react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { BrowserRouter as Router, Routes, Route, Navigate, Outlet } from 'react-router-dom';\nimport { AuthProvider, useAuth } from './contexts/AuthContext';\nimport { ClubThemeProvider } from './contexts/ClubThemeContext';\nimport { HelmetProvider } from 'react-helmet-async';\nimport { theme } from './App';\nimport { useUmami } from './hooks/useUmami';\nimport { useFontLoader } from './hooks/useFontLoader';\nimport DefaultSEO from './components/seo/DefaultSEO';\nimport CookieBanner from './components/CookieBanner';\nimport { ConfirmDialogProvider } from './contexts/ConfirmDialogContext';\nimport ServiceWorkerUpdateListener from './components/common/ServiceWorkerUpdateListener';\nimport ProtectedRoute from './components/ProtectedRoute';\nimport { getSetupStatus } from './services/setup';\nimport { useState, useEffect } from 'react';\nimport { usePublicSettings } from './hooks/usePublicSettings';\n\n// Create a client\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n cacheTime: 10 * 60 * 1000,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n retry: 1,\n },\n },\n});\n\n// Loading component\nconst PageLoader = () => (\n <Center h=\"100vh\">\n <Box textAlign=\"center\">\n <Spinner size=\"xl\" color=\"brand.primary\" thickness=\"4px\" />\n <Box mt={4} fontSize=\"sm\" color=\"gray.600\">Načítání...</Box>\n </Box>\n </Center>\n);\n\n// Lazy load pages for code splitting\nconst HomePage = lazy(() => import('./pages/HomePage'));\nconst BlogPage = lazy(() => import('./pages/BlogPage'));\n// Premium pages\nconst PremiumHomePage = lazy(() => import('./pages/premium/PremiumHomePage'));\nconst PremiumBlogPage = lazy(() => import('./pages/premium/PremiumBlogPage'));\nconst PremiumNotFound = lazy(() => import('./pages/premium/PremiumNotFound'));\nconst ArticleDetailPage = lazy(() => import('./pages/ArticleDetailPage'));\nconst ActivityDetailPage = lazy(() => import('./pages/ActivityDetailPage'));\nconst MatchDetailPage = lazy(() => import('./pages/MatchDetailPage'));\nconst ClubPage = lazy(() => import('./pages/ClubPage'));\nconst CalendarPage = lazy(() => import('./pages/CalendarPage'));\nconst TablesPage = lazy(() => import('./pages/TablesPage'));\nconst MatchesPage = lazy(() => import('./pages/MatchesPage'));\nconst PlayersPage = lazy(() => import('./pages/PlayersPage'));\nconst PlayerDetailPage = lazy(() => import('./pages/PlayerDetailPage'));\nconst SponsorsPage = lazy(() => import('./pages/SponsorsPage'));\nconst ContactPage = lazy(() => import('./pages/ContactPage'));\nconst GalleryPage = lazy(() => import('./pages/GalleryPage'));\nconst AlbumDetailPage = lazy(() => import('./pages/AlbumDetailPage'));\nconst AuthPage = lazy(() => import('./pages/AuthPage'));\nconst RegisterPage = lazy(() => import('./pages/RegisterPage'));\nconst ForgotPasswordPage = lazy(() => import('./pages/ForgotPasswordPage'));\nconst ResetPasswordPage = lazy(() => import('./pages/ResetPasswordPage'));\nconst ActivitiesCalendarPage = lazy(() => import('./pages/ActivitiesCalendarPage'));\nconst AboutPage = lazy(() => import('./pages/AboutPage'));\nconst SetupPage = lazy(() => import('./pages/SetupPage'));\nconst StylePreviewPage = lazy(() => import('./pages/StylePreviewPage'));\nconst NewsletterUnsubscribePage = lazy(() => import('./pages/NewsletterUnsubscribePage'));\nconst NewsletterPreferencesPage = lazy(() => import('./pages/NewsletterPreferencesPage'));\nconst VideosPage = lazy(() => import('./pages/VideosPage'));\nconst SearchPage = lazy(() => import('./pages/SearchPage'));\nconst ClothingPage = lazy(() => import('./pages/ClothingPage'));\nconst PollsPage = lazy(() => import('./pages/PollsPage'));\nconst OverlayScoreboardPage = lazy(() => import('./pages/OverlayScoreboardPage'));\nconst OverlaySponsorsPage = lazy(() => import('./pages/OverlaySponsorsPage'));\nconst NotFoundPage = lazy(() => import('./pages/NotFoundPage'));\nconst ForbiddenPage = lazy(() => import('./pages/ForbiddenPage'));\nconst I18nTestPage = lazy(() => import('./pages/I18nTestPage'));\n\n// Legal pages\nconst CookiePolicyPage = lazy(() => import('./pages/legal/CookiePolicyPage'));\nconst TermsPage = lazy(() => import('./pages/legal/TermsPage'));\nconst PrivacyPolicyPage = lazy(() => import('./pages/legal/PrivacyPolicyPage'));\n\n// Admin pages\nconst AdminDashboardPage = lazy(() => import('./pages/admin/AdminDashboardPage'));\nconst ArticlesAdminPage = lazy(() => import('./pages/admin/ArticlesAdminPage'));\nconst SponsorsAdminPage = lazy(() => import('./pages/admin/SponsorsAdminPage'));\nconst MatchesAdminPage = lazy(() => import('./pages/admin/MatchesAdminPage'));\nconst PlayersAdminPage = lazy(() => import('./pages/admin/PlayersAdminPage'));\nconst TeamsAdminPage = lazy(() => import('./pages/admin/TeamsAdminPage'));\nconst BannersAdminPage = lazy(() => import('./pages/admin/BannersAdminPage'));\nconst MessagesAdminPage = lazy(() => import('./pages/admin/MessagesAdminPage'));\nconst SettingsAdminPage = lazy(() => import('./pages/admin/SettingsAdminPage'));\nconst UsersAdminPage = lazy(() => import('./pages/admin/UsersAdminPage'));\nconst NewsletterAdminPage = lazy(() => import('./pages/admin/NewsletterAdminPage'));\nconst CompetitionAliasesAdminPage = lazy(() => import('./pages/admin/CompetitionAliasesAdminPage'));\nconst PrefetchAdminPage = lazy(() => import('./pages/admin/PrefetchAdminPage'));\nconst AdminVideosPage = lazy(() => import('./pages/admin/AdminVideosPage'));\nconst GalleryAdminPage = lazy(() => import('./pages/admin/GalleryAdminPage'));\nconst AdminActivitiesPage = lazy(() => import('./pages/admin/AdminActivitiesPage'));\nconst AdminMerchPage = lazy(() => import('./pages/admin/AdminMerchPage'));\nconst AdminEshopProductsPage = lazy(() => import('./pages/admin/AdminEshopProductsPage'));\nconst AdminResetPasswordPage = lazy(() => import('./pages/admin/AdminResetPasswordPage'));\nconst AboutAdminPage = lazy(() => import('./pages/admin/AboutAdminPage'));\nconst AnalyticsAdminPage = lazy(() => import('./pages/admin/AnalyticsAdminPage'));\nconst FilesAdminPage = lazy(() => import('./pages/admin/FilesAdminPage'));\nconst ContactsAdminPage = lazy(() => import('./pages/admin/ContactsAdminPage'));\nconst NavigationAdminPage = lazy(() => import('./pages/admin/NavigationAdminPage'));\nconst PollsAdminPage = lazy(() => import('./pages/admin/PollsAdminPage'));\nconst CommentsAdminPage = lazy(() => import('./pages/admin/CommentsAdminPage'));\nconst AdminDocsPage = lazy(() => import('./pages/admin/AdminDocsPage'));\nconst ScoreboardAdminPage = lazy(() => import('./pages/admin/ScoreboardAdminPage'));\nconst MobileScoreboardControlPage = lazy(() => import('./pages/admin/MobileScoreboardControlPage'));\nconst ShortlinksAdminPage = lazy(() => import('./pages/admin/ShortlinksAdminPage'));\nconst EngagementAdminPage = lazy(() => import('./pages/admin/EngagementAdminPage'));\nconst SweepstakesAdminPage = lazy(() => import('./pages/admin/SweepstakesAdminPage'));\nconst SweepstakeVisualPage = lazy(() => import('./pages/admin/SweepstakeVisualPage'));\nconst I18nAdminPage = lazy(() => import('./pages/admin/I18nAdminPage'));\nconst SemiAdminPage = lazy(() => import('./pages/SemiAdminPage'));\nconst ErrorsAdminPage = lazy(() => import('./pages/admin/ErrorsAdminPage'));\nconst ManualFacrAdminPage = lazy(() => import('./pages/admin/ManualFacrAdminPage'));\nconst FinancialDashboard = lazy(() => import('./pages/admin/FinancialDashboard'));\nconst QRCodesAdminPage = lazy(() => import('./pages/admin/QRCodesAdminPage'));\nconst ExpensesPage = lazy(() => import('./pages/admin/ExpensesPage'));\nconst InvoicesPage = lazy(() => import('./pages/admin/InvoicesPage'));\nconst InvoiceSettingsPage = lazy(() => import('./pages/admin/InvoiceSettingsPage'));\nconst KontaktyPage = lazy(() => import('./pages/admin/KontaktyPage'));\nconst TicketAdminPage = lazy(() => import('./pages/admin/TicketAdminPage'));\n\n// Analytics and font loader\nconst AnalyticsInitializer: React.FC = () => {\n useUmami();\n return null;\n};\n\nconst FontLoader: React.FC = () => {\n useFontLoader();\n return null;\n};\n\n// Public route wrapper\nconst PublicRoute = ({ children }: { children: React.ReactNode }) => {\n const { isAuthenticated, isLoading, user } = useAuth();\n const [checkingSetup, setCheckingSetup] = useState(true);\n const [requiresSetup, setRequiresSetup] = useState<boolean>(false);\n\n useEffect(() => {\n let mounted = true;\n (async () => {\n try {\n const s = await getSetupStatus();\n if (mounted) setRequiresSetup(!!s.requires_setup);\n } catch (_) {\n if (mounted) setRequiresSetup(false);\n } finally {\n if (mounted) setCheckingSetup(false);\n }\n })();\n return () => { mounted = false; };\n }, []);\n\n if (isLoading || checkingSetup) {\n return <PageLoader />;\n }\n\n if (isAuthenticated) {\n const role = (user as any)?.role;\n if (role === 'admin') {\n return <Navigate to=\"/admin\" replace />;\n }\n if (role === 'editor') {\n return <Navigate to=\"/admin/clanky\" replace />;\n }\n return <Navigate to=\"/\" replace />;\n }\n\n const currentPath = window.location.pathname;\n if (requiresSetup && currentPath !== '/setup') {\n return <Navigate to=\"/setup\" replace />;\n }\n\n return <>{children}</>;\n};\n\nconst AdminRoutesWrapper = () => {\n return <Outlet />;\n};\n\n// Admin index: admins and editors see the main dashboard; others are forbidden\nconst AdminIndexRoute: React.FC = () => {\n const { user } = useAuth();\n const role = String((user as any)?.role || '').toLowerCase();\n if (role === 'admin' || role === 'editor') {\n return <AdminDashboardPage />;\n }\n return <Navigate to=\"/403\" replace />;\n};\n\n// Premium-aware route elements (wait for settings before deciding)\nconst HomeRoute: React.FC = () => {\n const { data, isLoading } = usePublicSettings();\n if (isLoading && !data) return <PageLoader />;\n return data?.premium ? <PremiumHomePage /> : <HomePage />;\n};\nconst BlogRoute: React.FC = () => {\n const { data, isLoading } = usePublicSettings();\n if (isLoading && !data) return <PageLoader />;\n return data?.premium ? <PremiumBlogPage /> : <BlogPage />;\n};\nconst NotFoundRoute: React.FC = () => {\n const { data, isLoading } = usePublicSettings();\n if (isLoading && !data) return <PageLoader />;\n return data?.premium ? <PremiumNotFound /> : <NotFoundPage />;\n};\n\nconst AppLazy: React.FC = () => {\n return (\n <ChakraProvider theme={theme}>\n <QueryClientProvider client={queryClient}>\n <Router>\n <AuthProvider>\n <ClubThemeProvider>\n <HelmetProvider>\n <AnalyticsInitializer />\n <FontLoader />\n <DefaultSEO />\n <ConfirmDialogProvider>\n <ServiceWorkerUpdateListener />\n <Suspense fallback={<PageLoader />}>\n <Routes>\n {/* Public routes */}\n <Route path=\"/\" element={<HomeRoute />} />\n <Route path=\"/hledat\" element={<SearchPage />} />\n <Route path=\"/search\" element={<SearchPage />} />\n <Route path=\"/overlay/scoreboard\" element={<OverlayScoreboardPage />} />\n <Route path=\"/overlay/sponsors\" element={<OverlaySponsorsPage />} />\n <Route path=\"/i18n-test\" element={<I18nTestPage />} />\n <Route path=\"/blog\" element={<BlogRoute />} />\n <Route path=\"/klub\" element={<ClubPage />} />\n <Route path=\"/o-klubu\" element={<AboutPage />} />\n <Route path=\"/kalendar\" element={<CalendarPage />} />\n <Route path=\"/aktivity\" element={<ActivitiesCalendarPage />} />\n <Route path=\"/tabulky\" element={<TablesPage />} />\n <Route path=\"/zapasy\" element={<MatchesPage />} />\n <Route path=\"/players\" element={<PlayersPage />} />\n <Route path=\"/hraci\" element={<PlayersPage />} />\n <Route path=\"/players/:id\" element={<PlayerDetailPage />} />\n <Route path=\"/hraci/:id\" element={<PlayerDetailPage />} />\n <Route path=\"/sponzori\" element={<SponsorsPage />} />\n <Route path=\"/kontakt\" element={<ContactPage />} />\n <Route path=\"/ankety\" element={<PollsPage />} />\n <Route path=\"/galerie\" element={<GalleryPage />} />\n <Route path=\"/galerie/album/:id\" element={<AlbumDetailPage />} />\n <Route path=\"/videa\" element={<VideosPage />} />\n <Route path=\"/obleceni\" element={<ClothingPage />} />\n \n {/* Legal pages */}\n <Route path=\"/pravidla-cookies\" element={<CookiePolicyPage />} />\n <Route path=\"/obchodni-podminky\" element={<TermsPage />} />\n <Route path=\"/zasady-ochrany-osobnich-udaju\" element={<PrivacyPolicyPage />} />\n \n {/* Article routes */}\n <Route path=\"/news\" element={<Navigate to=\"/blog\" replace />} />\n <Route path=\"/news/:slug\" element={<ArticleDetailPage />} />\n <Route path=\"/articles/slug/:slug\" element={<ArticleDetailPage />} />\n <Route path=\"/articles/:id\" element={<ArticleDetailPage />} />\n <Route path=\"/zapas/:id\" element={<MatchDetailPage />} />\n <Route path=\"/aktivita/:id\" element={<ActivityDetailPage />} />\n \n {/* Redirects */}\n <Route path=\"/clanky\" element={<Navigate to=\"/blog\" replace />} />\n <Route path=\"/aktuality\" element={<Navigate to=\"/blog\" replace />} />\n \n {/* Setup */}\n <Route path=\"/setup\" element={<PublicRoute><SetupPage /></PublicRoute>} />\n <Route path=\"/setup/styl\" element={<PublicRoute><StylePreviewPage /></PublicRoute>} />\n \n {/* Auth */}\n <Route path=\"/login\" element={<PublicRoute><AuthPage /></PublicRoute>} />\n <Route path=\"/register\" element={<PublicRoute><RegisterPage /></PublicRoute>} />\n <Route path=\"/forgot-password\" element={<ForgotPasswordPage />} />\n <Route path=\"/reset-password\" element={<ResetPasswordPage />} />\n <Route path=\"/newsletter/unsubscribe/:email\" element={<NewsletterUnsubscribePage />} />\n <Route path=\"/newsletter/preferences\" element={<NewsletterPreferencesPage />} />\n <Route path=\"/403\" element={<ForbiddenPage />} />\n <Route path=\"/semiadmin\" element={<ProtectedRoute><SemiAdminPage /></ProtectedRoute>} />\n\n {/* Admin index: allow both admins and editors; decide inside */}\n <Route\n path=\"/admin\"\n element={\n <ProtectedRoute>\n <AdminIndexRoute />\n </ProtectedRoute>\n }\n />\n\n {/* Editor-level content admin routes (accessible to editors and admins) */}\n <Route element={<ProtectedRoute requiredRole=\"editor\"><AdminRoutesWrapper /></ProtectedRoute>}>\n <Route path=\"/admin/clanky\" element={<ArticlesAdminPage />} />\n <Route path=\"/admin/aktivity\" element={<AdminActivitiesPage />} />\n <Route path=\"/admin/shortlinks\" element={<ShortlinksAdminPage />} />\n <Route path=\"/admin/tymy\" element={<TeamsAdminPage />} />\n <Route path=\"/admin/zapasy\" element={<MatchesAdminPage />} />\n <Route path=\"/admin/hraci\" element={<PlayersAdminPage />} />\n <Route path=\"/admin/aliasy-soutezi\" element={<CompetitionAliasesAdminPage />} />\n <Route path=\"/admin/o-klubu\" element={<AboutAdminPage />} />\n <Route path=\"/admin/videa\" element={<AdminVideosPage />} />\n <Route path=\"/admin/galerie\" element={<GalleryAdminPage />} />\n <Route path=\"/admin/scoreboard\" element={<ScoreboardAdminPage />} />\n <Route path=\"/admin/scoreboard/remote\" element={<MobileScoreboardControlPage />} />\n </Route>\n\n {/* Admin routes */}\n <Route element={<ProtectedRoute requiredRole=\"admin\"><AdminRoutesWrapper /></ProtectedRoute>}>\n <Route path=\"/admin/docs\" element={<AdminDocsPage />} />\n <Route path=\"/admin/eshop-produkty\" element={<AdminEshopProductsPage />} />\n <Route path=\"/admin/obleceni\" element={<AdminMerchPage />} />\n <Route path=\"/admin/sponzori\" element={<SponsorsAdminPage />} />\n <Route path=\"/admin/uzivatele\" element={<UsersAdminPage />} />\n <Route path=\"/admin/bannery\" element={<BannersAdminPage />} />\n <Route path=\"/admin/zpravy\" element={<MessagesAdminPage />} />\n <Route path=\"/admin/nastaveni\" element={<SettingsAdminPage />} />\n <Route path=\"/admin/newsletter\" element={<NewsletterAdminPage />} />\n <Route path=\"/admin/ankety\" element={<PollsAdminPage />} />\n <Route path=\"/admin/prefetch\" element={<PrefetchAdminPage />} />\n <Route path=\"/admin/users/send-reset\" element={<AdminResetPasswordPage />} />\n <Route path=\"/admin/analytika\" element={<AnalyticsAdminPage />} />\n <Route path=\"/admin/errors\" element={<ErrorsAdminPage />} />\n <Route path=\"/admin/soubory\" element={<FilesAdminPage />} />\n <Route path=\"/admin/kontakty\" element={<ContactsAdminPage />} />\n <Route path=\"/admin/navigace\" element={<NavigationAdminPage />} />\n <Route path=\"/admin/komentare\" element={<CommentsAdminPage />} />\n <Route path=\"/admin/shortlinks\" element={<ShortlinksAdminPage />} />\n <Route path=\"/admin/engagement\" element={<EngagementAdminPage />} />\n <Route path=\"/admin/sweepstakes\" element={<SweepstakesAdminPage />} />\n <Route path=\"/admin/sweepstakes/:id/visual\" element={<SweepstakeVisualPage />} />\n <Route path=\"/admin/i18n\" element={<I18nAdminPage />} />\n <Route path=\"/admin/manual-data\" element={<ManualFacrAdminPage />} />\n <Route path=\"/admin/financial-dashboard\" element={<FinancialDashboard />} />\n <Route path=\"/admin/qr-codes\" element={<QRCodesAdminPage />} />\n <Route path=\"/admin/expenses\" element={<ExpensesPage />} />\n <Route path=\"/admin/invoices\" element={<InvoicesPage />} />\n <Route path=\"/admin/invoice-settings\" element={<InvoiceSettingsPage />} />\n <Route path=\"/admin/customers\" element={<KontaktyPage />} />\n <Route path=\"/admin/tickets\" element={<TicketAdminPage />} />\n </Route>\n\n {/* Legacy admin routes */}\n <Route path=\"/dashboard\" element={<Navigate to=\"/admin\" replace />} />\n <Route path=\"/admin/sponsors\" element={<ProtectedRoute requiredRole=\"admin\"><SponsorsAdminPage /></ProtectedRoute>} />\n <Route path=\"/admin/banners\" element={<ProtectedRoute requiredRole=\"admin\"><BannersAdminPage /></ProtectedRoute>} />\n <Route path=\"/admin/messages\" element={<ProtectedRoute requiredRole=\"admin\"><MessagesAdminPage /></ProtectedRoute>} />\n <Route path=\"/admin/settings\" element={<ProtectedRoute requiredRole=\"admin\"><SettingsAdminPage /></ProtectedRoute>} />\n\n {/* 404 */}\n <Route path=\"*\" element={<NotFoundRoute />} />\n </Routes>\n </Suspense>\n <CookieBanner />\n </ConfirmDialogProvider>\n </HelmetProvider>\n </ClubThemeProvider>\n </AuthProvider>\n </Router>\n </QueryClientProvider>\n </ChakraProvider>\n );\n};\n\nexport default AppLazy;\n","import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","// Service Worker registration for PWA support\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n window.location.hostname === '[::1]' ||\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n const publicUrl = new URL(process.env.PUBLIC_URL || '', window.location.href);\n \n if (publicUrl.origin !== window.location.origin) {\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n checkValidServiceWorker(swUrl, config);\n navigator.serviceWorker.ready.then(() => {\n console.log('Service worker is ready in development mode');\n });\n } else {\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n \n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n console.log('New content available; please refresh.');\n \n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n console.log('Content cached for offline use.');\n \n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then((response) => {\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log('No internet connection found. App is running in offline mode.');\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n}\n\n// Clear cache and update service worker\nexport function clearCacheAndUpdate() {\n if ('serviceWorker' in navigator && navigator.serviceWorker.controller) {\n navigator.serviceWorker.controller.postMessage({\n type: 'CLEAR_CACHE',\n });\n }\n}\n\n// Prompt user to update when new version available\nexport function promptUserToUpdate(registration: ServiceWorkerRegistration) {\n try {\n const event = new CustomEvent('sw-update-available', {\n detail: { registration },\n });\n window.dispatchEvent(event);\n } catch {\n if (registration.waiting) {\n registration.waiting.postMessage({ type: 'SKIP_WAITING' });\n window.location.reload();\n }\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport './index.css';\nimport './styles/global-enhancements.css';\nimport './styles/admin-enhancements.css';\nimport './styles/home-style-pack.css';\nimport './styles/sparta-styles.css';\n// Quill editor styles (MUST be imported globally) - CRITICAL for rich text editor\nimport 'quill/dist/quill.snow.css';\nimport 'react-image-crop/dist/ReactCrop.css';\n// Custom editor styles AFTER quill base styles to ensure proper override\nimport './styles/custom-editor.css';\n// Public rich content styles to mirror Quill rendering outside editor\nimport './styles/public-rich-content.css';\n// Import i18n configuration\nimport './i18n';\nimport { theme } from './App';\nimport AppLazy from './App.lazy';\nimport { ColorModeScript } from '@chakra-ui/react';\nimport { HelmetProvider } from 'react-helmet-async';\nimport reportWebVitals from './reportWebVitals';\nimport * as serviceWorkerRegistration from './serviceWorkerRegistration';\nimport { promptUserToUpdate } from './serviceWorkerRegistration';\nimport { installGlobalErrorHandlers, reportError } from './services/errorReporter';\n// Cookie consent utilities\ntype Consent = { analytics?: boolean };\nconst getConsent = (): Consent | null => {\n try {\n const raw = localStorage.getItem('cookie_consent');\n return raw ? JSON.parse(raw) : null;\n } catch {\n return null;\n }\n};\nconst onConsentChange = (cb: (c: Consent) => void) => {\n window.addEventListener('cookie-consent-change', (e: Event) => {\n const detail = (e as CustomEvent).detail as Consent;\n cb(detail || {});\n });\n};\n// Example analytics initializer (placeholder)\nconst initAnalytics = () => {\n // Place your analytics loader here (e.g., GA/Matomo), gated by consent.analytics\n // This function will be called only when analytics consent is granted.\n};\n\n// Error Boundary component\nclass ErrorBoundary extends React.Component<{children: React.ReactNode}, {hasError: boolean}> {\n constructor(props: {children: React.ReactNode}) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n reportError({ message: error.message, stack: error.stack, component: 'ErrorBoundary', context: { react: errorInfo.componentStack } });\n console.error('Error caught by ErrorBoundary:', error, errorInfo);\n }\n\n render() {\n if (this.state.hasError) {\n return (\n <div style={{ padding: '20px', fontFamily: 'Arial, sans-serif' }}>\n <h2>Something went wrong.</h2>\n <p>Please refresh the page or try again later.</p>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n\ninstallGlobalErrorHandlers();\nwindow.addEventListener('unhandledrejection', (event) => {\n const reason: any = (event as any).reason;\n const message = typeof reason === 'string' ? reason : (reason?.message || 'Unhandled rejection');\n const stack = typeof reason === 'object' ? (reason?.stack || '') : '';\n reportError({ message, stack });\n});\n\nconst rootElement = document.getElementById('root');\n\nif (!rootElement) {\n // Failed to find the root element\n} else {\n try {\n // Initialize CSS variables immediately to prevent flash of fallback colors\n const r = document.documentElement;\n \n // Try to load cached colors from localStorage for instant display\n let cachedColors: any = null;\n try {\n const cached = localStorage.getItem('club_theme_cache');\n if (cached) {\n cachedColors = JSON.parse(cached);\n // Use cache if it's less than 24 hours old\n const age = Date.now() - (cachedColors.timestamp || 0);\n if (age > 24 * 60 * 60 * 1000) {\n cachedColors = null; // Cache expired\n }\n }\n } catch (e) {\n // Ignore localStorage errors\n }\n \n // Set CSS variables - use cached values if available, otherwise defaults\n r.style.setProperty('--club-primary', cachedColors?.primary || '#0b5cff');\n r.style.setProperty('--club-secondary', cachedColors?.secondary || '#ffd200');\n r.style.setProperty('--club-accent', cachedColors?.accent || '#141414');\n r.style.setProperty('--club-text-on-primary', cachedColors?.textOnPrimary || '#ffffff');\n if (cachedColors?.textOnSecondary) r.style.setProperty('--club-text-on-secondary', cachedColors.textOnSecondary);\n if (cachedColors?.textOnAccent) r.style.setProperty('--club-text-on-accent', cachedColors.textOnAccent);\n r.style.setProperty('--club-bg-light', cachedColors?.background || '#ffffff');\n r.style.setProperty('--club-text-light', cachedColors?.text || '#000000');\n \n // Load fonts\n const link = document.createElement('link');\n link.href = 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Montserrat:wght@600;700;800&display=swap';\n link.rel = 'stylesheet';\n document.head.appendChild(link);\n\n const root = ReactDOM.createRoot(\n document.getElementById('root') as HTMLElement\n );\n\n root.render(\n <React.StrictMode>\n <HelmetProvider>\n <ErrorBoundary>\n {/* Ensure color mode (light/dark) persists and matches Chakra config before UI renders */}\n <ColorModeScript initialColorMode={theme.config.initialColorMode} />\n <AppLazy />\n </ErrorBoundary>\n </HelmetProvider>\n </React.StrictMode>\n );\n // App rendered\n // Initialize analytics if consent allows\n const current = getConsent();\n if (current?.analytics) {\n initAnalytics();\n }\n // React to future consent changes\n onConsentChange((c) => {\n if (c?.analytics) {\n initAnalytics();\n }\n });\n } catch (error) {\n // Optionally report to monitoring service\n // console.error('Error rendering application:', error);\n rootElement.innerHTML = `\n <div style=\"padding: 20px; font-family: Arial, sans-serif; color: #721c24; background-color: #f8d7da; border: 1px solid #f5c6cb; border-radius: 4px;\">\n <h2>Application Error</h2>\n <p>${String(error)}</p>\n <p>Please check the console for more details and refresh the page.</p>\n </div>\n `;\n }\n}\n\n// Report web vitals (disabled logging by default). Hook up your analytics here if needed.\nreportWebVitals();\n\n// Enable PWA service worker with user prompt on updates\nserviceWorkerRegistration.register({ onUpdate: promptUserToUpdate });\n","import axios, { AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from 'axios';\nimport { reportError } from './errorReporter';\nimport { getToken } from '../utils/auth';\nimport { logAction } from './actionLog';\n\nfunction readStored(key: string): string | null {\n try { return localStorage.getItem(key); } catch { return null; }\n}\n\nconst storedApi = typeof window !== 'undefined' ? (readStored('fc_api_base_url') || readStored('api_base_url')) : null;\nconst envApiUrl = process.env.REACT_APP_API_URL || process.env.REACT_APP_API_BASE_URL;\nlet API_URL = storedApi || envApiUrl || '/api/v1';\n\ntry {\n const maybe = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : undefined);\n if (!/\\/api\\//.test(maybe.pathname)) {\n maybe.pathname = maybe.pathname.replace(/\\/$/, '') + '/api/v1';\n API_URL = maybe.toString();\n } else {\n API_URL = maybe.toString();\n }\n} catch {}\n\nexport const api: AxiosInstance = axios.create({\n baseURL: API_URL,\n headers: {\n // If admin token provided at build time, include it only in non-production env\n ...((process.env.NODE_ENV !== 'production' && process.env.REACT_APP_ADMIN_TOKEN)\n ? { 'X-Admin-Token': process.env.REACT_APP_ADMIN_TOKEN }\n : {}),\n // Dev bypass header to allow protected calls in non-production (middleware DevBypass)\n ...((process.env.NODE_ENV !== 'production') ? { 'X-Dev-Admin': 'true' } : {}),\n },\n // Send cookies for same-site or allowed CORS origins\n withCredentials: true,\n // Prevent infinite loading spinners if backend is down or unreachable\n timeout: 20000, // 20 seconds to better tolerate slower endpoints\n});\n\n// Simple in-memory CSRF token cache\nlet csrfTokenCache: { token: string; fetchedAt: number } | null = null;\nasync function getCsrfToken(): Promise<string | null> {\n try {\n // Refresh token every 45 minutes\n const now = Date.now();\n if (csrfTokenCache && now - csrfTokenCache.fetchedAt < 45 * 60 * 1000) {\n return csrfTokenCache.token;\n }\n const res = await fetch(`${API_URL.replace(/\\/$/, '')}/csrf-token`, {\n credentials: 'include',\n headers: { 'Accept': 'application/json' },\n });\n if (!res.ok) return null;\n const data = await res.json();\n const token = data?.csrf_token || null;\n if (token) {\n csrfTokenCache = { token, fetchedAt: now };\n }\n return token;\n } catch {\n return null;\n }\n}\n\n// Request interceptor - attach bearer token when available\napi.interceptors.request.use(\n async (config: InternalAxiosRequestConfig) => {\n (config as any).metadata = { ...(config as any).metadata, start: Date.now() };\n const token = getToken();\n config.headers = config.headers || {} as any;\n if (token) {\n (config.headers as any).Authorization = `Bearer ${token}`;\n }\n // Dev helper: attach X-Admin-Token from localStorage if present (allows admin calls without rebuild)\n if (process.env.NODE_ENV !== 'production') {\n try {\n const devAdmin = readStored('fc_admin_token');\n if (devAdmin && !(config.headers as any)['X-Admin-Token']) {\n (config.headers as any)['X-Admin-Token'] = devAdmin;\n (config.headers as any)['X-Dev-Admin'] = 'true';\n }\n } catch {}\n }\n // For cookie-based flows (no Bearer header), attach X-CSRF-Token on mutating methods\n const method = (config.method || 'get').toLowerCase();\n const isMutating = method === 'post' || method === 'put' || method === 'patch' || method === 'delete';\n const hasAuth = !!(config.headers as any).Authorization;\n if (isMutating && !hasAuth) {\n const csrf = await getCsrfToken();\n if (csrf) {\n (config.headers as any)['X-CSRF-Token'] = csrf;\n }\n }\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n);\n\n// Response interceptor\napi.interceptors.response.use(\n (response: AxiosResponse) => response,\n (error) => {\n try {\n const status = error?.response?.status;\n try {\n const cfg = error?.config || {};\n const method: string = (cfg?.method || 'get').toUpperCase();\n const url: string = cfg?.url || '';\n const start: number | undefined = (cfg as any)?.metadata?.start;\n const ms = typeof start === 'number' ? Date.now() - start : undefined;\n logAction({ type: 'request', at: Date.now(), method, url, status, ms, ok: false });\n } catch {}\n if (typeof status === 'number' && status >= 500) {\n const reqUrl: string = error.config?.url || '';\n const method: string = (error.config?.method || 'get').toUpperCase();\n const requestId: string | undefined = error.response?.headers?.['x-request-id'] || error.response?.headers?.['X-Request-ID'];\n reportError({ message: `HTTP ${status} ${method} ${reqUrl}`, status, method, url: reqUrl, request_id: requestId });\n }\n } catch {}\n if (error.response?.status === 401) {\n // Avoid redirect loop on the login call itself\n const reqUrl: string = error.config?.url || '';\n const isLoginEndpoint = reqUrl.endsWith('/auth/login') || reqUrl.includes('/auth/login');\n // Do not force redirect for public endpoints like file uploads; let the caller handle it.\n const isUploadEndpoint = reqUrl.endsWith('/upload') || reqUrl.includes('/upload');\n if (!isLoginEndpoint) {\n // Redirect to login unless already there and not an exempt endpoint\n if (!isUploadEndpoint) {\n if (window.location.pathname !== '/login') {\n window.location.href = '/login';\n }\n }\n }\n }\n return Promise.reject(error);\n }\n);\n\napi.interceptors.response.use((response: AxiosResponse) => {\n try {\n const cfg = response.config || {} as any;\n const method: string = (cfg?.method || 'get').toUpperCase();\n const url: string = cfg?.url || '';\n const start: number | undefined = (cfg as any)?.metadata?.start;\n const ms = typeof start === 'number' ? Date.now() - start : undefined;\n const status = response.status;\n logAction({ type: 'request', at: Date.now(), method, url, status, ms, ok: true });\n } catch {}\n return response;\n});\n\n// Upload image helper\nexport const uploadImage = async (formData: FormData): Promise<{ url: string }> => {\n const res = await api.post('/upload', formData, {\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n });\n return res.data;\n};\n\nexport { API_URL };\nexport default api;\n","import React from 'react';\nimport {\n Box,\n Image,\n Popover,\n PopoverTrigger,\n PopoverContent,\n PopoverBody,\n useColorModeValue,\n Portal,\n} from '@chakra-ui/react';\n\nexport interface ThumbnailPreviewProps {\n src: string;\n alt: string;\n size?: string;\n previewSize?: string;\n borderRadius?: string;\n objectFit?: 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';\n}\n\n/**\n * ThumbnailPreview - Small thumbnail image with hover to show larger preview\n * Perfect for admin table rows where you want to see images without clicking\n */\nconst ThumbnailPreview: React.FC<ThumbnailPreviewProps> = ({\n src,\n alt,\n size = '48px',\n previewSize = '300px',\n borderRadius = 'md',\n objectFit = 'cover',\n}) => {\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const bgColor = useColorModeValue('white', 'gray.800');\n\n return (\n <Popover trigger=\"hover\" placement=\"right\" openDelay={200} closeDelay={100}>\n <PopoverTrigger>\n <Box\n cursor=\"pointer\"\n transition=\"all 0.2s\"\n _hover={{ transform: 'scale(1.05)', boxShadow: 'md' }}\n >\n <Image\n src={src}\n alt={alt}\n boxSize={size}\n objectFit={objectFit}\n borderRadius={borderRadius}\n borderWidth=\"1px\"\n borderColor={borderColor}\n fallbackSrc=\"/dist/img/logo-club-empty.svg\"\n loading=\"lazy\"\n />\n </Box>\n </PopoverTrigger>\n <Portal>\n <PopoverContent\n width={previewSize}\n borderColor={borderColor}\n boxShadow=\"2xl\"\n bg={bgColor}\n _focus={{ boxShadow: '2xl' }}\n >\n <PopoverBody p={0}>\n <Image\n src={src}\n alt={`${alt} - preview`}\n width=\"100%\"\n maxH=\"400px\"\n objectFit=\"contain\"\n borderRadius=\"md\"\n fallbackSrc=\"/dist/img/logo-club-empty.svg\"\n loading=\"lazy\"\n />\n </PopoverBody>\n </PopoverContent>\n </Portal>\n </Popover>\n );\n};\n\nexport default ThumbnailPreview;\n","import api from './api';\nimport { IconType } from 'react-icons';\nimport {\n FaRegClipboard,\n FaBullseye,\n FaMapSigns,\n FaColumns,\n FaFlag,\n FaNewspaper,\n FaFutbol,\n FaUsers,\n FaTable,\n FaChartLine,\n FaCalendarAlt,\n FaHandshake,\n FaTshirt,\n FaCommentDots,\n FaTrophy,\n FaBookOpen,\n FaImages,\n FaVideo,\n FaBroadcastTower,\n FaPodcast,\n FaHashtag,\n FaEnvelopeOpenText,\n FaPhoneAlt,\n FaHourglassHalf,\n FaPoll,\n FaQuestionCircle,\n FaSearch,\n FaMapMarkedAlt,\n FaCalendarCheck,\n FaCloudSun,\n FaTicketAlt,\n FaCube\n} from 'react-icons/fa';\n\n// Use shared API base URL\n\nexport interface PageElementConfig {\n id?: number;\n page_type: string;\n element_name: string;\n variant: string;\n visible?: boolean;\n display_order?: number;\n settings?: Record<string, any>;\n created_at?: string;\n updated_at?: string;\n}\n\n// Public endpoints\nexport const getPageElementConfigs = async (pageType: string): Promise<PageElementConfig[]> => {\n const response = await api.get('/page-elements', {\n params: { page_type: pageType }\n });\n return response.data || [];\n};\n\n// Admin endpoints\nexport const getAllPageElementConfigs = async (): Promise<PageElementConfig[]> => {\n const response = await api.get('/admin/page-elements');\n return response.data || [];\n};\n\nexport const createOrUpdatePageElementConfig = async (config: Partial<PageElementConfig>): Promise<PageElementConfig> => {\n const response = await api.post('/admin/page-elements', config);\n return response.data;\n};\n\nexport const updatePageElementConfig = async (id: number, config: Partial<PageElementConfig>): Promise<PageElementConfig> => {\n const response = await api.put(`/admin/page-elements/${id}`, config);\n return response.data;\n};\n\nexport const deletePageElementConfig = async (id: number): Promise<void> => {\n await api.delete(`/admin/page-elements/${id}`);\n};\n\nexport const batchUpdatePageElementConfigs = async (configs: PageElementConfig[]): Promise<{ message: string; updated: number; created: number }> => {\n const response = await api.post('/admin/page-elements/batch', configs);\n return response.data;\n};\n\n// Element variant definitions\nexport interface ElementVariant {\n value: string;\n label: string;\n description: string;\n preview?: string;\n}\n\n// Predefined element types that can be added to pages\nexport interface PredefinedElement {\n name: string;\n label: string;\n description: string;\n icon: IconType;\n category: 'content' | 'media' | 'interactive' | 'layout';\n defaultVariant: string;\n component?: string;\n}\n\nexport const PREDEFINED_ELEMENTS: PredefinedElement[] = [\n // Layout - Rozvržení\n { name: 'style-pack', label: 'Styl balíček', description: 'Globální vizuální balíček pro celou stránku', icon: FaCube, category: 'layout', defaultVariant: 'default' },\n { name: 'container', label: 'Šířka stránky', description: 'Celková šířka rozložení (boxed / plná šířka)', icon: FaColumns, category: 'layout', defaultVariant: 'boxed' },\n { name: 'header', label: 'Hlavička', description: 'Hlavička stránky s logem a navigací', icon: FaRegClipboard, category: 'layout', defaultVariant: 'unified' },\n { 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: 'minimal' },\n { name: 'hero', label: 'Hlavní Sekce', description: 'Hlavní obsahová oblast s úvodním obsahem', icon: FaBullseye, category: 'layout', defaultVariant: 'grid' },\n { name: 'footer', label: 'Patička', description: 'Spodní část stránky s odkazy a kontakty', icon: FaMapSigns, category: 'layout', defaultVariant: 'standard' },\n { name: 'sidebar', label: 'Boční Panel', description: 'Boční sloupec s doplňkovým obsahem', icon: FaColumns, category: 'layout', defaultVariant: 'right' },\n { name: 'banner', label: 'Banner', description: 'Reklamní nebo informační banner', icon: FaFlag, category: 'layout', defaultVariant: 'top' },\n \n // Content - Obsah\n { name: 'news', label: 'Novinky', description: 'Nejnovější články a zprávy', icon: FaNewspaper, category: 'content', defaultVariant: 'grid_one' },\n { name: 'matches', label: 'Zápasy', description: 'Nadcházející a poslední zápasy', icon: FaFutbol, category: 'content', defaultVariant: 'compact' },\n { name: 'matches-slider', label: 'Zápasy (slider)', description: 'Přehled zápasů podle soutěže ve slideru', icon: FaFutbol, category: 'content', defaultVariant: 'carousel' },\n { name: 'team', label: 'Tým', description: 'Hráči a realizační tým', icon: FaUsers, category: 'content', defaultVariant: 'grid' },\n { name: 'table', label: 'Tabulka', description: 'Ligová tabulka', icon: FaTable, category: 'content', defaultVariant: 'split_news' },\n { name: 'stats', label: 'Statistiky', description: 'Týmové a hráčské statistiky', icon: FaChartLine, category: 'content', defaultVariant: 'cards' },\n { name: 'activities', label: 'Akce', description: 'Nadcházející události a aktivity', icon: FaCalendarAlt, category: 'content', defaultVariant: 'list' },\n { name: 'sponsors', label: 'Partneři', description: 'Loga a odkazy partnerů', icon: FaHandshake, category: 'content', defaultVariant: 'grid' },\n { name: 'merch', label: 'Fanshop', description: 'Prodej klubového zboží', icon: FaTshirt, category: 'content', defaultVariant: 'grid' },\n { name: 'testimonials', label: 'Reference', description: 'Hodnocení a ohlasy fanoušků', icon: FaCommentDots, category: 'content', defaultVariant: 'carousel' },\n { name: 'achievements', label: 'Úspěchy', description: 'Trofeje a ocenění klubu', icon: FaTrophy, category: 'content', defaultVariant: 'timeline' },\n { name: 'history', label: 'Historie', description: 'Historie a milníky klubu', icon: FaBookOpen, category: 'content', defaultVariant: 'timeline' },\n \n // Media - Média\n { name: 'gallery', label: 'Galerie', description: 'Photos', icon: FaImages, category: 'media', defaultVariant: 'grid' },\n { name: 'videos', label: 'Videa', description: 'YouTube videa a sestřihy', icon: FaVideo, category: 'media', defaultVariant: 'carousel' },\n { name: 'live', label: 'Live Stream', description: 'Živé přenosy zápasů', icon: FaBroadcastTower, category: 'media', defaultVariant: 'featured' },\n { name: 'podcast', label: 'Podcast', description: 'Zvukové podcasty a komentáře', icon: FaPodcast, category: 'media', defaultVariant: 'list' },\n { name: 'social', label: 'Sociální Sítě', description: 'Příspěvky ze sociálních sítí', icon: FaHashtag, category: 'media', defaultVariant: 'grid' },\n \n // Interactive - Interaktivní\n { name: 'newsletter', label: 'Newsletter', description: 'Formulář pro odběr novinek', icon: FaEnvelopeOpenText, category: 'interactive', defaultVariant: 'default' },\n { name: 'contact', label: 'Kontakt', description: 'Kontaktní formulář', icon: FaPhoneAlt, category: 'interactive', defaultVariant: 'form' },\n { name: 'countdown', label: 'Odpočet', description: 'Odpočet do příštího zápasu', icon: FaHourglassHalf, category: 'interactive', defaultVariant: 'default' },\n { name: 'poll', label: 'Anketa', description: 'Hlasování a ankety pro fanoušky', icon: FaPoll, category: 'interactive', defaultVariant: 'vertical' },\n { name: 'quiz', label: 'Kvíz', description: 'Interaktivní kvízy', icon: FaQuestionCircle, category: 'interactive', defaultVariant: 'card' },\n { name: 'search', label: 'Vyhledávání', description: 'Vyhledávací pole', icon: FaSearch, category: 'interactive', defaultVariant: 'header' },\n { name: 'map', label: 'Mapa', description: 'Mapa stadionu a areálu', icon: FaMapMarkedAlt, category: 'interactive', defaultVariant: 'default' },\n { name: 'calendar', label: 'Kalendář', description: 'Kalendář zápasů a akcí', icon: FaCalendarCheck, category: 'interactive', defaultVariant: 'month' },\n { name: 'weather', label: 'Počasí', description: 'Informace o počasí na stadionu', icon: FaCloudSun, category: 'interactive', defaultVariant: 'widget' },\n { name: 'ticketing', label: 'Vstupenky', description: 'Prodej a rezervace vstupenek', icon: FaTicketAlt, category: 'interactive', defaultVariant: 'widget' },\n];\n\nexport const ELEMENT_VARIANTS: Record<string, ElementVariant[]> = {\n 'style-pack': [\n { value: 'default', label: 'Výchozí', description: 'Základní sjednocený styl' },\n { value: 'modern', label: 'Moderní', description: 'Zaoblené rohy, lehké stíny, více prostoru' },\n { value: 'minimal', label: 'Minimal', description: 'Čisté, bez stínů, tenké rámečky' },\n { value: 'sparta', label: 'Sparta', description: 'Přiblížení k Sparta packu' },\n ],\n container: [\n { value: 'boxed', label: 'Boxované rozložení', description: 'Obsah je zarovnán na střed s odsazením od okrajů' },\n { value: 'wide', label: 'Širší obsah', description: 'O něco širší hlavní obsah (např. pro větší monitory)' },\n { value: 'fullwidth', label: 'Na celou šířku', description: 'Obsah přes celou šířku okna, bez bočních okrajů' },\n ],\n header: [\n { value: 'unified', label: 'Jednotný', description: 'Klasická hlavička s logem a navigací' },\n { value: 'edge', label: 'Okrajový', description: 'Moderní hlavička s gradientem' },\n { value: 'minimal', label: 'Minimální', description: 'Čistý minimalistický design' },\n { value: 'modern', label: 'Moderní', description: 'Odvážný moderní styl s akcenty' },\n { value: 'sticky', label: 'Přilepený', description: 'Pevně přilepená hlavička při scrollování' },\n { value: 'transparent', label: 'Průhledný', description: 'Průhledná hlavička s efektem' },\n { value: 'sparta_navbar', label: 'Sparta Navbar', description: 'AC Sparta Praha styl - burger menu, logo, navigace, vyhledávání' },\n { value: 'current', label: 'Současný', description: 'Stávající navigace' },\n { value: 'fullwidth', label: 'Šířka 100%', description: 'Navigace přes celou šířku obrazovky' },\n ],\n 'hero-topbar': [\n { value: 'brand', label: 'Brand', description: 'Barevná lišta s klubovými barvami a akcemi' },\n { value: 'minimal', label: 'Minimal', description: 'Průhledná/nenápadná lišta' },\n { value: 'badge', label: 'Badge', description: 'Pill styl s klubovou barvou' },\n ],\n hero: [\n { value: 'grid', label: 'Mřížka', description: 'Rozložení ve formě mřížky' },\n { value: 'swiper', label: 'Karusel', description: 'Posuvný karusel' },\n { value: 'swiper_full', label: 'Celý Karusel', description: 'Celoobrazovkový karusel' },\n { value: 'edge', label: 'Okrajový', description: 'Moderní okrajový styl' },\n { value: 'video', label: 'Video', description: 'Hero s pozadím videa' },\n { value: 'split', label: 'Rozdělený', description: 'Rozdělené rozložení text/obraz' },\n { 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' },\n { value: 'sparta_featured_carousel', label: 'Sparta Featured Carousel', description: 'Hero header s pozadím, článek s kategoriemi, thumbnail navigace, auto-swap' },\n ],\n news: [\n { value: 'grid_one', label: 'Mřížka (1 sloupec)', description: 'Jednosloupcová mřížka bez tabulek vpravo (skryje sekci Tabulky)' },\n { value: 'grid_two', label: 'Mřížka (2 sloupce)', description: 'Aktuality vlevo a Tabulky vpravo (pokud jsou k dispozici)' },\n { value: 'grid', label: 'Mřížka', description: 'Rozložení karet v mřížce' },\n { value: 'scroller', label: 'Posuvník', description: 'Horizontální posuvník' },\n { 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' },\n { 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' },\n { value: 'list', label: 'Seznam', description: 'Vertikální seznam' },\n { value: 'magazine', label: 'Magazín', description: 'Stylizace jako časopis' },\n { value: 'masonry', label: 'Zdivo', description: 'Pinterest styl zdiva' },\n { value: 'timeline', label: 'Časová Osa', description: 'Chronologická časová osa' },\n ],\n matches: [\n { value: 'compact', label: 'Kompaktní', description: 'Kompaktní karty zápasů - jeden sloupec (slider + taby dole)' },\n { value: 'compact_split', label: 'Kompaktní Rozdělený', description: 'Kompaktní karty zápasů - dva sloupce (slider vlevo + taby vpravo)' },\n { value: 'expanded', label: 'Rozšířený', description: 'Detailní informace o zápasech' },\n { value: 'timeline', label: 'Časová Osa', description: 'Zobrazení časové osy' },\n { value: 'calendar', label: 'Kalendář', description: 'Kalendářní zobrazení' },\n { value: 'live', label: 'Živě', description: 'Živé výsledky' },\n { value: 'scoreboard', label: 'Tabule', description: 'TV broadcast style - velká tabule skóre s live aktualizacemi' },\n { value: 'ticker', label: 'Ticker', description: 'Scrollující ticker s výsledky a nadcházejícími zápasy' },\n ],\n 'matches-slider': [\n { value: 'carousel', label: 'Karusel', description: 'Horizontální karusel zápasů' },\n { value: 'scroller', label: 'Posuvník', description: 'Plynulý horizontální posuvník' },\n { value: 'ticker', label: 'Ticker', description: 'Úzký ticker výsledků a zápasů' },\n { value: 'compact_split', label: 'Kompaktní rozdělený', description: 'Slider vlevo a taby jako svislé menu vpravo' },\n ],\n sponsors: [\n { value: 'grid', label: 'Mřížka', description: 'Mřížkové rozložení' },\n { value: 'slider', label: 'Posuvník', description: 'Animovaný posuvník' },\n { value: 'scroller', label: 'Horizontální', description: 'Horizontální posuvník' },\n { value: 'logos3', label: 'Horizontální (Logos3)', description: 'Minimalistický horizontální scroller ve stylu shadcn/ui Logos3' },\n { value: 'pyramid', label: 'Pyramida', description: 'Pyramidové rozložení' },\n { value: 'wall', label: 'Zeď', description: 'Zeď partnerů' },\n { value: 'tiered', label: 'Vrstvený', description: 'Úrovně partnerů - Hlavní / Zlatí / Stříbrní / Bronzoví' },\n { value: 'spotlight', label: 'Spotlight', description: 'Velký hlavní partner + menší partneři okolo' },\n { value: 'sparta_partners_pyramid', label: 'Sparta Partners Pyramid', description: 'Tří-úrovňová pyramida partnerů (1 hlavní / 4 střední / více malých)' },\n ],\n gallery: [\n { value: 'grid', label: 'Mřížka', description: 'Fotomřížka' },\n { value: 'masonry', label: 'Zdivo', description: 'Pinterest styl' },\n { value: 'slider', label: 'Posuvník', description: 'Slideshow prezentace' },\n { value: 'lightbox', label: 'Lightbox', description: 'Otevření v lightboxu' },\n { value: 'collage', label: 'Koláž', description: 'Kreativní koláž' },\n { value: 'featured_grid', label: 'Zvýrazněná + Mřížka', description: 'Velká hlavní fotka vlevo + malé fotky vpravo v mřížce' },\n { value: 'stories', label: 'Stories', description: 'Instagram-style stories kruhové thumbnaily s full-screen view' },\n ],\n videos: [\n { value: 'grid', label: 'Mřížka', description: 'Video mřížka' },\n { value: 'featured', label: 'Zvýrazněné', description: 'Hlavní video + seznam' },\n { value: 'carousel', label: 'Karusel', description: 'Video karusel' },\n { value: 'playlist', label: 'Playlist', description: 'Playlist styl' },\n { value: 'highlight_reel', label: 'Sestřih', description: 'TV broadcast style - hlavní sestřih + kategorie (Góly, Zákroky, Highlights)' },\n { value: 'channel', label: 'Kanál', description: 'YouTube channel style s playlists a navigací' },\n { value: 'sparta_horizontal_slider', label: 'Sparta Horizontal Slider', description: 'Horizontální posuvník s kartami, UNLIMITED odznaky, prev/next tlačítka, drag support' },\n ],\n team: [\n { value: 'grid', label: 'Mřížka', description: 'Karty hráčů v mřížce' },\n { value: 'list', label: 'Seznam', description: 'Seznam hráčů' },\n { value: 'carousel', label: 'Karusel', description: 'Posuvný karusel' },\n { 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í' },\n { value: 'table', label: 'Tabulka', description: 'Tabulkové zobrazení' },\n { value: 'hierarchy', label: 'Hierarchie', description: 'Organizační hierarchie' },\n { value: 'formation', label: 'Rozestavení', description: 'Fotbalové rozestavení na hřišti (4-4-2, 4-3-3, atd.)' },\n { value: 'depth_chart', label: 'Hloubka Kádru', description: 'Pozice s hlavními hráči a náhradníky' },\n { 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)' },\n ],\n activities: [\n { value: 'list', label: 'Seznam', description: 'Seznam událostí' },\n { value: 'calendar', label: 'Kalendář', description: 'Kalendářní zobrazení' },\n { value: 'timeline', label: 'Časová Osa', description: 'Zobrazení časové osy' },\n { value: 'cards', label: 'Karty', description: 'Kartové rozložení' },\n { value: 'featured_event', label: 'Zvýrazněná Akce', description: 'Velká hlavní akce + menší nadcházející akce' },\n { value: 'countdown_grid', label: 'Odpočet + Mřížka', description: 'Odpočet k nejbližší akci + mřížka dalších akcí' },\n ],\n newsletter: [\n { value: 'default', label: 'Výchozí', description: 'Standardní formulář' },\n { value: 'popup', label: 'Vyskakovací', description: 'Vyskakovací okno' },\n { value: 'inline', label: 'Vložený', description: 'Vložený minimální' },\n { value: 'sidebar', label: 'Boční', description: 'Boční panel' },\n { value: 'banner', label: 'Banner', description: 'Sticky top banner s minimalistickým formulářem' },\n { value: 'hero_cta', label: 'Hero CTA', description: 'Velký call-to-action s benefity (Získejte exkluzivní obsah, slevy...)' },\n ],\n social: [\n { value: 'grid', label: 'Mřížka', description: 'Mřížka příspěvků' },\n { value: 'sidebar', label: 'Boční Panel', description: 'Boční widgety' },\n { value: 'floating', label: 'Plovoucí', description: 'Plovoucí ikony' },\n { value: 'feed', label: 'Tok', description: 'Tok příspěvků' },\n { value: 'wall', label: 'Sociální Zeď', description: 'Twitter/Instagram zeď s živými příspěvky z všech platforem' },\n { value: 'highlights', label: 'Highlights', description: 'Nejlepší příspěvky týdne s most liked/shared' },\n ],\n stats: [\n { value: 'cards', label: 'Karty', description: 'Karty statistik' },\n { value: 'table', label: 'Tabulka', description: 'Datová tabulka' },\n { value: 'charts', label: 'Grafy', description: 'Vizuální grafy' },\n { value: 'dashboard', label: 'Dashboard', description: 'Přehledová deska' },\n { value: 'leaderboard', label: 'Žebříček', description: 'Top hráči - nejlepší střelci, asistence, čisté konto, atd.' },\n { value: 'comparison', label: 'Porovnání', description: 'Side-by-side porovnání hráčů nebo týmů' },\n ],\n countdown: [\n { value: 'default', label: 'Výchozí', description: 'Standardní odpočet' },\n { value: 'minimal', label: 'Minimální', description: 'Minimální časovač' },\n { value: 'large', label: 'Velký', description: 'Velké zobrazení' },\n { value: 'circular', label: 'Kruhový', description: 'Kruhový odpočet' },\n ],\n map: [\n { value: 'default', label: 'Výchozí', description: 'Standardní mapa' },\n { value: 'satellite', label: 'Satelit', description: 'Satelitní zobrazení' },\n { value: 'minimal', label: 'Minimální', description: 'Minimální design' },\n { value: 'interactive', label: 'Interaktivní', description: 'Plně interaktivní mapa' },\n ],\n merch: [\n { value: 'grid', label: 'Mřížka', description: 'Produktová mřížka' },\n { value: 'carousel', label: 'Karusel', description: 'Produktový karusel' },\n { value: 'featured', label: 'Zvýrazněné', description: 'Zvýrazněné produkty' },\n { value: 'list', label: 'Seznam', description: 'Seznam produktů' },\n { value: 'sparta_product_slider', label: 'Sparta Product Slider', description: 'Produktový karusel s fotkami, cenami a tlačítky Koupit' },\n ],\n footer: [\n { value: 'standard', label: 'Standardní', description: 'Klasická patička' },\n { value: 'minimal', label: 'Minimální', description: 'Minimalistická patička' },\n { value: 'extended', label: 'Rozšířená', description: 'Rozšířená s více sloupci' },\n { value: 'centered', label: 'Centrovaná', description: 'Centrované rozložení' },\n { value: 'sparta_extended', label: 'Sparta Extended', description: 'Rozšířená patička s partnery, navigací, newsletterem a sociálními sítěmi' },\n ],\n sidebar: [\n { value: 'right', label: 'Pravý', description: 'Pravý boční panel' },\n { value: 'left', label: 'Levý', description: 'Levý boční panel' },\n { value: 'sticky', label: 'Přilepený', description: 'Přilepený při scrollování' },\n ],\n banner: [\n { value: 'top', label: 'Nahoře', description: 'Banner v horní části' },\n { value: 'bottom', label: 'Dole', description: 'Banner ve spodní části' },\n { value: 'sidebar', label: 'Boční', description: 'Boční banner' },\n { value: 'overlay', label: 'Překryvný', description: 'Překryvný banner' },\n ],\n table: [\n { value: 'split_news', label: 'Rozdělený s Aktualitami', description: 'Dva sloupce - Aktuality vlevo + Tabulka vpravo (výchozí)' },\n { value: 'standard', label: 'Standardní', description: 'Klasická tabulka - jeden sloupec' },\n { value: 'compact', label: 'Kompaktní', description: 'Kompaktní zobrazení' },\n { value: 'detailed', label: 'Detailní', description: 'Detailní informace' },\n ],\n testimonials: [\n { value: 'carousel', label: 'Karusel', description: 'Posuvný karusel' },\n { value: 'grid', label: 'Mřížka', description: 'Mřížka referencí' },\n { value: 'wall', label: 'Zeď', description: 'Zeď ohlasů' },\n ],\n achievements: [\n { value: 'timeline', label: 'Časová Osa', description: 'Chronologická osa' },\n { value: 'grid', label: 'Mřížka', description: 'Mřížka úspěchů' },\n { value: 'showcase', label: 'Výloha', description: 'Výloha trofejí' },\n ],\n history: [\n { value: 'timeline', label: 'Časová Osa', description: 'Historická časová osa' },\n { value: 'story', label: 'Příběh', description: 'Vyprávěcí formát' },\n { value: 'milestones', label: 'Milníky', description: 'Klíčové milníky' },\n ],\n live: [\n { value: 'featured', label: 'Zvýrazněný', description: 'Hlavní live stream' },\n { value: 'embedded', label: 'Vložený', description: 'Vložený přehrávač' },\n { value: 'multi', label: 'Více Kamer', description: 'Více kamer najednou' },\n ],\n podcast: [\n { value: 'list', label: 'Seznam', description: 'Seznam epizod' },\n { value: 'player', label: 'Přehrávač', description: 'Integrovaný přehrávač' },\n { value: 'featured', label: 'Zvýrazněný', description: 'Zvýrazněné epizody' },\n ],\n contact: [\n { value: 'form', label: 'Formulář', description: 'Kontaktní formulář' },\n { value: 'info', label: 'Informace', description: 'Kontaktní údaje' },\n { value: 'combined', label: 'Kombinovaný', description: 'Formulář + údaje' },\n ],\n poll: [\n { value: 'vertical', label: 'Vertikální', description: 'Vertikální rozložení' },\n { value: 'horizontal', label: 'Horizontální', description: 'Horizontální rozložení' },\n { value: 'cards', label: 'Karty', description: 'Kartové rozložení' },\n ],\n quiz: [\n { value: 'card', label: 'Karta', description: 'Karta po kartě' },\n { value: 'form', label: 'Formulář', description: 'Formulářový styl' },\n { value: 'interactive', label: 'Interaktivní', description: 'Plně interaktivní' },\n ],\n search: [\n { value: 'header', label: 'Hlavička', description: 'V hlavičce' },\n { value: 'overlay', label: 'Překryvný', description: 'Překryvné vyhledávání' },\n { value: 'inline', label: 'Vložený', description: 'Vložený do stránky' },\n ],\n calendar: [\n { value: 'month', label: 'Měsíc', description: 'Měsíční zobrazení' },\n { value: 'week', label: 'Týden', description: 'Týdenní zobrazení' },\n { value: 'list', label: 'Seznam', description: 'Seznam událostí' },\n ],\n weather: [\n { value: 'widget', label: 'Widget', description: 'Widget počasí' },\n { value: 'detailed', label: 'Detailní', description: 'Detailní předpověď' },\n { value: 'minimal', label: 'Minimální', description: 'Základní info' },\n ],\n ticketing: [\n { value: 'widget', label: 'Widget', description: 'Widget vstupenek' },\n { value: 'full', label: 'Plný', description: 'Plný systém' },\n { value: 'link', label: 'Odkaz', description: 'Pouze odkaz' },\n ],\n};\n","import api from './api';\n\nexport interface CreateShortLinkPayload {\n target_url: string;\n title?: string;\n source_type?: 'article' | 'event' | 'other' | string;\n source_id?: number;\n expires_at?: string | null;\n code?: string;\n active?: boolean;\n}\n\nexport interface ShortLinkResponse {\n id: number;\n code: string;\n short_url: string;\n link: any;\n}\n\nexport async function createShortLink(payload: CreateShortLinkPayload): Promise<ShortLinkResponse> {\n const normalized: CreateShortLinkPayload = { ...payload };\n if (normalized.target_url && !/^https?:\\/\\//i.test(normalized.target_url)) {\n normalized.target_url = `https://${normalized.target_url}`;\n }\n if (typeof normalized.code === 'string') {\n const s = normalized.code.trim();\n const filtered = s.replace(/[^a-zA-Z0-9_-]/g, '').slice(0, 16);\n normalized.code = filtered || undefined;\n }\n // Prefer admin endpoint in admin contexts to avoid 400/403 on public routes\n try {\n const resAdmin = await api.post<ShortLinkResponse>('/admin/shortlinks', normalized);\n return resAdmin.data;\n } catch (_) {\n // Fallback to public/editor route if admin path is not available\n try {\n const resPublic = await api.post<ShortLinkResponse>('/shortlinks', normalized);\n return resPublic.data;\n } catch (e2: any) {\n // Last resort: public-create endpoint (strict allowed-host policy)\n const resPub = await api.post<ShortLinkResponse>('/shortlinks/public', {\n target_url: normalized.target_url!,\n title: normalized.title,\n } as any);\n return resPub.data;\n }\n }\n}\n\n// Public shortlink creation for visitors (no auth; backend validates allowed host)\nexport async function createPublicShortLink(payload: { target_url: string; title?: string }): Promise<ShortLinkResponse> {\n const body = { ...payload };\n if (body.target_url && !/^https?:\\/\\//i.test(body.target_url)) {\n body.target_url = `https://${body.target_url}`;\n }\n const res = await api.post<ShortLinkResponse>('/shortlinks/public', body);\n return res.data;\n}\n\nexport async function listShortLinks(): Promise<{ items: any[] }> {\n // Prefer admin endpoint first in admin context\n try {\n const resAdmin = await api.get<{ items: any[] }>('/admin/shortlinks');\n return resAdmin.data;\n } catch (_) {\n const res = await api.get<{ items: any[] }>('/shortlinks');\n return res.data;\n }\n}\n\nexport async function getShortLinkStats(id: number | string): Promise<any> {\n const res = await api.get(`/admin/shortlinks/${id}/stats`);\n return res.data;\n}\n","import { extractPalette } from '@/utils/colors';\nimport api, { API_URL } from '@/services/api';\n\nexport type ScoreboardTheme = 'classic' | 'pill' | 'var1' | 'var2' | 'var3' | 'var4';\n\nexport type ScoreboardState = {\n homeName: string;\n awayName: string;\n homeLogo?: string;\n awayLogo?: string;\n homeShort?: string;\n awayShort?: string;\n primaryColor?: string; // home color\n secondaryColor?: string; // away color\n homeTextColor?: string; // text color for home label/short\n awayTextColor?: string; // text color for away label/short\n homeScore: number;\n awayScore: number;\n homeFouls?: number;\n awayFouls?: number;\n halfLength: number; // minutes\n theme: ScoreboardTheme;\n externalMatchId?: string;\n active?: boolean;\n timer?: string; // MM:SS\n running?: boolean;\n sidesFlipped?: boolean;\n half?: number;\n qrEvery?: number;\n qrDuration?: number;\n};\n\nconst DEFAULT_STATE: ScoreboardState = {\n homeName: 'DOMÁCÍ',\n awayName: 'HOSTÉ',\n homeLogo: '',\n awayLogo: '',\n homeShort: 'DOM',\n awayShort: 'HOS',\n primaryColor: '#1e3a8a',\n secondaryColor: '#2563eb',\n homeScore: 0,\n awayScore: 0,\n homeFouls: 0,\n awayFouls: 0,\n halfLength: 45,\n theme: 'pill',\n externalMatchId: '',\n active: false,\n timer: '00:00',\n running: false,\n sidesFlipped: false,\n half: 1,\n qrEvery: 5,\n qrDuration: 60,\n};\n\nconst STORAGE_KEY = 'scoreboard_state_v1';\n\nexport async function getScoreboardState(): Promise<ScoreboardState> {\n // Try backend admin singleton first (if authenticated), then fallback to public, then localStorage\n try {\n const res = await api.get('/admin/scoreboard');\n const fromApi = normalizeFromApi(res.data);\n // mirror to localStorage for fast next-load\n localStorage.setItem(STORAGE_KEY, JSON.stringify(fromApi));\n return { ...DEFAULT_STATE, ...fromApi } as ScoreboardState;\n } catch {\n // Not admin or not logged in; try public\n try {\n const base = (API_URL || '').replace(/\\/$/, '');\n const res = await fetch(`${base}/scoreboard`, { credentials: 'include' });\n if (res.ok) {\n const data = await res.json();\n const fromApi = normalizeFromApi(data);\n localStorage.setItem(STORAGE_KEY, JSON.stringify(fromApi));\n return { ...DEFAULT_STATE, ...fromApi } as ScoreboardState;\n }\n } catch {}\n // Fallback to localStorage\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (!raw) return DEFAULT_STATE;\n const parsed = JSON.parse(raw);\n return { ...DEFAULT_STATE, ...parsed } as ScoreboardState;\n } catch {\n return DEFAULT_STATE;\n }\n }\n}\n\nexport async function saveScoreboardState(state: Partial<ScoreboardState>): Promise<ScoreboardState> {\n // Avoid an extra GET on every save: use the last known local snapshot as base\n let base: ScoreboardState = { ...DEFAULT_STATE } as ScoreboardState;\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (raw) {\n const parsed = JSON.parse(raw);\n base = { ...DEFAULT_STATE, ...(parsed || {}) } as ScoreboardState;\n }\n } catch {}\n const next = { ...base, ...state } as ScoreboardState;\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(next));\n } catch {}\n // Attempt to persist to backend if admin\n try {\n await api.put('/admin/scoreboard', toApiPayload(state));\n } catch {\n // ignore if not authorized\n }\n return next;\n}\n\nexport async function getAdminScoreboard(): Promise<ScoreboardState> {\n const res = await api.get('/admin/scoreboard');\n const fromApi = normalizeFromApi(res.data);\n localStorage.setItem(STORAGE_KEY, JSON.stringify(fromApi));\n return { ...DEFAULT_STATE, ...fromApi } as ScoreboardState;\n}\n\nexport async function updateAdminScoreboard(patch: Partial<ScoreboardState>): Promise<ScoreboardState> {\n const res = await api.put('/admin/scoreboard', toApiPayload(patch));\n const fromApi = normalizeFromApi(res.data);\n localStorage.setItem(STORAGE_KEY, JSON.stringify(fromApi));\n return { ...DEFAULT_STATE, ...fromApi } as ScoreboardState;\n}\n\nexport async function getPublicScoreboard(): Promise<ScoreboardState> {\n const base = (API_URL || '').replace(/\\/$/, '');\n const res = await fetch(`${base}/scoreboard`, { credentials: 'include' });\n if (!res.ok) throw new Error('Failed to load public scoreboard');\n const data = await res.json();\n const fromApi = normalizeFromApi(data);\n return { ...DEFAULT_STATE, ...fromApi } as ScoreboardState;\n}\n\n// Timer controls (admin)\nexport async function startTimer(): Promise<void> {\n await api.post('/admin/scoreboard/timer/start');\n}\nexport async function pauseTimer(): Promise<void> {\n await api.post('/admin/scoreboard/timer/pause');\n}\nexport async function resetTimer(): Promise<void> {\n await api.post('/admin/scoreboard/timer/reset');\n}\nexport async function swapSides(): Promise<void> {\n await api.post('/admin/scoreboard/swap-sides');\n}\nexport async function startSecondHalf(): Promise<void> {\n await api.post('/admin/scoreboard/second-half');\n}\n\n// Admin: presets\nexport async function listPresets(): Promise<string[]> {\n const res = await api.get<string[]>('/admin/scoreboard/saves');\n // API returns an array of filenames\n return (res.data || []).slice();\n}\n\nexport async function savePreset(filename?: string): Promise<{ saved: string }> {\n const payload = filename && filename.trim() ? { filename: filename.trim() } : {};\n const res = await api.post<{ saved: string }>('/admin/scoreboard/save', payload);\n return res.data;\n}\n\nexport async function loadPreset(filename: string): Promise<void> {\n const name = (filename || '').trim();\n if (!name) throw new Error('Missing filename');\n await api.post('/admin/scoreboard/load', { filename: name });\n}\n\n// Admin: sponsors management\nexport async function listSponsorsAdmin(): Promise<string[]> {\n const res = await api.get<string[]>('/admin/scoreboard/sponsors');\n const list = res.data || [];\n try {\n const base = new URL(API_URL || '', typeof window !== 'undefined' ? window.location.origin : undefined);\n const origin = `${base.protocol}//${base.host}`;\n return list.map((u) => (u && u.startsWith('/uploads/') ? origin + u : u));\n } catch {\n return list;\n }\n}\n\nexport async function uploadSponsors(files: File[]): Promise<{ saved: number; files?: string[] }> {\n const fd = new FormData();\n for (const f of files) fd.append('files', f);\n const res = await api.post<{ saved: number; files?: string[] }>('/admin/scoreboard/sponsors/upload', fd, { headers: { 'Content-Type': 'multipart/form-data' } });\n return res.data || { saved: 0 };\n}\n\nexport async function deleteSponsor(name: string): Promise<void> {\n await api.delete('/admin/scoreboard/sponsors', { params: { name } });\n}\n\nexport async function prefillSponsorsFromPage(ids?: number[]): Promise<{ saved: number; files?: string[] }> {\n const payload = Array.isArray(ids) && ids.length ? { ids } : {};\n const res = await api.post<{ saved: number; files?: string[] }>('/admin/scoreboard/sponsors/prefill', payload);\n return res.data || { saved: 0 };\n}\n\n// Public: sponsors list for overlay\nexport async function listSponsorsPublic(): Promise<string[]> {\n const res = await api.get<string[]>('/scoreboard/sponsors');\n const list = res.data || [];\n try {\n const base = new URL(API_URL || '', typeof window !== 'undefined' ? window.location.origin : undefined);\n const origin = `${base.protocol}//${base.host}`;\n return list.map((u) => (u && u.startsWith('/uploads/') ? origin + u : u));\n } catch {\n return list;\n }\n}\n\n// Admin/public: QR management\nexport async function getQr(): Promise<string> {\n // Prefer admin endpoint when available to avoid public cache\n try {\n const res = await api.get<{ qr?: string }>('/admin/scoreboard/qr');\n const u = res.data?.qr || '';\n if (u && u.startsWith('/uploads/')) {\n try {\n const base = new URL(API_URL || '', typeof window !== 'undefined' ? window.location.origin : undefined);\n return `${base.protocol}//${base.host}${u}`;\n } catch {}\n }\n return u;\n } catch {\n try {\n const base = (API_URL || '').replace(/\\/$/, '');\n const r = await fetch(`${base}/scoreboard/qr`, { credentials: 'include' });\n if (r.ok) {\n const data = await r.json();\n const u = data?.qr || '';\n if (u && u.startsWith('/uploads/')) {\n try {\n const b = new URL(API_URL || '', typeof window !== 'undefined' ? window.location.origin : undefined);\n return `${b.protocol}//${b.host}${u}`;\n } catch {}\n }\n return u;\n }\n } catch {}\n return '';\n }\n}\n\nexport async function uploadQr(file: File): Promise<void> {\n const fd = new FormData();\n fd.append('file', file);\n await api.post('/admin/scoreboard/qr', fd, { headers: { 'Content-Type': 'multipart/form-data' } });\n}\n\n// Utilities\nexport function deriveShort(name?: string): string {\n if (!name) return '---';\n const s = String(name).trim().toUpperCase();\n if (!s) return '---';\n const map: Record<string, string> = {\n 'Á':'A','Ä':'A','Å':'A','Â':'A','À':'A',\n 'Č':'C','Ć':'C','Ç':'C',\n 'Ď':'D',\n 'É':'E','Ě':'E','È':'E','Ë':'E','Ê':'E',\n 'Í':'I','Ì':'I','Ï':'I','Î':'I',\n 'Ň':'N','Ń':'N',\n 'Ó':'O','Ö':'O','Ô':'O','Ò':'O',\n 'Ř':'R',\n 'Š':'S','Ś':'S',\n 'Ť':'T',\n 'Ú':'U','Ů':'U','Ù':'U','Ü':'U','Û':'U',\n 'Ý':'Y',\n 'Ž':'Z',\n };\n let out = '';\n for (const ch of s) {\n let c = map[ch] || ch;\n if (c >= 'A' && c <= 'Z') {\n out += c;\n if (out.length === 3) break;\n }\n }\n while (out.length < 3) out += '-';\n return out;\n}\n\nexport async function derivePrimaryFromLogo(logoUrl?: string): Promise<string | null> {\n if (!logoUrl) return null;\n try {\n const colors = await extractPalette(logoUrl, 5);\n return colors?.[0] || null;\n } catch {\n return null;\n }\n}\n\n// Helpers to map API payloads\nfunction normalizeFromApi(d: any): Partial<ScoreboardState> {\n if (!d) return {};\n const absolutize = (u?: string) => {\n try {\n if (!u) return '';\n const s = String(u);\n if (s.startsWith('/uploads/') || s.startsWith('/dist/')) {\n const base = new URL(API_URL || '', typeof window !== 'undefined' ? window.location.origin : undefined);\n return `${base.protocol}//${base.host}${s}`;\n }\n return s;\n } catch {\n return u || '';\n }\n };\n const rawHome = d.homeLogo || d.home_logo || d.home_logo_url || d.HomeLogoURL || '';\n const rawAway = d.awayLogo || d.away_logo || d.away_logo_url || d.AwayLogoURL || '';\n return {\n homeName: d.homeName || d.home_name || d.HomeName || '',\n awayName: d.awayName || d.away_name || d.AwayName || '',\n homeLogo: absolutize(rawHome),\n awayLogo: absolutize(rawAway),\n homeShort: d.homeShort || d.home_short || d.HomeShort || '',\n awayShort: d.awayShort || d.away_short || d.AwayShort || '',\n primaryColor: d.primaryColor || d.primary_color || d.PrimaryColor || undefined,\n secondaryColor: d.secondaryColor || d.secondary_color || d.SecondaryColor || undefined,\n homeTextColor: d.homeTextColor || d.home_text_color || d.HomeTextColor || undefined,\n awayTextColor: d.awayTextColor || d.away_text_color || d.AwayTextColor || undefined,\n homeScore: typeof d.homeScore === 'number' ? d.homeScore : (typeof d.home_score === 'number' ? d.home_score : 0),\n awayScore: typeof d.awayScore === 'number' ? d.awayScore : (typeof d.away_score === 'number' ? d.away_score : 0),\n homeFouls: typeof d.homeFouls === 'number' ? d.homeFouls : (typeof d.home_fouls === 'number' ? d.home_fouls : 0),\n awayFouls: typeof d.awayFouls === 'number' ? d.awayFouls : (typeof d.away_fouls === 'number' ? d.away_fouls : 0),\n halfLength: typeof d.halfLength === 'number' ? d.halfLength : (typeof d.half_length === 'number' ? d.half_length : 45),\n theme: (d.theme || 'pill') as any,\n externalMatchId: d.externalMatchId || d.external_match_id || d.ExternalMatchID || '',\n active: typeof d.active === 'boolean' ? d.active : undefined,\n timer: d.timer || d.Timer || '00:00',\n running: typeof d.running === 'boolean' ? d.running : undefined,\n sidesFlipped: typeof d.sidesFlipped === 'boolean' ? d.sidesFlipped : (typeof d.sides_flipped === 'boolean' ? d.sides_flipped : undefined),\n half: typeof d.half === 'number' ? d.half : undefined,\n qrEvery: typeof d.qrEvery === 'number' ? d.qrEvery : (typeof d.qr_show_every_minutes === 'number' ? d.qr_show_every_minutes : undefined),\n qrDuration: typeof d.qrDuration === 'number' ? d.qrDuration : (typeof d.qr_show_duration_seconds === 'number' ? d.qr_show_duration_seconds : undefined),\n };\n}\n\nfunction toApiPayload(p: Partial<ScoreboardState>) {\n const out: any = {};\n if (p.homeName !== undefined) out.homeName = p.homeName;\n if (p.awayName !== undefined) out.awayName = p.awayName;\n if (p.homeLogo !== undefined) out.homeLogo = p.homeLogo;\n if (p.awayLogo !== undefined) out.awayLogo = p.awayLogo;\n if (p.homeShort !== undefined) out.homeShort = p.homeShort;\n if (p.awayShort !== undefined) out.awayShort = p.awayShort;\n if (p.primaryColor !== undefined) out.primaryColor = p.primaryColor;\n if (p.secondaryColor !== undefined) out.secondaryColor = p.secondaryColor;\n if (p.homeTextColor !== undefined) out.homeTextColor = p.homeTextColor;\n if (p.awayTextColor !== undefined) out.awayTextColor = p.awayTextColor;\n if (p.homeScore !== undefined) out.homeScore = p.homeScore;\n if (p.awayScore !== undefined) out.awayScore = p.awayScore;\n if (p.homeFouls !== undefined) out.homeFouls = p.homeFouls;\n if (p.awayFouls !== undefined) out.awayFouls = p.awayFouls;\n if (p.halfLength !== undefined) out.halfLength = p.halfLength;\n if (p.theme !== undefined) out.theme = p.theme;\n if (p.externalMatchId !== undefined) out.externalMatchId = p.externalMatchId;\n if (p.active !== undefined) out.active = p.active;\n if (p.timer !== undefined) out.timer = p.timer;\n if (p.sidesFlipped !== undefined) out.sidesFlipped = p.sidesFlipped;\n if (p.half !== undefined) out.half = p.half;\n if (p.qrEvery !== undefined) out.qrEvery = p.qrEvery;\n if (p.qrDuration !== undefined) out.qrDuration = p.qrDuration;\n return out;\n}\n\nexport async function deleteQr(): Promise<void> {\n await api.delete('/admin/scoreboard/qr');\n}\n","import React from 'react';\nimport {\n Box,\n Heading,\n Text,\n Stack,\n Button,\n Stat,\n StatLabel,\n StatNumber,\n StatHelpText,\n SimpleGrid,\n useToast,\n Card,\n CardHeader,\n CardBody,\n Badge,\n Divider,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalCloseButton,\n ModalBody,\n ModalFooter,\n Textarea,\n HStack,\n VStack,\n} from '@chakra-ui/react';\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { getPrefetchStatus, triggerPrefetch, PrefetchStatus } from '../../services/admin/prefetch';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport api, { API_URL } from '../../services/api';\n\nconst PrefetchAdminPage: React.FC = () => {\n const toast = useToast();\n const qc = useQueryClient();\n // RAW cache viewer state\n const [rawOpen, setRawOpen] = React.useState<boolean>(false);\n const [rawSel, setRawSel] = React.useState<string>('');\n const [rawLoading, setRawLoading] = React.useState<boolean>(false);\n const [rawError, setRawError] = React.useState<string | null>(null);\n const [rawText, setRawText] = React.useState<string>('');\n\n // Load list of available cache files (admin)\n const { data: rawList, isError: rawListError, error: rawListErrorMsg } = useQuery<{ files: Array<{ label: string; path: string; size_bytes?: number; mod_time?: string }>}>({\n queryKey: ['admin', 'cache', 'list'],\n queryFn: async () => {\n const res = await api.get('/admin/cache/list');\n return res.data;\n },\n staleTime: 30_000,\n retry: 1,\n });\n\n const fetchRaw = async (path: string) => {\n setRawLoading(true);\n setRawError(null);\n setRawText('');\n try {\n const res = await api.get(`/admin/cache/file?path=${encodeURIComponent(path)}`, {\n transformResponse: [(data) => data], // Get raw text response\n });\n const txt = res.data;\n try {\n const obj = JSON.parse(txt);\n setRawText(JSON.stringify(obj, null, 2));\n } catch {\n setRawText(txt);\n }\n } catch (e: any) {\n setRawError(e?.message || 'Nelze načíst data');\n } finally {\n setRawLoading(false);\n }\n };\n const { data: status, isLoading, isFetching } = useQuery<PrefetchStatus>({\n queryKey: ['admin', 'prefetch', 'status'],\n queryFn: getPrefetchStatus,\n refetchInterval: 30_000, // keep page live\n });\n\n const trigger = useMutation({\n mutationFn: triggerPrefetch,\n onSuccess: async () => {\n toast({ title: 'Prefetch spuštěn', status: 'success' });\n await qc.invalidateQueries({ queryKey: ['admin', 'prefetch', 'status'] });\n },\n onError: (err: any) => {\n toast({ title: 'Spuštění prefetch selhalo', description: String(err?.message || err), status: 'error' });\n },\n });\n\n const last = status?.lastUpdated ? new Date(status.lastUpdated) : null;\n const next = status?.nextApproximate ? new Date(status.nextApproximate) : null;\n\n return (\n <AdminLayout>\n <Box>\n <Heading size=\"lg\" mb={4}>Prefetch & Cache</Heading>\n <Text color=\"gray.600\" mb={6}>\n Na pozadí běží úloha, která pravidelně stahuje JSON snapshoty z veřejných API pro rychlejší načítání stránek. Zde uvidíte aktuální plán a můžete spustit ruční stažení.\n </Text>\n\n <SimpleGrid columns={{ base: 1, md: 3 }} spacing={4} mb={6}>\n <Card>\n <CardHeader><Text fontWeight=\"bold\">Režim</Text></CardHeader>\n <CardBody>\n <Stat>\n <StatLabel>Aktuální režim</StatLabel>\n <StatNumber>\n {status?.fastMode ? (\n <Badge colorScheme=\"green\">Rychlý (během zápasu)</Badge>\n ) : (\n <Badge>Normální</Badge>\n )}\n </StatNumber>\n <StatHelpText>V době konání zápasů se automaticky přepne do rychlého režimu.</StatHelpText>\n </Stat>\n </CardBody>\n </Card>\n\n <Card>\n <CardHeader><Text fontWeight=\"bold\">Poslední aktualizace</Text></CardHeader>\n <CardBody>\n <Stat>\n <StatLabel>Poslední prefetch</StatLabel>\n <StatNumber fontSize=\"lg\">\n {last ? last.toLocaleString() : 'Unknown'}\n </StatNumber>\n <StatHelpText>{isFetching ? 'Obnovuji…' : 'Aktuální'}</StatHelpText>\n </Stat>\n </CardBody>\n </Card>\n\n <Card>\n <CardHeader><Text fontWeight=\"bold\">Další spuštění</Text></CardHeader>\n <CardBody>\n <Stat>\n <StatLabel>Přibližně</StatLabel>\n <StatNumber fontSize=\"lg\">\n {next ? next.toLocaleString() : '—'}\n </StatNumber>\n <StatHelpText>\n Interval: {status?.intervalMinutes ?? 30} min\n </StatHelpText>\n </Stat>\n </CardBody>\n </Card>\n </SimpleGrid>\n\n <Card>\n <CardHeader>\n <Stack direction={{ base: 'column', sm: 'row' }} align=\"center\" justify=\"space-between\">\n <Text fontWeight=\"bold\">Ovládání</Text>\n <Stack direction=\"row\" spacing={3}>\n <Button\n colorScheme=\"blue\"\n isLoading={trigger.isLoading}\n onClick={() => trigger.mutate()}\n >\n Spustit stažení\n </Button>\n <Button variant=\"outline\" onClick={() => qc.invalidateQueries({ queryKey: ['admin', 'prefetch', 'status'] })}>\n Obnovit stav\n </Button>\n <Button \n variant=\"outline\" \n onClick={() => {\n setRawOpen(true);\n const first = rawList?.files?.[0];\n if (first) { \n setRawSel(first.path); \n fetchRaw(first.path); \n } else if (rawListError) {\n setRawError('Nelze načíst seznam souborů');\n } else if (!rawList?.files || rawList.files.length === 0) {\n setRawError('Žádné cache soubory nebyly nalezeny');\n }\n }}\n isDisabled={rawListError && !rawList}\n >\n Zobrazit RAW data\n </Button>\n </Stack>\n </Stack>\n </CardHeader>\n <Divider />\n <CardBody>\n <Text color=\"gray.600\">\n Ruční spuštění zahájí na pozadí obnovu všech veřejných endpointů a zdrojů FAČR. Nezablokuje uživatelské rozhraní.\n </Text>\n </CardBody>\n </Card>\n\n {/* RAW viewer modal */}\n <Modal isOpen={rawOpen} onClose={() => setRawOpen(false)} size=\"6xl\" scrollBehavior=\"inside\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>RAW data (prefetch & cache)</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n {rawListError ? (\n <Box p={4} textAlign=\"center\">\n <Text color=\"red.500\" mb={2}>Chyba při načítání seznamu souborů</Text>\n <Text color=\"gray.500\" fontSize=\"sm\">{String(rawListErrorMsg)}</Text>\n </Box>\n ) : !rawList?.files || rawList.files.length === 0 ? (\n <Box p={4} textAlign=\"center\">\n <Text color=\"gray.500\">Žádné cache soubory nebyly nalezeny</Text>\n <Text fontSize=\"sm\" color=\"gray.400\" mt={2}>Zkuste spustit prefetch stažení nejprve</Text>\n </Box>\n ) : (\n <SimpleGrid columns={{ base: 1, md: 4 }} spacing={4}>\n <VStack align=\"stretch\" spacing={2} gridColumn={{ base: '1', md: 'span 1' }}>\n {rawList.files.map((f) => (\n <Button \n key={f.path} \n variant={rawSel === f.path ? 'solid' : 'outline'} \n onClick={() => { setRawSel(f.path); fetchRaw(f.path); }} \n justifyContent=\"flex-start\"\n size=\"sm\"\n >\n <Text noOfLines={1} fontSize=\"xs\" textAlign=\"left\" w=\"full\">\n {f.label}\n </Text>\n </Button>\n ))}\n </VStack>\n <Box gridColumn={{ base: '1', md: 'span 3' }}>\n <HStack justify=\"space-between\" mb={2}>\n <Text fontWeight=\"semibold\" fontSize=\"sm\" noOfLines={1}>{rawSel || 'Vyberte soubor'}</Text>\n <HStack>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => fetchRaw(rawSel)} isLoading={rawLoading} isDisabled={!rawSel}>Obnovit</Button>\n <Button size=\"sm\" as=\"a\" href={`${API_URL}/admin/cache/file?path=${encodeURIComponent(rawSel)}`} target=\"_blank\" rel=\"noreferrer\" isDisabled={!rawSel}>Otevřít v nové záložce</Button>\n </HStack>\n </HStack>\n {rawError && <Box color=\"red.500\" mb={2} p={2} bg=\"red.50\" borderRadius=\"md\">{rawError}</Box>}\n <Textarea value={rawText} onChange={() => {}} readOnly fontFamily=\"mono\" rows={24} fontSize=\"xs\" />\n </Box>\n </SimpleGrid>\n )}\n </ModalBody>\n <ModalFooter>\n <Button onClick={() => setRawOpen(false)}>Zavřít</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </Box>\n </AdminLayout>\n );\n};\n\nexport default PrefetchAdminPage;\n","import { Box, AspectRatio, Text, useColorModeValue, SimpleGrid, Heading, HStack, Badge, Button, Link, Modal, ModalOverlay, ModalContent, ModalBody, ModalCloseButton, useDisclosure, Icon, VStack } from '@chakra-ui/react';\nimport { Link as RouterLink } from 'react-router-dom';\nimport { FaYoutube, FaPlay } from 'react-icons/fa';\nimport { useTranslation } from 'react-i18next';\nimport HorizontalScroller from '../ui/HorizontalScroller';\nimport { useClubTheme } from '../../contexts/ClubThemeContext';\nimport { usePublicSettings } from '../../hooks/usePublicSettings';\nimport { getCachedYouTube, YouTubeVideo } from '../../services/youtube';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport CommentsSection from '../comments/CommentsSection';\n\ntype Props = {\n videos?: string[];\n variant?: 'grid' | 'carousel';\n};\n\ntype RenderItem = {\n key: string;\n title: string;\n embedUrl: string;\n thumbnail?: string;\n date?: string; // YYYY-MM-DD\n videoId?: string;\n};\n\nconst toEmbed = (idOrUrl: string): string => {\n // If a full URL is passed, try to extract the id; otherwise assume it's already an id\n // supports https://www.youtube.com/watch?v=ID or youtu.be/ID\n try {\n if (idOrUrl.includes('youtube.com') || idOrUrl.includes('youtu.be')) {\n const u = new URL(idOrUrl);\n if (u.hostname.includes('youtu.be')) {\n const id = u.pathname.replace('/', '');\n return `https://www.youtube.com/embed/${id}`;\n }\n const id = u.searchParams.get('v');\n if (id) return `https://www.youtube.com/embed/${id}`;\n }\n } catch {}\n // otherwise treat as id\n return `https://www.youtube.com/embed/${idOrUrl}`;\n};\n\nconst VideosSection: React.FC<Props> = ({ videos, variant }) => {\n const { t } = useTranslation();\n const cardBg = useColorModeValue('white', 'gray.800');\n const theme = useClubTheme();\n const { data: settings } = usePublicSettings();\n const [yt, setYt] = useState<YouTubeVideo[]>([]);\n const { isOpen, onOpen, onClose } = useDisclosure();\n const [selectedVideo, setSelectedVideo] = useState<RenderItem | null>(null);\n const titleOverrides: Record<string, string> = (settings as any)?.videos_title_overrides || {};\n // If admin explicitly disabled, respect it. Otherwise default to ON when there are manual videos configured\n // or when a YouTube URL is present for auto mode.\n const hasManualConfigured = Boolean((settings as any)?.videos_items?.length || (settings as any)?.videos?.length);\n const hasAutoConfigured = Boolean((settings as any)?.youtube_url || (settings as any)?.social_youtube);\n // Default enablement: if not explicitly set, enable when manual items exist or when a YouTube URL is configured (auto mode).\n // This avoids flicker caused by toggling visibility while data is loading.\n const enabled = (typeof (settings as any)?.videos_module_enabled === 'boolean')\n ? Boolean((settings as any)?.videos_module_enabled)\n : (hasManualConfigured || ((settings?.videos_source || 'auto') === 'auto' && hasAutoConfigured));\n const style = (() => {\n if (variant === 'carousel') return 'slider';\n if (variant === 'grid') return 'grid';\n return settings?.videos_style || 'slider';\n })();\n const source = settings?.videos_source || 'auto';\n // Default to 6 items on homepage unless overridden by settings (max 12)\n const limit = Math.max(1, Math.min(12, settings?.videos_limit ?? 6));\n const youtubeUrl = (settings as any)?.youtube_url || (settings as any)?.social_youtube || null;\n\n useEffect(() => {\n try {\n if (isOpen) onClose();\n setSelectedVideo(null);\n } catch {}\n }, [style]);\n\n useEffect(() => {\n let canceled = false;\n const run = async () => {\n const payload = await getCachedYouTube();\n if (!payload) return;\n const vids = (payload.videos || []).slice().sort((a, b) => (Date.parse(b.published_date || '') || 0) - (Date.parse(a.published_date || '') || 0));\n if (!canceled) setYt(vids);\n };\n run();\n return () => { canceled = true; };\n }, []);\n\n const extractVideoId = (embedUrl: string): string | undefined => {\n if (embedUrl?.includes('/embed/')) {\n return embedUrl.split('/embed/')[1]?.split('?')[0];\n }\n return undefined;\n };\n\n const items: RenderItem[] = useMemo(() => {\n // Build manual items (preferred from videos_items; fallback to legacy URLs)\n const manualItems = (() => {\n const manual = (settings?.videos_items || []).map((it, i) => {\n const embedUrl = toEmbed(it.url);\n return {\n key: `${i}-${it.url}`,\n title: it.title || `Video ${i + 1}`,\n embedUrl,\n thumbnail: it.thumbnail_url,\n date: it.uploaded_at,\n videoId: extractVideoId(embedUrl),\n } as RenderItem;\n });\n const legacy = (videos || settings?.videos || []).map((url, i) => {\n const embedUrl = toEmbed(url as any);\n return {\n key: `${i}-${url}`,\n title: `Video ${i + 1}`,\n embedUrl,\n videoId: extractVideoId(embedUrl),\n } as RenderItem;\n });\n return manual.length ? manual : legacy;\n })();\n\n const autoItems = (yt || []).map((v) => ({\n key: v.video_id,\n title: (titleOverrides?.[v.video_id]?.trim()) || v.title,\n embedUrl: toEmbed(v.video_id),\n thumbnail: v.thumbnail_url,\n date: v.published_date,\n videoId: v.video_id,\n } as RenderItem));\n\n // Combine manual + auto, de-duplicate by videoId/embedUrl/key, sort by date desc, apply limit\n const out: RenderItem[] = [];\n const seen = new Set<string>();\n const pushUnique = (it: RenderItem) => {\n const k = (it.videoId || it.embedUrl || it.key);\n if (!k) return;\n if (seen.has(k)) return;\n seen.add(k);\n out.push(it);\n };\n manualItems.forEach(pushUnique);\n autoItems.forEach(pushUnique);\n const sorted = out.slice().sort((a, b) => {\n const ta = Date.parse(a.date || '') || 0;\n const tb = Date.parse(b.date || '') || 0;\n return tb - ta;\n });\n return sorted.slice(0, limit);\n }, [source, yt, settings?.videos_items, settings?.videos, videos, limit, titleOverrides]);\n\n if (!enabled || items.length === 0) return null;\n\n const handlePlayClick = (it: RenderItem) => {\n setSelectedVideo(it);\n onOpen();\n };\n\n const Card: React.FC<{ it: RenderItem; idx: number }> = ({ it, idx }) => {\n const thumb = it.thumbnail || (it.videoId ? `https://i.ytimg.com/vi/${it.videoId}/hqdefault.jpg` : undefined);\n const borderColor = useColorModeValue('gray.200', 'gray.600');\n const placeholderBg = useColorModeValue('gray.100', 'gray.700');\n const placeholderIcon = useColorModeValue('gray.400', 'gray.500');\n const videoPrimaryColor = theme.primary;\n \n return (\n <Box\n className=\"video-card card\"\n bg={cardBg}\n overflow=\"hidden\"\n borderWidth=\"2px\"\n borderColor={borderColor}\n transition=\"all 0.3s\"\n position=\"relative\"\n sx={{\n '&:hover': {\n transform: 'translateY(-8px)',\n boxShadow: '0 20px 40px rgba(0,0,0,0.15)',\n borderColor: 'brand.primary',\n },\n '&:hover .play-overlay': {\n opacity: 1,\n },\n '&:hover .play-overlay > div': {\n transform: 'scale(1.05)',\n },\n }}\n >\n <AspectRatio ratio={16 / 9}>\n <Box\n position=\"relative\"\n cursor=\"pointer\"\n role=\"button\"\n tabIndex={0}\n aria-label={`${t('action.play')}: ${it.title}`}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handlePlayClick(it); } }}\n onClick={() => handlePlayClick(it)}\n >\n {/* Thumbnail */}\n {thumb ? (\n <Box\n as=\"img\"\n src={thumb}\n alt={it.title}\n width=\"100%\"\n height=\"100%\"\n loading=\"lazy\"\n decoding=\"async\"\n referrerPolicy=\"origin-when-cross-origin\"\n style={{ objectFit: 'cover' }}\n data-fallback-idx={0 as any}\n onError={(e: any) => {\n try {\n const el = e.currentTarget as HTMLImageElement & { dataset: { fallbackIdx?: string } };\n const idx = Number(el.dataset.fallbackIdx || '0');\n const id = it.videoId || '';\n const chain = id\n ? [\n `https://i.ytimg.com/vi/${id}/mqdefault.jpg`,\n `https://i.ytimg.com/vi/${id}/sddefault.jpg`,\n `https://i.ytimg.com/vi/${id}/hqdefault.jpg`,\n '/dist/img/logo-club-empty.svg',\n ]\n : ['/dist/img/logo-club-empty.svg'];\n if (idx < chain.length) {\n el.src = chain[idx];\n el.dataset.fallbackIdx = String(idx + 1);\n }\n } catch {}\n }}\n />\n ) : (\n <Box bg={placeholderBg} display=\"flex\" alignItems=\"center\" justifyContent=\"center\">\n <Icon as={FaPlay} boxSize={12} color={placeholderIcon} />\n </Box>\n )}\n {/* Play overlay */}\n <Box\n className=\"play-overlay\"\n position=\"absolute\"\n inset={0}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n opacity={0}\n transition=\"opacity 0.3s ease\"\n pointerEvents=\"none\"\n >\n <Box\n bg=\"white\"\n color=\"brand.primary\"\n borderRadius=\"full\"\n px={8}\n py={4}\n fontWeight=\"bold\"\n display=\"flex\"\n alignItems=\"center\"\n gap={2}\n transform=\"scale(0.9)\"\n transition=\"transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)\"\n boxShadow=\"0 12px 32px rgba(0,0,0,0.4)\"\n >\n <Icon as={FaPlay} boxSize={5} />\n <Text fontSize=\"lg\">{t('action.play')}</Text>\n </Box>\n </Box>\n </Box>\n </AspectRatio>\n <Box p={4} borderTopWidth=\"2px\" borderTopColor={videoPrimaryColor}>\n <VStack align=\"start\" spacing={2}>\n <Text fontWeight=\"bold\" fontSize=\"md\" color={videoPrimaryColor} noOfLines={2}>\n {it.title}\n </Text>\n <HStack justify=\"space-between\" width=\"100%\">\n {it.date && (\n <Badge colorScheme=\"gray\" fontSize=\"0.7rem\">\n {new Date(it.date).toLocaleDateString('cs-CZ')}\n </Badge>\n )}\n {it.videoId && (\n <Link href={`https://www.youtube.com/watch?v=${it.videoId}`} isExternal onClick={(e) => e.stopPropagation()}>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n colorScheme=\"red\"\n leftIcon={<Icon as={FaYoutube} />}\n >\n YouTube\n </Button>\n </Link>\n )}\n </HStack>\n </VStack>\n </Box>\n </Box>\n );\n };\n\n if (style === 'slider') {\n return (\n <Box>\n <Box className=\"section-head\" style={{ marginTop: 8, marginBottom: 16 }}>\n <HStack spacing={3}>\n <Heading as=\"h3\" size=\"lg\" fontWeight=\"700\" id=\"home-videos-heading\">{t('nav.videos')}</Heading>\n </HStack>\n <Link as={RouterLink} to=\"/videa\">\n <Button \n size=\"md\" \n variant=\"solid\" \n bg={theme.primary}\n color=\"white\"\n rightIcon={<Box as=\"span\">→</Box>}\n _hover={{ opacity: 0.9, transform: 'translateX(4px)' }}\n transition=\"all 0.2s\"\n >\n {t('homepage.more_videos')}\n </Button>\n </Link>\n </Box>\n <HorizontalScroller key={`videos-hs-${style}-${items.length}`} draggable>\n {items.map((it, idx) => (\n <Box \n key={it.key} \n minW={{ base: '85%', md: '60%', lg: '33%' }} \n display=\"flex\"\n flexDirection=\"column\"\n >\n <Card it={it} idx={idx} />\n </Box>\n ))}\n </HorizontalScroller>\n\n {/* Video Modal */}\n <Modal isOpen={isOpen} onClose={onClose} size=\"6xl\" isCentered>\n <ModalOverlay bg=\"blackAlpha.800\" />\n <ModalContent bg=\"transparent\" boxShadow=\"none\" maxW=\"90vw\">\n <ModalCloseButton color=\"white\" size=\"lg\" bg=\"blackAlpha.600\" _hover={{ bg: 'blackAlpha.700' }} borderRadius=\"full\" zIndex={2} />\n <ModalBody p={0}>\n {selectedVideo && (\n <Box>\n <AspectRatio ratio={16 / 9} maxH=\"90vh\">\n <iframe\n src={`${selectedVideo.embedUrl}?autoplay=1&vq=hd1080&rel=0&modestbranding=1&playsinline=1`}\n title={selectedVideo.title}\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n allowFullScreen\n loading=\"lazy\"\n referrerPolicy=\"strict-origin-when-cross-origin\"\n style={{ borderRadius: '8px' }}\n />\n </AspectRatio>\n <Box bg={useColorModeValue('white', 'gray.800')} p={4} borderRadius=\"md\" mt={2}>\n <HStack justify=\"space-between\" align=\"start\">\n <VStack align=\"start\" flex={1}>\n <Text fontWeight=\"bold\" fontSize=\"lg\">{selectedVideo.title}</Text>\n {selectedVideo.date && (\n <Text color={useColorModeValue('gray.600', 'gray.300')} fontSize=\"sm\">\n {new Date(selectedVideo.date).toLocaleDateString('cs-CZ', { year: 'numeric', month: 'long', day: 'numeric' })}\n </Text>\n )}\n </VStack>\n {selectedVideo.videoId && (\n <Link href={`https://www.youtube.com/watch?v=${selectedVideo.videoId}`} isExternal>\n <Button size=\"sm\" colorScheme=\"red\" leftIcon={<Icon as={FaYoutube} />}>{t('action.open_on_youtube')}</Button>\n </Link>\n )}\n </HStack>\n {selectedVideo.videoId && (\n <Box mt={4}>\n <CommentsSection targetType=\"youtube_video\" targetId={selectedVideo.videoId} />\n </Box>\n )}\n </Box>\n </Box>\n )}\n </ModalBody>\n </ModalContent>\n </Modal>\n </Box>\n );\n }\n\n const cols = style === 'grid3' ? { base: 1, md: 3 } : { base: 1, md: 2, lg: 3 };\n return (\n <Box>\n <Box className=\"section-head\">\n <Heading as=\"h3\" size=\"md\" id=\"home-videos-heading\">{t('nav.videos')}</Heading>\n <Link as={RouterLink} to=\"/videa\">\n <Button size=\"sm\" variant=\"outline\" colorScheme=\"blue\">{t('homepage.more_videos')}</Button>\n </Link>\n </Box>\n <SimpleGrid key={`videos-grid-${style}-${items.length}`} columns={cols} spacing={4}>\n {items.map((it, idx) => (\n <Card key={it.key} it={it} idx={idx} />\n ))}\n </SimpleGrid>\n\n {/* Video Modal */}\n <Modal isOpen={isOpen} onClose={onClose} size=\"6xl\" isCentered>\n <ModalOverlay bg=\"blackAlpha.800\" />\n <ModalContent bg=\"transparent\" boxShadow=\"none\" maxW=\"90vw\">\n <ModalCloseButton color=\"white\" size=\"lg\" bg=\"blackAlpha.600\" _hover={{ bg: 'blackAlpha.700' }} borderRadius=\"full\" zIndex={2} />\n <ModalBody p={0}>\n {selectedVideo && (\n <Box>\n <AspectRatio ratio={16 / 9} maxH=\"90vh\">\n <iframe\n src={`${selectedVideo.embedUrl}?autoplay=1&vq=hd1080&rel=0&modestbranding=1&playsinline=1`}\n title={selectedVideo.title}\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n allowFullScreen\n loading=\"lazy\"\n referrerPolicy=\"strict-origin-when-cross-origin\"\n />\n </AspectRatio>\n <Box bg={useColorModeValue('white', 'gray.800')} p={4} borderRadius=\"md\" mt={2}>\n <HStack justify=\"space-between\" align=\"start\">\n <VStack align=\"start\" flex={1}>\n <Text fontWeight=\"bold\" fontSize=\"lg\">{selectedVideo.title}</Text>\n {selectedVideo.date && (\n <Text color={useColorModeValue('gray.600', 'gray.300')} fontSize=\"sm\">\n {new Date(selectedVideo.date).toLocaleDateString('cs-CZ', { year: 'numeric', month: 'long', day: 'numeric' })}\n </Text>\n )}\n </VStack>\n {selectedVideo.videoId && (\n <Link href={`https://www.youtube.com/watch?v=${selectedVideo.videoId}`} isExternal>\n <Button size=\"sm\" colorScheme=\"red\" leftIcon={<Icon as={FaYoutube} />}>{t('action.open_on_youtube')}</Button>\n </Link>\n )}\n </HStack>\n {selectedVideo.videoId && (\n <Box mt={4}>\n <CommentsSection targetType=\"youtube_video\" targetId={selectedVideo.videoId} />\n </Box>\n )}\n </Box>\n </Box>\n )}\n </ModalBody>\n </ModalContent>\n </Modal>\n </Box>\n );\n};\n\nexport default React.memo(VideosSection);\n","/**\n * Typography System - Google Fonts Configuration\n * Provides curated font pairings with preview support\n */\n\nexport interface FontPairing {\n id: string;\n name: string;\n heading: string;\n body: string;\n googleFontsUrl: string;\n cssHeading: string;\n cssBody: string;\n description: string;\n style: 'modern' | 'classic' | 'elegant' | 'bold' | 'playful' | 'tech';\n}\n\nexport const FONT_PAIRINGS: FontPairing[] = [\n {\n id: 'inter-inter',\n name: 'Inter (Modern Clean)',\n heading: 'Inter',\n body: 'Inter',\n googleFontsUrl: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap',\n cssHeading: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n cssBody: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n description: 'Moderní univerzální font navržený pro digitální čtení',\n style: 'modern',\n },\n {\n id: 'montserrat-opensans',\n name: 'Montserrat & Open Sans (Klasika)',\n heading: 'Montserrat',\n body: 'Open Sans',\n googleFontsUrl: 'https://fonts.googleapis.com/css2?family=Montserrat:wght@600;700;800;900&family=Open+Sans:wght@400;500;600;700&display=swap',\n cssHeading: \"'Montserrat', -apple-system, sans-serif\",\n cssBody: \"'Open Sans', -apple-system, sans-serif\",\n description: 'Oblíbená kombinace pro čitelnost a profesionalitu',\n style: 'classic',\n },\n {\n id: 'poppins-roboto',\n name: 'Poppins & Roboto (Sportovní)',\n heading: 'Poppins',\n body: 'Roboto',\n googleFontsUrl: 'https://fonts.googleapis.com/css2?family=Poppins:wght@600;700;800;900&family=Roboto:wght@400;500;600;700&display=swap',\n cssHeading: \"'Poppins', -apple-system, sans-serif\",\n cssBody: \"'Roboto', -apple-system, sans-serif\",\n description: 'Dynamická kombinace vhodná pro sportovní weby',\n style: 'bold',\n },\n {\n id: 'raleway-lato',\n name: 'Raleway & Lato (Elegantní)',\n heading: 'Raleway',\n body: 'Lato',\n googleFontsUrl: 'https://fonts.googleapis.com/css2?family=Raleway:wght@600;700;800;900&family=Lato:wght@400;500;600;700&display=swap',\n cssHeading: \"'Raleway', -apple-system, sans-serif\",\n cssBody: \"'Lato', -apple-system, sans-serif\",\n description: 'Elegantní a lehká kombinace pro prémiový vzhled',\n style: 'elegant',\n },\n {\n id: 'oswald-sourcesan',\n name: 'Oswald & Source Sans (Silné)',\n heading: 'Oswald',\n body: 'Source Sans 3',\n googleFontsUrl: 'https://fonts.googleapis.com/css2?family=Oswald:wght@600;700&family=Source+Sans+3:wght@400;500;600;700&display=swap',\n cssHeading: \"'Oswald', -apple-system, sans-serif\",\n cssBody: \"'Source Sans 3', -apple-system, sans-serif\",\n description: 'Výrazné nadpisy s čitelným textem',\n style: 'bold',\n },\n {\n id: 'nunito-nunito',\n name: 'Nunito (Přátelské)',\n heading: 'Nunito',\n body: 'Nunito',\n googleFontsUrl: 'https://fonts.googleapis.com/css2?family=Nunito:wght@400;500;600;700;800;900&display=swap',\n cssHeading: \"'Nunito', -apple-system, sans-serif\",\n cssBody: \"'Nunito', -apple-system, sans-serif\",\n description: 'Přátelský a přístupný vzhled pro komunitní weby',\n style: 'playful',\n },\n {\n id: 'worksans-worksans',\n name: 'Work Sans (Tech)',\n heading: 'Work Sans',\n body: 'Work Sans',\n googleFontsUrl: 'https://fonts.googleapis.com/css2?family=Work+Sans:wght@400;500;600;700;800;900&display=swap',\n cssHeading: \"'Work Sans', -apple-system, sans-serif\",\n cssBody: \"'Work Sans', -apple-system, sans-serif\",\n description: 'Moderní technický vzhled s výbornou čitelností',\n style: 'tech',\n },\n {\n id: 'rubik-rubik',\n name: 'Rubik (Zaoblené)',\n heading: 'Rubik',\n body: 'Rubik',\n googleFontsUrl: 'https://fonts.googleapis.com/css2?family=Rubik:wght@400;500;600;700;800;900&display=swap',\n cssHeading: \"'Rubik', -apple-system, sans-serif\",\n cssBody: \"'Rubik', -apple-system, sans-serif\",\n description: 'Zaoblený a moderní design s přátelským dojmem',\n style: 'playful',\n },\n {\n id: 'playfair-sourcesans',\n name: 'Playfair & Source Sans (Prestižní)',\n heading: 'Playfair Display',\n body: 'Source Sans 3',\n googleFontsUrl: 'https://fonts.googleapis.com/css2?family=Playfair+Display:wght@600;700;800;900&family=Source+Sans+3:wght@400;500;600;700&display=swap',\n cssHeading: \"'Playfair Display', Georgia, serif\",\n cssBody: \"'Source Sans 3', -apple-system, sans-serif\",\n description: 'Prestižní serifový nadpis s moderním textem',\n style: 'elegant',\n },\n {\n id: 'bebas-opensans',\n name: 'Bebas Neue & Open Sans (Impact)',\n heading: 'Bebas Neue',\n body: 'Open Sans',\n googleFontsUrl: 'https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Open+Sans:wght@400;500;600;700&display=swap',\n cssHeading: \"'Bebas Neue', -apple-system, sans-serif\",\n cssBody: \"'Open Sans', -apple-system, sans-serif\",\n description: 'Masivní nadpisy pro maximální dojem',\n style: 'bold',\n },\n {\n id: 'archivo-archivo',\n name: 'Archivo (Kompaktní)',\n heading: 'Archivo',\n body: 'Archivo',\n googleFontsUrl: 'https://fonts.googleapis.com/css2?family=Archivo:wght@400;500;600;700;800;900&display=swap',\n cssHeading: \"'Archivo', -apple-system, sans-serif\",\n cssBody: \"'Archivo', -apple-system, sans-serif\",\n description: 'Kompaktní a efektivní pro hustší obsah',\n style: 'tech',\n },\n {\n id: 'exo-exo',\n name: 'Exo 2 (Futuristické)',\n heading: 'Exo 2',\n body: 'Exo 2',\n googleFontsUrl: 'https://fonts.googleapis.com/css2?family=Exo+2:wght@400;500;600;700;800;900&display=swap',\n cssHeading: \"'Exo 2', -apple-system, sans-serif\",\n cssBody: \"'Exo 2', -apple-system, sans-serif\",\n description: 'Futuristický a technologický vzhled',\n style: 'tech',\n },\n];\n\n/**\n * Get font pairing by ID\n */\nexport const getFontPairing = (id: string): FontPairing | undefined => {\n return FONT_PAIRINGS.find((f) => f.id === id);\n};\n\n/**\n * Get default font pairing\n */\nexport const getDefaultFontPairing = (): FontPairing => {\n return FONT_PAIRINGS[0]; // Inter by default\n};\n\n/**\n * Load Google Font dynamically\n */\nexport const loadGoogleFont = (googleFontsUrl: string): void => {\n const existingLink = document.querySelector(`link[href=\"${googleFontsUrl}\"]`);\n if (existingLink) return; // Already loaded\n\n const link = document.createElement('link');\n link.href = googleFontsUrl;\n link.rel = 'stylesheet';\n link.crossOrigin = 'anonymous';\n document.head.appendChild(link);\n};\n\n/**\n * Apply font pairing to document\n */\nexport const applyFontPairing = (pairing: FontPairing): void => {\n loadGoogleFont(pairing.googleFontsUrl);\n \n // Set CSS custom properties\n document.documentElement.style.setProperty('--font-heading', pairing.cssHeading);\n document.documentElement.style.setProperty('--font-body', pairing.cssBody);\n document.documentElement.style.setProperty('--chakra-fonts-heading', pairing.cssHeading);\n document.documentElement.style.setProperty('--chakra-fonts-body', pairing.cssBody);\n};\n\n/**\n * Get font style badge color\n */\nexport const getFontStyleColor = (style: FontPairing['style']): string => {\n const colors: Record<FontPairing['style'], string> = {\n modern: 'blue',\n classic: 'gray',\n elegant: 'purple',\n bold: 'orange',\n playful: 'pink',\n tech: 'cyan',\n };\n return colors[style] || 'gray';\n};\n","import React, { useState } from 'react';\nimport {\n Box,\n VStack,\n HStack,\n FormControl,\n FormLabel,\n Button,\n Badge,\n Text,\n useToast,\n Select,\n Spinner,\n Alert,\n AlertIcon,\n IconButton,\n useColorModeValue,\n Collapse,\n Divider,\n Input,\n Textarea,\n Switch,\n Tabs,\n TabList,\n TabPanels,\n Tab,\n TabPanel,\n} from '@chakra-ui/react';\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { AddIcon, DeleteIcon, ChevronDownIcon, ChevronUpIcon, CloseIcon } from '@chakra-ui/icons';\nimport { FiPlus } from 'react-icons/fi';\nimport { getAdminPolls, getPolls, createPoll, updatePoll, Poll, CreatePollRequest } from '../../services/polls';\nimport { useConfirmDialog } from '../../contexts/ConfirmDialogContext';\n\ninterface PollLinkerProps {\n articleId?: number;\n eventId?: number;\n onPollsChanged?: () => void;\n}\n\n/**\n * PollLinker - Component to manage poll associations with articles/events\n * Can be embedded in article and activity admin pages\n */\nconst PollLinker: React.FC<PollLinkerProps> = ({ articleId, eventId, onPollsChanged }) => {\n const toast = useToast();\n const queryClient = useQueryClient();\n const [isExpanded, setIsExpanded] = useState(true);\n const [selectedPollId, setSelectedPollId] = useState<string>('');\n const [showCreateForm, setShowCreateForm] = useState(false);\n const { confirm } = useConfirmDialog();\n \n // Poll creation form state\n const [newPollData, setNewPollData] = useState<CreatePollRequest>({\n title: '',\n description: '',\n type: 'single',\n style: 'auto',\n status: 'active',\n allow_multiple: false,\n max_choices: 1,\n show_results: 'after_vote',\n require_auth: false,\n allow_guest_vote: true,\n featured: false,\n options: [\n { text: '', display_order: 0 },\n { text: '', display_order: 1 },\n ],\n });\n\n const bgBox = useColorModeValue('gray.50', 'gray.700');\n const borderColor = useColorModeValue('gray.200', 'gray.600');\n\n // Query for existing polls\n const queryParams = articleId ? { article_id: articleId } : eventId ? { event_id: eventId } : {};\n \n const { data: linkedPolls, isLoading: isLoadingLinked } = useQuery({\n queryKey: ['linked-polls', queryParams],\n queryFn: () => getPolls(queryParams),\n enabled: !!(articleId || eventId),\n });\n\n // Query for all available polls\n const { data: allPolls, isLoading: isLoadingAll } = useQuery({\n queryKey: ['all-admin-polls'],\n queryFn: () => getAdminPolls({ status: 'active' }),\n });\n\n // Mutation to link existing poll\n const linkPollMutation = useMutation({\n mutationFn: async (pollId: number) => {\n const updateData: any = {};\n if (articleId) updateData.related_article_id = articleId;\n if (eventId) updateData.related_event_id = eventId;\n \n return updatePoll(pollId, updateData);\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['linked-polls'] });\n queryClient.invalidateQueries({ queryKey: ['all-admin-polls'] });\n toast({\n title: 'Anketa propojena',\n status: 'success',\n duration: 3000,\n });\n setSelectedPollId('');\n if (onPollsChanged) onPollsChanged();\n },\n onError: (error: any) => {\n toast({\n title: 'Chyba',\n description: error.response?.data?.error || 'Nepodařilo se propojit anketu',\n status: 'error',\n duration: 5000,\n });\n },\n });\n\n // Mutation to unlink poll\n const unlinkPollMutation = useMutation({\n mutationFn: async (pollId: number) => {\n const updateData: any = {};\n if (articleId) updateData.related_article_id = null;\n if (eventId) updateData.related_event_id = null;\n \n return updatePoll(pollId, updateData);\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['linked-polls'] });\n queryClient.invalidateQueries({ queryKey: ['all-admin-polls'] });\n toast({\n title: 'Anketa odpojena',\n status: 'success',\n duration: 3000,\n });\n if (onPollsChanged) onPollsChanged();\n },\n onError: (error: any) => {\n toast({\n title: 'Chyba',\n description: error.response?.data?.error || 'Nepodařilo se odpojit anketu',\n status: 'error',\n duration: 5000,\n });\n },\n });\n\n // Mutation to create new poll\n const createPollMutation = useMutation({\n mutationFn: async (pollData: CreatePollRequest) => {\n // Add relation to article or event\n const createData = { ...pollData };\n if (articleId) createData.related_article_id = articleId;\n if (eventId) createData.related_event_id = eventId;\n \n return createPoll(createData);\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['linked-polls'] });\n queryClient.invalidateQueries({ queryKey: ['all-admin-polls'] });\n toast({\n title: 'Anketa vytvořena a propojena',\n status: 'success',\n duration: 3000,\n });\n setShowCreateForm(false);\n resetNewPollForm();\n if (onPollsChanged) onPollsChanged();\n },\n onError: (error: any) => {\n toast({\n title: 'Chyba při vytváření ankety',\n description: error.response?.data?.error || 'Nepodařilo se vytvořit anketu',\n status: 'error',\n duration: 5000,\n });\n },\n });\n\n const handleLinkPoll = () => {\n if (!selectedPollId) {\n toast({\n title: 'Vyberte anketu',\n description: 'Prosím vyberte anketu ze seznamu',\n status: 'warning',\n duration: 3000,\n });\n return;\n }\n linkPollMutation.mutate(parseInt(selectedPollId));\n };\n\n const handleUnlinkPoll = async (pollId: number) => {\n const ok = await confirm({\n title: 'Odpojit anketu',\n message: 'Opravdu chcete odpojit tuto anketu?',\n confirmText: 'Odpojit',\n cancelText: 'Zrušit',\n isDanger: true,\n });\n if (!ok) return;\n unlinkPollMutation.mutate(pollId);\n };\n\n const resetNewPollForm = () => {\n setNewPollData({\n title: '',\n description: '',\n type: 'single',\n style: 'auto',\n status: 'active',\n allow_multiple: false,\n max_choices: 1,\n show_results: 'after_vote',\n require_auth: false,\n allow_guest_vote: true,\n featured: false,\n options: [\n { text: '', display_order: 0 },\n { text: '', display_order: 1 },\n ],\n });\n };\n\n const handleCreatePoll = () => {\n // Validate form\n if (!newPollData.title.trim()) {\n toast({\n title: 'Chybí název ankety',\n status: 'warning',\n duration: 3000,\n });\n return;\n }\n\n const validOptions = newPollData.options.filter(opt => opt.text.trim());\n if (validOptions.length < 2) {\n toast({\n title: 'Anketa musí mít alespoň 2 možnosti',\n status: 'warning',\n duration: 3000,\n });\n return;\n }\n\n // Submit with only valid options\n createPollMutation.mutate({\n ...newPollData,\n options: validOptions,\n });\n };\n\n const addOption = () => {\n setNewPollData(prev => ({\n ...prev,\n options: [...prev.options, { text: '', display_order: prev.options.length }],\n }));\n };\n\n const removeOption = (index: number) => {\n if (newPollData.options.length <= 2) {\n toast({\n title: 'Anketa musí mít alespoň 2 možnosti',\n status: 'warning',\n duration: 2000,\n });\n return;\n }\n setNewPollData(prev => ({\n ...prev,\n options: prev.options.filter((_, i) => i !== index).map((opt, idx) => ({ ...opt, display_order: idx })),\n }));\n };\n\n const updateOption = (index: number, text: string) => {\n setNewPollData(prev => ({\n ...prev,\n options: prev.options.map((opt, i) => i === index ? { ...opt, text } : opt),\n }));\n };\n\n // Filter out polls that are already linked to THIS content to avoid duplicates\n // But allow polls that are linked elsewhere (user can decide to reuse)\n const linkedPollIds = new Set(linkedPolls?.map((p: Poll) => p.id) || []);\n const availablePolls = allPolls?.filter((p: Poll) => !linkedPollIds.has(p.id)) || [];\n\n // For debugging: also include all polls to see what's available\n const allAvailablePolls = allPolls || [];\n\n if (!articleId && !eventId) {\n return null;\n }\n\n return (\n <Box\n borderWidth=\"1px\"\n borderColor={borderColor}\n borderRadius=\"md\"\n p={4}\n bg={bgBox}\n >\n <VStack align=\"stretch\" spacing={3}>\n <HStack justify=\"space-between\">\n <HStack>\n <Text fontWeight=\"bold\" fontSize=\"sm\">\n Ankety ({linkedPolls?.length || 0})\n </Text>\n {(linkedPolls?.length || 0) > 0 && (\n <Badge colorScheme=\"blue\">{linkedPolls!.length} připojeno</Badge>\n )}\n </HStack>\n <IconButton\n aria-label={isExpanded ? 'Skrýt' : 'Zobrazit'}\n icon={isExpanded ? <ChevronUpIcon /> : <ChevronDownIcon />}\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => setIsExpanded(!isExpanded)}\n />\n </HStack>\n\n <Collapse in={isExpanded}>\n <VStack spacing={4} align=\"stretch\">\n {isLoadingLinked ? (\n <HStack justify=\"center\" py={4}>\n <Spinner size=\"sm\" />\n <Text fontSize=\"sm\">Načítání anket...</Text>\n </HStack>\n ) : linkedPolls && linkedPolls.length > 0 ? (\n <VStack spacing={2} align=\"stretch\">\n <Text fontSize=\"xs\" fontWeight=\"bold\" color=\"gray.500\">\n Připojené ankety:\n </Text>\n {linkedPolls.map((poll: Poll) => (\n <HStack\n key={poll.id}\n p={2}\n borderWidth=\"1px\"\n borderRadius=\"md\"\n justify=\"space-between\"\n bg=\"white\"\n _dark={{ bg: 'gray.800' }}\n >\n <VStack align=\"start\" spacing={0} flex={1}>\n <Text fontSize=\"sm\" fontWeight=\"medium\">\n {poll.title}\n </Text>\n <HStack spacing={2}>\n <Badge size=\"sm\" colorScheme={poll.status === 'active' ? 'green' : 'gray'}>\n {poll.status}\n </Badge>\n <Text fontSize=\"xs\" color=\"gray.500\">\n {poll.total_votes} hlasů\n </Text>\n </HStack>\n </VStack>\n <IconButton\n aria-label=\"Odpojit anketu\"\n icon={<DeleteIcon />}\n size=\"sm\"\n colorScheme=\"red\"\n variant=\"ghost\"\n onClick={() => handleUnlinkPoll(poll.id)}\n isLoading={unlinkPollMutation.isPending}\n />\n </HStack>\n ))}\n </VStack>\n ) : (\n <Alert status=\"info\" size=\"sm\">\n <AlertIcon />\n <Text fontSize=\"sm\">Žádné ankety nejsou připojeny</Text>\n </Alert>\n )}\n\n <Divider />\n\n <Tabs size=\"sm\" variant=\"enclosed\" defaultIndex={1}>\n <TabList>\n <Tab>Propojit existující</Tab>\n <Tab>Vytvořit novou</Tab>\n </TabList>\n\n <TabPanels>\n {/* Tab 1: Link existing poll */}\n <TabPanel px={0} py={3}>\n {isLoadingAll ? (\n <HStack justify=\"center\" py={4}>\n <Spinner size=\"sm\" />\n </HStack>\n ) : availablePolls.length > 0 ? (\n <VStack spacing={3} align=\"stretch\">\n <HStack>\n <Select\n value={selectedPollId}\n onChange={(e) => setSelectedPollId(e.target.value)}\n placeholder=\"Vyberte anketu...\"\n size=\"sm\"\n flex={1}\n >\n {availablePolls.map((poll: Poll) => (\n <option key={poll.id} value={poll.id}>\n {poll.title} ({poll.status}) - {poll.total_votes} hlasů\n </option>\n ))}\n </Select>\n <Button\n leftIcon={<AddIcon />}\n onClick={handleLinkPoll}\n size=\"sm\"\n colorScheme=\"blue\"\n isLoading={linkPollMutation.isPending}\n isDisabled={!selectedPollId}\n >\n Připojit\n </Button>\n </HStack>\n </VStack>\n ) : allAvailablePolls.length > 0 ? (\n <Alert status=\"warning\" size=\"sm\">\n <AlertIcon />\n <VStack align=\"start\" spacing={2}>\n <Text fontSize=\"sm\">Všechny aktivní ankety jsou již propojeny s touto aktivitou.</Text>\n <Text fontSize=\"xs\" color=\"gray.600\">\n Dostupné ankety ({allAvailablePolls.length}): {allAvailablePolls.map(p => p.title).join(', ')}\n </Text>\n </VStack>\n </Alert>\n ) : (\n <Alert status=\"info\" size=\"sm\">\n <AlertIcon />\n <Text fontSize=\"sm\">Žádné dostupné ankety. Vytvořte novou v druhé záložce.</Text>\n </Alert>\n )}\n </TabPanel>\n\n {/* Tab 2: Create new poll */}\n <TabPanel px={0} py={3}>\n <VStack spacing={3} align=\"stretch\">\n <HStack spacing={2} flexWrap=\"wrap\">\n <Button size=\"xs\" onClick={() => setNewPollData(prev => ({\n ...prev,\n title: 'Hodnocení zápasu',\n description: 'Ohodnoťte zápas (1 = nejhorší, 5 = nejlepší)',\n type: 'rating',\n style: 'rating-stars',\n allow_multiple: false,\n max_choices: 1,\n options: Array.from({ length: 5 }).map((_, i) => ({ text: String(i+1), display_order: i+1 }))\n }))}>⭐ 5</Button>\n <Button size=\"xs\" onClick={() => setNewPollData(prev => ({\n ...prev,\n title: 'Hodnocení (110)',\n description: 'Ohodnoťte (1 = nejhorší, 10 = nejlepší)',\n type: 'rating',\n style: 'rating-scale',\n allow_multiple: false,\n max_choices: 1,\n options: Array.from({ length: 10 }).map((_, i) => ({ text: String(i+1), display_order: i+1 }))\n }))}>110</Button>\n <Button size=\"xs\" onClick={() => setNewPollData(prev => ({\n ...prev,\n title: 'Docházka',\n description: 'Dej vědět, zda dorazíš.',\n type: 'single',\n style: 'choices-chips',\n allow_multiple: false,\n max_choices: 1,\n options: [\n { text: 'Ano', display_order: 0 },\n { text: 'Ne', display_order: 1 },\n { text: 'Možná', display_order: 2 },\n ]\n }))}>Docházka</Button>\n <Button size=\"xs\" onClick={() => setNewPollData(prev => ({\n ...prev,\n title: 'Docházka (více možností)',\n description: 'Vyberte jednu nebo dvě možnosti.',\n type: 'multiple',\n style: 'choices-cards',\n allow_multiple: true,\n max_choices: 2,\n options: [\n { text: 'Ano', display_order: 0 },\n { text: 'Pozdě dorazím', display_order: 1 },\n { text: 'Ne', display_order: 2 },\n ]\n }))}>Docházka (multi)</Button>\n <Button size=\"xs\" onClick={() => setNewPollData(prev => ({\n ...prev,\n title: 'Výběr možností',\n description: 'Vyber až tři možnosti.',\n type: 'multiple',\n style: 'choices-list',\n allow_multiple: true,\n max_choices: 3,\n options: [\n { text: 'A', display_order: 0 },\n { text: 'B', display_order: 1 },\n { text: 'C', display_order: 2 },\n { text: 'D', display_order: 3 },\n ]\n }))}>Multi (3)</Button>\n </HStack>\n <FormControl isRequired>\n <FormLabel fontSize=\"sm\">Název ankety</FormLabel>\n <Input\n size=\"sm\"\n placeholder=\"např. Dorazíš na příští trénink?\"\n value={newPollData.title}\n onChange={(e) => setNewPollData(prev => ({ ...prev, title: e.target.value }))}\n />\n </FormControl>\n\n <FormControl>\n <FormLabel fontSize=\"sm\">Popis (volitelné)</FormLabel>\n <Textarea\n size=\"sm\"\n placeholder=\"Doplňující informace k anketě...\"\n rows={2}\n value={newPollData.description}\n onChange={(e) => setNewPollData(prev => ({ ...prev, description: e.target.value }))}\n />\n </FormControl>\n\n <FormControl>\n <FormLabel fontSize=\"sm\">Typ ankety</FormLabel>\n <Select\n size=\"sm\"\n value={newPollData.type}\n onChange={(e) => setNewPollData(prev => ({ ...prev, type: e.target.value as any }))}\n >\n <option value=\"single\">Jedna odpověď</option>\n <option value=\"multiple\">Více odpovědí</option>\n <option value=\"rating\">Hodnocení</option>\n </Select>\n </FormControl>\n\n <FormControl>\n <FormLabel fontSize=\"sm\">Styl</FormLabel>\n <Select\n size=\"sm\"\n value={(newPollData as any).style || 'auto'}\n onChange={(e) => setNewPollData(prev => ({ ...prev, style: e.target.value as any }))}\n >\n <option value=\"auto\">Automaticky</option>\n {newPollData.type === 'rating' ? (\n <>\n <option value=\"rating-stars\">Hvězdičky</option>\n <option value=\"rating-scale\">Číselná stupnice</option>\n </>\n ) : (\n <>\n <option value=\"choices-list\">Seznam</option>\n <option value=\"choices-chips\">Štítky</option>\n <option value=\"choices-cards\">Karty</option>\n </>\n )}\n </Select>\n </FormControl>\n\n <FormControl>\n <FormLabel fontSize=\"sm\">Možnosti (min. 2)</FormLabel>\n <VStack spacing={2} align=\"stretch\">\n {newPollData.options.map((option, index) => (\n <HStack key={index}>\n <Input\n size=\"sm\"\n placeholder={`Možnost ${index + 1}`}\n value={option.text}\n onChange={(e) => updateOption(index, e.target.value)}\n />\n {newPollData.options.length > 2 && (\n <IconButton\n aria-label=\"Odebrat možnost\"\n icon={<CloseIcon />}\n size=\"sm\"\n variant=\"ghost\"\n colorScheme=\"red\"\n onClick={() => removeOption(index)}\n />\n )}\n </HStack>\n ))}\n <Button\n size=\"sm\"\n variant=\"outline\"\n leftIcon={<AddIcon />}\n onClick={addOption}\n >\n Přidat možnost\n </Button>\n </VStack>\n </FormControl>\n\n <HStack spacing={4}>\n <FormControl display=\"flex\" alignItems=\"center\">\n <FormLabel fontSize=\"sm\" mb=\"0\" mr={2}>\n Povolit hlasování hostů\n </FormLabel>\n <Switch\n size=\"sm\"\n isChecked={newPollData.allow_guest_vote}\n onChange={(e) => setNewPollData(prev => ({ ...prev, allow_guest_vote: e.target.checked }))}\n />\n </FormControl>\n\n <FormControl display=\"flex\" alignItems=\"center\">\n <FormLabel fontSize=\"sm\" mb=\"0\" mr={2}>\n Aktivní\n </FormLabel>\n <Switch\n size=\"sm\"\n isChecked={newPollData.status === 'active'}\n onChange={(e) => setNewPollData(prev => ({ ...prev, status: e.target.checked ? 'active' : 'draft' }))}\n />\n </FormControl>\n </HStack>\n\n <Button\n colorScheme=\"green\"\n size=\"sm\"\n leftIcon={<AddIcon />}\n onClick={handleCreatePoll}\n isLoading={createPollMutation.isPending}\n >\n Vytvořit anketu\n </Button>\n </VStack>\n </TabPanel>\n </TabPanels>\n </Tabs>\n\n <Text fontSize=\"xs\" color=\"gray.500\" mt={2}>\n 💡 Tip: Ankety se zobrazí automaticky na konci {articleId ? 'článku' : 'aktivity'}\n </Text>\n </VStack>\n </Collapse>\n </VStack>\n </Box>\n );\n};\n\nexport default PollLinker;\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Box,\n Button,\n Container,\n Heading,\n HStack,\n VStack,\n Table,\n Thead,\n Tbody,\n Tr,\n Th,\n Td,\n Badge,\n useDisclosure,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalCloseButton,\n ModalBody,\n ModalFooter,\n FormControl,\n FormLabel,\n Input,\n Textarea,\n Select,\n useToast,\n SimpleGrid,\n Text,\n NumberInput,\n NumberInputField,\n IconButton,\n Divider,\n Image,\n FormHelperText,\n Tabs,\n TabList,\n Tab,\n TabPanels,\n TabPanel,\n} from '@chakra-ui/react';\nimport { Link as RouterLink } from 'react-router-dom';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport DateRangePicker from '../../components/common/DateRangePicker';\nimport {\n adminListSweepstakes,\n adminCreateSweepstake,\n adminUpdateSweepstake,\n adminDeleteSweepstake,\n adminListEntries,\n adminListWinners,\n adminFinalizeSweepstake,\n Sweepstake,\n adminListPrizes,\n adminCreatePrize,\n adminUpdatePrize,\n adminDeletePrize,\n adminReorderPrizes,\n SweepstakePrize,\n} from '../../services/sweepstakes';\nimport { AddIcon, ArrowUpIcon, ArrowDownIcon, DeleteIcon, EditIcon } from '@chakra-ui/icons';\nimport { uploadFile, createArticle } from '../../services/articles';\nimport { getImageUrl } from '../../utils/imageUtils';\nimport SaveStatusIndicator from '../../components/common/SaveStatusIndicator';\nimport { useAutoSave, loadDraft } from '../../hooks/useAutoSave';\nimport UploadPanel, { UploadPanelFile } from '../../components/common/UploadPanel';\nimport { useConfirmDialog } from '../../contexts/ConfirmDialogContext';\n\nconst fmt = (iso?: string | null) => {\n if (!iso) return '';\n const d = new Date(iso);\n return isNaN(d.getTime()) ? '' : d.toLocaleString('cs-CZ');\n};\n\nconst defaultForm = {\n title: '',\n description: '',\n image_url: '',\n rules_url: '',\n start_at: '',\n end_at: '',\n picker_style: 'cycler',\n total_prizes: 1,\n prize_summary: '',\n entry_cost_points: 0,\n max_entries_per_user: 1,\n};\n\nconst SweepstakesAdminPage: React.FC = () => {\n const toast = useToast();\n const [items, setItems] = useState<Sweepstake[]>([]);\n const [loading, setLoading] = useState<boolean>(true);\n const [status, setStatus] = useState<string>('');\n const { confirm } = useConfirmDialog();\n\n const { isOpen, onOpen, onClose } = useDisclosure();\n const [form, setForm] = useState<any>(defaultForm);\n const [editing, setEditing] = useState<Sweepstake | null>(null);\n const editingRef = useRef<Sweepstake | null>(null);\n useEffect(() => { editingRef.current = editing; }, [editing]);\n const [draftKey, setDraftKey] = useState<string>('draft-sweepstake-new');\n const [showDraftRecovery, setShowDraftRecovery] = useState<boolean>(false);\n const [pendingDraft, setPendingDraft] = useState<any | null>(null);\n\n // Prizes state (integrated tab)\n const [prizes, setPrizes] = useState<SweepstakePrize[]>([]);\n const [prizeForm, setPrizeForm] = useState<{ name: string; quantity: number | string; image_url?: string; kind?: 'physical'|'points'|'xp'|'points_xp'; points?: number; xp?: number; description?: string }>(() => ({ name: '', quantity: 1, image_url: '', kind: 'physical', points: 0, xp: 0, description: '' }));\n const [savingPrize, setSavingPrize] = useState<boolean>(false);\n\n const { isOpen: isPrizeEditOpen, onOpen: onOpenPrizeEdit, onClose: onClosePrizeEdit } = useDisclosure();\n const [editingPrize, setEditingPrize] = useState<SweepstakePrize | null>(null);\n const [prizeEditForm, setPrizeEditForm] = useState<{ name: string; quantity: number | string; image_url?: string; kind?: 'physical'|'points'|'xp'|'points_xp'; points?: number; xp?: number; description?: string }>({ name: '', quantity: 1, image_url: '', kind: 'physical', points: 0, xp: 0, description: '' });\n const [activeTab, setActiveTab] = useState<number>(0);\n const [coverPreview, setCoverPreview] = useState<string>('');\n\n const uploadCoverImage = async (file: File): Promise<UploadPanelFile> => {\n const res = await uploadFile(file);\n setForm((prev: any) => ({ ...prev, image_url: res.url }));\n return {\n url: res.url,\n name: file.name,\n type: file.type || (res as any).type || 'image/*',\n size: file.size || (res as any).size || 0,\n };\n };\n\n // Build normalized payload for backend\n const buildPayload = (data: any) => {\n const now = new Date();\n const s = data.start_at ? new Date(data.start_at) : new Date(now.getTime() + 60 * 60 * 1000);\n const e = data.end_at ? new Date(data.end_at) : new Date(s.getTime() + 14 * 24 * 60 * 60 * 1000);\n const tpRaw = Number(data.total_prizes || 1);\n const tp = Number.isFinite(tpRaw) ? Math.floor(tpRaw) : 1;\n const total_prizes = tp < 1 ? 1 : (tp > 100 ? 100 : tp);\n const entry_cost_points = Math.max(0, Number(data.entry_cost_points) || 0);\n const max_entries_per_user = Math.max(1, Number(data.max_entries_per_user) || 1);\n return {\n title: (data.title || '').trim() || 'Nová soutěž',\n description: data.description || '',\n image_url: data.image_url || '',\n rules_url: data.rules_url || '',\n picker_style: data.picker_style || 'cycler',\n prize_summary: data.prize_summary || '',\n total_prizes,\n entry_cost_points,\n max_entries_per_user,\n start_at: isNaN(s.getTime()) ? new Date(now.getTime() + 60 * 60 * 1000).toISOString() : s.toISOString(),\n end_at: isNaN(e.getTime()) ? new Date(now.getTime() + 15 * 24 * 60 * 60 * 1000).toISOString() : e.toISOString(),\n } as any;\n };\n\n // Auto-save (concept) like Articles\n const { saveStatus, lastSaved, forceSave, clearDraft, hasDraft, draftAge } = useAutoSave<any>({\n data: { id: (editing as any)?.id, ...form },\n storageKey: draftKey,\n onSave: async (data) => {\n const payload = buildPayload(data);\n if (data.id) {\n const res = await adminUpdateSweepstake(data.id, payload);\n return res;\n }\n if ((data.title || '').trim()) {\n const created = await adminCreateSweepstake(payload);\n setEditing(created);\n setDraftKey(`draft-sweepstake-${created.id}`);\n try { localStorage.removeItem('draft-sweepstake-new'); } catch {}\n return created;\n }\n return {} as any;\n },\n debounceMs: 2000,\n enabled: isOpen,\n });\n\n // Ensure sweepstake exists (auto-create draft) so prizes can be added without manual save\n const ensureCreated = async (): Promise<Sweepstake | null> => {\n try {\n if (editingRef.current) return editingRef.current;\n // Try auto-save first to create the draft\n await forceSave();\n // Wait briefly for editing to be set by auto-save\n const startWait = Date.now();\n while (!editingRef.current && Date.now() - startWait < 1500) {\n // eslint-disable-next-line no-await-in-loop\n await new Promise((r) => setTimeout(r, 100));\n }\n if (editingRef.current) return editingRef.current;\n // Fallback: create explicitly\n const payload = buildPayload(form);\n const created = await adminCreateSweepstake(payload);\n setEditing(created);\n setDraftKey(`draft-sweepstake-${created.id}`);\n try { setPrizes(await adminListPrizes(created.id)); } catch { setPrizes([]); }\n setActiveTab(2);\n toast({ status: 'success', title: 'Koncept soutěže vytvořen' });\n return created;\n } catch {\n toast({ status: 'error', title: 'Nelze automaticky vytvořit soutěž' });\n return null;\n }\n };\n\n const uploadRulesFile = async (file: File): Promise<UploadPanelFile> => {\n const res = await uploadFile(file);\n setForm((prev: any) => ({ ...prev, rules_url: res.url }));\n return {\n url: res.url,\n name: file.name,\n type: file.type || (res as any).type || 'application/octet-stream',\n size: file.size || (res as any).size || 0,\n };\n };\n\n const onCreateRulesArticle = async () => {\n try {\n const title = (form.title ? `Pravidla soutěže: ${form.title}` : 'Pravidla soutěže').trim();\n const a = await createArticle({ title, content: '<p>Zde doplňte pravidla soutěže.</p>', published: true });\n const url = `/articles/${a.id}`;\n setForm((prev: any) => ({ ...prev, rules_url: url }));\n toast({ status: 'success', title: 'Stránka pravidel vytvořena' });\n } catch (e: any) {\n toast({ status: 'error', title: 'Nelze vytvořit stránku pravidel' });\n }\n };\n\n const load = async () => {\n setLoading(true);\n try {\n const res = await adminListSweepstakes(status ? { status } : undefined);\n setItems(res);\n } finally {\n setLoading(false);\n }\n };\n\n const openPrizes = async (it: Sweepstake) => {\n openEdit(it);\n setActiveTab(2);\n try { setPrizes(await adminListPrizes(it.id)); } catch { setPrizes([]); }\n };\n\n const addPrize = async () => {\n if (!editing) { toast({ status: 'info', title: 'Uložte soutěž a poté přidejte výhry' }); return; }\n if (!prizeForm.name.trim()) { toast({ status: 'error', title: 'Název výhry je povinný' }); return; }\n try {\n setSavingPrize(true);\n await adminCreatePrize(editing.id, { name: prizeForm.name, quantity: Math.max(1, parseInt(String(prizeForm.quantity || '1'), 10) || 1), image_url: prizeForm.image_url, display_order: prizes.length, kind: prizeForm.kind, points: prizeForm.points, xp: prizeForm.xp, description: prizeForm.description });\n setPrizeForm({ name: '', quantity: 1, image_url: '', kind: 'physical', points: 0, xp: 0, description: '' });\n setPrizes(await adminListPrizes(editing.id));\n } catch (e:any) {\n toast({ status: 'error', title: 'Nelze uložit výhru' });\n } finally {\n setSavingPrize(false);\n }\n };\n\n const delPrize = async (p: SweepstakePrize) => {\n if (!editing) return;\n const ok = await confirm({\n title: 'Smazat výhru',\n message: 'Smazat výhru?',\n confirmText: 'Smazat',\n cancelText: 'Zrušit',\n isDanger: true,\n });\n if (!ok) return;\n await adminDeletePrize(editing.id, p.id as any);\n setPrizes(await adminListPrizes(editing.id));\n };\n\n const movePrize = async (idx: number, dir: -1 | 1) => {\n if (!editing) return;\n const arr = [...prizes];\n const ni = idx + dir;\n if (ni < 0 || ni >= arr.length) return;\n const tmp = arr[idx];\n arr[idx] = arr[ni];\n arr[ni] = tmp;\n setPrizes(arr);\n await adminReorderPrizes(editing.id, arr.map(p => p.id as any));\n };\n\n const startEditPrize = (p: SweepstakePrize) => {\n setEditingPrize(p);\n setPrizeEditForm({\n name: p.name || '',\n quantity: p.quantity || 1,\n image_url: p.image_url || '',\n kind: (p.kind as any) || 'physical',\n points: p.points || 0,\n xp: p.xp || 0,\n description: p.description || '',\n });\n onOpenPrizeEdit();\n };\n\n const saveEditPrize = async () => {\n if (!editing || !editingPrize) return;\n try {\n setSavingPrize(true);\n await adminUpdatePrize(editing.id, editingPrize.id as any, {\n name: prizeEditForm.name,\n quantity: Math.max(1, parseInt(String(prizeEditForm.quantity || '1'), 10) || 1),\n image_url: prizeEditForm.image_url,\n kind: prizeEditForm.kind,\n points: prizeEditForm.points,\n xp: prizeEditForm.xp,\n description: prizeEditForm.description,\n });\n toast({ status: 'success', title: 'Výhra upravena' });\n onClosePrizeEdit();\n setEditingPrize(null);\n setPrizes(await adminListPrizes(editing.id));\n } catch (e:any) {\n toast({ status: 'error', title: 'Nelze upravit výhru' });\n } finally {\n setSavingPrize(false);\n }\n };\n\n useEffect(() => { load(); }, [status]);\n\n const openCreate = () => { setEditing(null); setForm(defaultForm); setPrizes([]); setActiveTab(0); onOpen(); };\n const openEdit = (it: Sweepstake) => {\n setEditing(it);\n setForm({\n title: it.title,\n description: it.description || '',\n image_url: (it as any).image_url || '',\n rules_url: (it as any).rules_url || '',\n start_at: (it as any).start_at ? String((it as any).start_at).slice(0, 16) : '',\n end_at: (it as any).end_at ? String((it as any).end_at).slice(0, 16) : '',\n picker_style: (it as any).picker_style || 'wheel',\n total_prizes: (it as any).total_prizes || 1,\n prize_summary: (it as any).prize_summary || '',\n entry_cost_points: (it as any).entry_cost_points ?? 0,\n max_entries_per_user: (it as any).max_entries_per_user ?? 1,\n });\n setActiveTab(0);\n onOpen();\n (async ()=>{ try { setPrizes(await adminListPrizes(it.id)); } catch { setPrizes([]); } })();\n };\n\n // Override open handlers to manage draft keys and recovery\n const openCreateWithDraft = () => {\n const key = 'draft-sweepstake-new';\n setDraftKey(key);\n const d = loadDraft<any>(key);\n if (d && Object.keys(d || {}).length) {\n setPendingDraft(d);\n setShowDraftRecovery(true);\n } else {\n setPendingDraft(null);\n setShowDraftRecovery(false);\n }\n openCreate();\n };\n const openEditWithDraft = (it: Sweepstake) => {\n setDraftKey(`draft-sweepstake-${it.id}`);\n const d = loadDraft<any>(`draft-sweepstake-${it.id}`);\n if (d && Object.keys(d || {}).length) {\n setPendingDraft(d);\n setShowDraftRecovery(true);\n } else {\n setPendingDraft(null);\n setShowDraftRecovery(false);\n }\n openEdit(it);\n };\n\n const save = async () => {\n try {\n if (!form.title || !form.start_at || !form.end_at) {\n toast({ status: 'error', title: 'Vyplňte název a datumy' });\n return;\n }\n const tpRaw = Number(form.total_prizes || 1);\n const tp = Number.isFinite(tpRaw) ? Math.floor(tpRaw) : 1;\n const total_prizes = tp < 1 ? 1 : (tp > 100 ? 100 : tp);\n const entry_cost_points = Math.max(0, Number(form.entry_cost_points) || 0);\n const max_entries_per_user = Math.max(1, Number(form.max_entries_per_user) || 1);\n // Normalize datetime-local (YYYY-MM-DDTHH:mm) to RFC3339 with timezone for Go backend\n const s = new Date(form.start_at);\n const e = new Date(form.end_at);\n const payload = {\n ...form,\n total_prizes,\n entry_cost_points,\n max_entries_per_user,\n start_at: isNaN(s.getTime()) ? form.start_at : s.toISOString(),\n end_at: isNaN(e.getTime()) ? form.end_at : e.toISOString(),\n };\n if (editing) {\n await adminUpdateSweepstake(editing.id, payload);\n toast({ status: 'success', title: 'Uloženo' });\n onClose();\n await load();\n } else {\n const created = await adminCreateSweepstake(payload);\n toast({ status: 'success', title: 'Vytvořeno', description: 'Nyní můžete přidat výhry' });\n setEditing(created);\n setActiveTab(2);\n try { setPrizes(await adminListPrizes(created.id)); } catch { setPrizes([]); }\n await load();\n }\n } catch (e: any) {\n toast({ status: 'error', title: 'Chyba', description: e?.response?.data?.error || 'Operace selhala' });\n }\n };\n\n const finalize = async (it: Sweepstake) => {\n const ok = await confirm({\n title: 'Spustit losování',\n message: 'Spustit losování a vybrat výherce?',\n confirmText: 'Losovat',\n cancelText: 'Zrušit',\n isDanger: true,\n });\n if (!ok) return;\n try { await adminFinalizeSweepstake(it.id); toast({ status: 'success', title: 'Losování dokončeno' }); await load(); }\n catch (e: any) { toast({ status: 'error', title: 'Chyba', description: e?.response?.data?.error || 'Nelze dokončit' }); }\n };\n\n const remove = async (it: Sweepstake) => {\n const ok = await confirm({\n title: 'Smazat soutěž',\n message: 'Smazat soutěž?',\n confirmText: 'Smazat',\n cancelText: 'Zrušit',\n isDanger: true,\n });\n if (!ok) return;\n try { await adminDeleteSweepstake(it.id); toast({ status: 'success', title: 'Smazáno' }); await load(); }\n catch (e: any) { toast({ status: 'error', title: 'Chyba', description: e?.response?.data?.error || 'Nelze smazat' }); }\n };\n\n const statusBadge = (s: string) => {\n const map: any = { draft: 'gray', scheduled: 'purple', active: 'green', locked: 'orange', finalized: 'blue', archived: 'red' };\n return <Badge colorScheme={map[s] || 'gray'}>{s}</Badge>;\n };\n\n return (\n <AdminLayout>\n <Container maxW=\"7xl\" py={8}>\n <HStack justify=\"space-between\" mb={4} flexWrap=\"wrap\">\n <Heading size=\"lg\">Soutěže</Heading>\n <HStack flexWrap=\"wrap\">\n <Select value={status} onChange={(e)=>setStatus(e.target.value)} size=\"sm\" maxW=\"220px\">\n <option value=\"\">Všechny</option>\n <option value=\"draft\">Koncepty</option>\n <option value=\"scheduled\">Naplánované</option>\n <option value=\"active\">Aktivní</option>\n <option value=\"finalized\">Dokončené</option>\n <option value=\"archived\">Archiv</option>\n </Select>\n <Button colorScheme=\"blue\" onClick={openCreateWithDraft} minW=\"max-content\">Nová soutěž</Button>\n </HStack>\n </HStack>\n\n {loading ? (\n <Text>Načítám…</Text>\n ) : (\n <Box overflowX=\"auto\">\n <Table size=\"sm\">\n <Thead>\n <Tr>\n <Th>Název</Th>\n <Th>Období</Th>\n <Th>Stav</Th>\n <Th>Výhry</Th>\n <Th>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {items.map((it) => (\n <Tr key={it.id}>\n <Td>\n <VStack align=\"start\" spacing={0}>\n <Text fontWeight=\"bold\">{it.title}</Text>\n {it.prize_summary && <Text fontSize=\"xs\" opacity={0.8}>{it.prize_summary}</Text>}\n <HStack spacing={2} wrap=\"wrap\">\n <Badge colorScheme={(it as any).entry_cost_points ? 'purple' : 'green'} fontSize=\"0.7rem\">\n {(it as any).entry_cost_points ? `Vstup: ${(it as any).entry_cost_points} bodů` : 'Vstup: zdarma'}\n </Badge>\n {(it as any).max_entries_per_user > 1 && (\n <Badge colorScheme=\"gray\" fontSize=\"0.7rem\">max {(it as any).max_entries_per_user}×/osoba</Badge>\n )}\n </HStack>\n </VStack>\n </Td>\n <Td>{fmt((it as any).start_at)} {fmt((it as any).end_at)}</Td>\n <Td>{statusBadge(it.status)}</Td>\n <Td>{(it as any).total_prizes || '-'}</Td>\n <Td>\n <HStack spacing={2}>\n <Button size=\"xs\" variant=\"outline\" onClick={()=>openEditWithDraft(it)}>Upravit</Button>\n <Button size=\"xs\" variant=\"outline\" onClick={()=>openPrizes(it)}>Výhry</Button>\n <Button size=\"xs\" as={RouterLink} to={`/admin/sweepstakes/${it.id}/visual`} variant=\"outline\">Vizualizace</Button>\n <Button size=\"xs\" variant=\"outline\" onClick={()=>finalize(it)} isDisabled={it.status === 'finalized'}>Losovat</Button>\n <Button size=\"xs\" colorScheme=\"red\" variant=\"outline\" onClick={()=>remove(it)}>Smazat</Button>\n </HStack>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n )}\n\n {/* Create/Edit Modal with tabs */}\n <Modal isOpen={isOpen} onClose={onClose} size={{ base: \"full\", md: \"full\", lg: \"full\" }} scrollBehavior=\"inside\" isCentered={false}>\n <ModalOverlay />\n <ModalContent maxW=\"none\" w={{ base: \"100%\", md: \"95vw\", lg: \"90vw\" }} h=\"90vh\" mx={4}>\n <ModalHeader>\n <HStack justify=\"space-between\" flexWrap=\"wrap\">\n <Text fontSize=\"lg\" fontWeight=\"bold\">{editing ? 'Upravit soutěž' : 'Nová soutěž'}</Text>\n <HStack spacing={3} flexShrink={0}>\n <SaveStatusIndicator status={saveStatus} lastSaved={lastSaved} compact />\n <Button size=\"sm\" variant=\"outline\" onClick={forceSave}>Uložit nyní</Button>\n </HStack>\n </HStack>\n </ModalHeader>\n <ModalCloseButton />\n <ModalBody minH=\"400px\" maxH=\"calc(90vh - 120px)\">\n {showDraftRecovery && (\n <Box mb={3} p={3} borderRadius=\"md\" bg=\"yellow.50\" borderWidth=\"1px\" borderColor=\"yellow.200\">\n <HStack justify=\"space-between\" align=\"center\">\n <Text>Byl nalezen místní koncept{draftAge!=null ? ` (před ${draftAge} min)` : ''}. Chcete jej obnovit?</Text>\n <HStack>\n <Button size=\"sm\" onClick={() => {\n if (pendingDraft) {\n const d: any = pendingDraft;\n setForm((prev: any) => ({ ...prev, ...d }));\n }\n setShowDraftRecovery(false);\n }}>Obnovit</Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => { clearDraft(); setShowDraftRecovery(false); setPendingDraft(null); }}>Zahodit</Button>\n </HStack>\n </HStack>\n </Box>\n )}\n <Tabs index={activeTab} onChange={setActiveTab as any} isFitted>\n <TabList>\n <Tab>Základní</Tab>\n <Tab>Termíny a limity</Tab>\n <Tab>Výhry</Tab>\n </TabList>\n <TabPanels>\n <TabPanel>\n <VStack spacing={4} align=\"stretch\">\n <FormControl isRequired>\n <FormLabel>Název</FormLabel>\n <Input value={form.title} onChange={(e)=>setForm({ ...form, title: e.target.value })} />\n </FormControl>\n <FormControl>\n <FormLabel>Popis</FormLabel>\n <Textarea value={form.description} onChange={(e)=>setForm({ ...form, description: e.target.value })} />\n </FormControl>\n <SimpleGrid columns={2} spacing={4}>\n <FormControl>\n <FormLabel>Titulní obrázek</FormLabel>\n <VStack align=\"start\" spacing={2}>\n <UploadPanel\n label=\"Titulní obrázek soutěže\"\n description=\"Nahrajte nebo přetáhněte titulní obrázek soutěže.\"\n accept=\"image/*\"\n multiple={false}\n maxFiles={1}\n uploadFn={uploadCoverImage}\n allowUrlImport\n urlPlaceholder=\"/uploads/... nebo https://example.com/cover.jpg\"\n onChange={(files) => {\n const last = files[files.length - 1];\n if (last?.url) {\n setCoverPreview('');\n setForm((prev: any) => ({ ...prev, image_url: last.url }));\n }\n }}\n />\n <HStack>\n <Image src={coverPreview || getImageUrl(form.image_url) || '/dist/img/logo-club-empty.svg'} alt=\"cover\" boxSize=\"80px\" objectFit=\"cover\" borderRadius=\"md\" />\n {form.image_url && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setForm((prev: any) => ({ ...prev, image_url: '' }));\n setCoverPreview('');\n }}\n >\n Odebrat\n </Button>\n )}\n </HStack>\n <Input placeholder=\"nebo vložte URL\" value={form.image_url} onChange={(e)=>setForm({ ...form, image_url: e.target.value })} />\n </VStack>\n </FormControl>\n <FormControl>\n <FormLabel>Pravidla</FormLabel>\n <VStack align=\"start\" spacing={2}>\n <HStack flexWrap=\"wrap\" spacing={2} align=\"flex-start\">\n <UploadPanel\n label=\"Pravidla soutěže\"\n description=\"Nahrajte PDF nebo obrázek s pravidly soutěže.\"\n accept=\"image/*,application/pdf\"\n multiple={false}\n maxFiles={1}\n uploadFn={uploadRulesFile}\n allowUrlImport\n urlPlaceholder=\"/uploads/... nebo https://example.com/pravidla.pdf\"\n onChange={(files) => {\n const last = files[files.length - 1];\n if (last?.url) {\n setForm((prev: any) => ({ ...prev, rules_url: last.url }));\n }\n }}\n />\n <Button variant=\"outline\" onClick={onCreateRulesArticle}>Vytvořit stránku</Button>\n {form.rules_url && (\n <Button\n as=\"a\"\n href={getImageUrl(form.rules_url) || form.rules_url}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n variant=\"ghost\"\n >\n Otevřít\n </Button>\n )}\n </HStack>\n <Input placeholder=\"nebo vložte URL\" value={form.rules_url} onChange={(e)=>setForm({ ...form, rules_url: e.target.value })} />\n </VStack>\n </FormControl>\n </SimpleGrid>\n </VStack>\n </TabPanel>\n <TabPanel>\n <VStack spacing={4} align=\"stretch\">\n <SimpleGrid columns={2} spacing={4}>\n <FormControl>\n <FormLabel>Začátek</FormLabel>\n <DateRangePicker\n from={form.start_at || undefined}\n to={form.end_at || undefined}\n onChange={(fromValue, toValue) => {\n setForm({ \n ...form, \n start_at: fromValue || '',\n end_at: toValue || ''\n });\n }}\n />\n </FormControl>\n </SimpleGrid>\n <SimpleGrid columns={2} spacing={4}>\n <FormControl>\n <FormLabel>Styl vizualizace</FormLabel>\n <Select value={form.picker_style} onChange={(e)=>setForm({ ...form, picker_style: e.target.value })}>\n <option value=\"wheel\">Kolo štěstí</option>\n <option value=\"cycler\">Náhodný přepínač</option>\n </Select>\n </FormControl>\n <FormControl isInvalid={Number(form.total_prizes) < 1 || Number(form.total_prizes) > 100}>\n <FormLabel>Počet výherců</FormLabel>\n <NumberInput value={String(form.total_prizes ?? '')} min={1} keepWithinRange={false} clampValueOnBlur={false} onChange={(v)=>setForm({ ...form, total_prizes: v })}>\n <NumberInputField />\n </NumberInput>\n <FormHelperText>Max. 100 výherců</FormHelperText>\n </FormControl>\n </SimpleGrid>\n <SimpleGrid columns={3} spacing={4}>\n <FormControl>\n <FormLabel>Vstupné (body)</FormLabel>\n <NumberInput min={0} value={Number(form.entry_cost_points)||0} onChange={(v)=>setForm({ ...form, entry_cost_points: Number(v) || 0 })}>\n <NumberInputField />\n </NumberInput>\n </FormControl>\n <FormControl>\n <FormLabel>Max. účastí / uživatel</FormLabel>\n <NumberInput min={1} keepWithinRange={false} clampValueOnBlur={false} value={String(form.max_entries_per_user ?? '')} onChange={(v)=>setForm({ ...form, max_entries_per_user: v })}>\n <NumberInputField />\n </NumberInput>\n </FormControl>\n </SimpleGrid>\n </VStack>\n </TabPanel>\n <TabPanel>\n <VStack align=\"stretch\" spacing={3}>\n <HStack flexWrap=\"wrap\" spacing={2}>\n <Button size=\"sm\" onClick={()=>setActiveTab(0)} variant=\"outline\">Zpět na základní</Button>\n <Button size=\"sm\" onClick={async ()=>{\n if (!editing) { await ensureCreated(); }\n setActiveTab(2);\n setPrizeForm({ ...prizeForm, name: 'Hlavní výhra', quantity: 1, kind: 'physical' });\n toast({ status:'info', title:'Předvyplněno: Hlavní výhra', description:'Upravte a klikněte Přidat' });\n }}>1× Hlavní výhra</Button>\n <Button size=\"sm\" onClick={async ()=>{\n if (!editing) { await ensureCreated(); }\n setActiveTab(2);\n setPrizeForm({ ...prizeForm, name: 'Menší výhra', quantity: 3, kind: 'physical' });\n toast({ status:'info', title:'Předvyplněno: 3× Menší výhra', description:'Upravte a klikněte Přidat' });\n }}>3× Menší výhry</Button>\n <Button size=\"sm\" onClick={async ()=>{\n if (!editing) { await ensureCreated(); }\n setActiveTab(2);\n setPrizeForm({ ...prizeForm, name: '100 bodů', quantity: 10, kind:'points', points: 100 });\n toast({ status:'info', title:'Předvyplněno: 10× 100 bodů', description:'Upravte a klikněte Přidat' });\n }}>10× 100 bodů</Button>\n <Button size=\"sm\" onClick={async ()=>{\n if (!editing) { await ensureCreated(); }\n setActiveTab(2);\n setPrizeForm({ ...prizeForm, name: '500 XP', quantity: 5, kind:'xp', xp: 500 });\n toast({ status:'info', title:'Předvyplněno: 5× 500 XP', description:'Upravte a klikněte Přidat' });\n }}>5× 500 XP</Button>\n </HStack>\n <Divider />\n {prizes.length === 0 && <Text color=\"gray.500\">Zatím žádné výhry</Text>}\n <VStack align=\"stretch\" spacing={2}>\n {prizes.map((p, i) => (\n <HStack key={p.id} spacing={2} borderWidth=\"1px\" borderRadius=\"md\" p={2} flexWrap=\"wrap\">\n <IconButton aria-label=\"Nahoru\" size=\"xs\" icon={<ArrowUpIcon />} onClick={()=>movePrize(i,-1)} flexShrink={0} />\n <IconButton aria-label=\"Dolů\" size=\"xs\" icon={<ArrowDownIcon />} onClick={()=>movePrize(i,1)} flexShrink={0} />\n {p.image_url ? (\n <Image src={getImageUrl(p.image_url) || p.image_url} alt={p.name} boxSize=\"36px\" objectFit=\"cover\" borderRadius=\"md\" flexShrink={0} />\n ) : null}\n <VStack align=\"start\" spacing={0} flex={1} minW=\"250px\">\n <Text fontWeight=\"600\">{p.name}</Text>\n {p.description && <Text fontSize=\"xs\" color=\"gray.600\" noOfLines={1}>{p.description}</Text>}\n </VStack>\n <Text flexShrink={0}>×{p.quantity}</Text>\n {p.kind && (\n <Text fontSize=\"xs\" px={2} py={0.5} borderRadius=\"md\" borderWidth=\"1px\" color=\"gray.600\" flexShrink={0}>\n {p.kind === 'physical' ? 'fyzická' : p.kind === 'points' ? `body ${p.points||0}` : p.kind === 'xp' ? `XP ${p.xp||0}` : `body ${p.points||0} + XP ${p.xp||0}`}\n </Text>\n )}\n <IconButton aria-label=\"Upravit\" size=\"xs\" icon={<EditIcon />} onClick={()=>startEditPrize(p)} flexShrink={0} />\n <IconButton aria-label=\"Smazat\" size=\"xs\" colorScheme=\"red\" icon={<DeleteIcon />} onClick={()=>delPrize(p)} flexShrink={0} />\n </HStack>\n ))}\n </VStack>\n <Divider />\n <Heading size=\"sm\">Přidat výhru</Heading>\n <SimpleGrid columns={{ base: 1, lg: 4 }} spacing={3} alignItems=\"end\">\n <FormControl isRequired>\n <FormLabel>Název</FormLabel>\n <Input value={prizeForm.name} onChange={(e)=>setPrizeForm({ ...prizeForm, name: e.target.value })} />\n </FormControl>\n <FormControl>\n <FormLabel>Počet</FormLabel>\n <NumberInput min={1} keepWithinRange={false} clampValueOnBlur={false} value={String(prizeForm.quantity ?? '')} onChange={(v)=>setPrizeForm({ ...prizeForm, quantity: v })}>\n <NumberInputField />\n </NumberInput>\n </FormControl>\n <FormControl>\n <FormLabel>Obrázek URL</FormLabel>\n <HStack align=\"flex-start\" spacing={2}>\n <Input value={prizeForm.image_url} onChange={(e)=>setPrizeForm({ ...prizeForm, image_url: e.target.value })} />\n <Box flexShrink={0}>\n <UploadPanel\n label=\"Obrázek výhry\"\n description=\"Nahrajte obrázek výhry.\"\n accept=\"image/*\"\n multiple={false}\n maxFiles={1}\n uploadFn={async (file: File): Promise<UploadPanelFile> => {\n const r = await uploadFile(file);\n setPrizeForm(prev => ({ ...prev, image_url: r.url }));\n return {\n url: r.url,\n name: file.name,\n type: file.type || (r as any).type || 'image/*',\n size: file.size || (r as any).size || 0,\n };\n }}\n />\n </Box>\n </HStack>\n </FormControl>\n <FormControl>\n <FormLabel>Typ výhry</FormLabel>\n <Select value={prizeForm.kind || 'physical'} onChange={(e)=>setPrizeForm({ ...prizeForm, kind: e.target.value as any })}>\n <option value=\"physical\">Fyzická výhra</option>\n <option value=\"points\">Body</option>\n <option value=\"xp\">XP</option>\n <option value=\"points_xp\">Body + XP</option>\n </Select>\n </FormControl>\n </SimpleGrid>\n <SimpleGrid columns={{ base: 1, lg: 2 }} spacing={3} alignItems=\"end\">\n {(prizeForm.kind === 'points' || prizeForm.kind === 'points_xp') && (\n <FormControl>\n <FormLabel>Body</FormLabel>\n <NumberInput min={0} value={Number(prizeForm.points)||0} onChange={(v)=>setPrizeForm({ ...prizeForm, points: Number(v)||0 })}>\n <NumberInputField />\n </NumberInput>\n </FormControl>\n )}\n {(prizeForm.kind === 'xp' || prizeForm.kind === 'points_xp') && (\n <FormControl>\n <FormLabel>XP</FormLabel>\n <NumberInput min={0} value={Number(prizeForm.xp)||0} onChange={(v)=>setPrizeForm({ ...prizeForm, xp: Number(v)||0 })}>\n <NumberInputField />\n </NumberInput>\n </FormControl>\n )}\n </SimpleGrid>\n <FormControl>\n <FormLabel>Popis (volitelné)</FormLabel>\n <Input value={prizeForm.description || ''} onChange={(e)=>setPrizeForm({ ...prizeForm, description: e.target.value })} />\n </FormControl>\n <HStack justify=\"flex-end\">\n <Button leftIcon={<AddIcon />} colorScheme=\"blue\" size=\"sm\" onClick={addPrize} isLoading={savingPrize}>Přidat</Button>\n </HStack>\n </VStack>\n </TabPanel>\n </TabPanels>\n </Tabs>\n </ModalBody>\n <ModalFooter>\n <HStack>\n <Button onClick={onClose} variant=\"ghost\">Zavřít</Button>\n <Button colorScheme=\"blue\" onClick={save}>Uložit</Button>\n </HStack>\n </ModalFooter>\n </ModalContent>\n </Modal>\n <Modal isOpen={isPrizeEditOpen} onClose={()=>{ onClosePrizeEdit(); setEditingPrize(null); }} size=\"lg\" isCentered>\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Upravit výhru</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack spacing={3} align=\"stretch\">\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={3}>\n <FormControl isRequired>\n <FormLabel>Název</FormLabel>\n <Input value={prizeEditForm.name} onChange={(e)=>setPrizeEditForm({ ...prizeEditForm, name: e.target.value })} />\n </FormControl>\n <FormControl>\n <FormLabel>Počet</FormLabel>\n <NumberInput min={1} keepWithinRange={false} clampValueOnBlur={false} value={String(prizeEditForm.quantity ?? '')} onChange={(v)=>setPrizeEditForm({ ...prizeEditForm, quantity: v })}>\n <NumberInputField />\n </NumberInput>\n </FormControl>\n </SimpleGrid>\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={3}>\n <FormControl>\n <FormLabel>Obrázek URL</FormLabel>\n <HStack align=\"flex-start\" spacing={2}>\n <Input value={prizeEditForm.image_url || ''} onChange={(e)=>setPrizeEditForm({ ...prizeEditForm, image_url: e.target.value })} />\n <Box flexShrink={0}>\n <UploadPanel\n label=\"Obrázek výhry\"\n description=\"Nahrajte obrázek výhry.\"\n accept=\"image/*\"\n multiple={false}\n maxFiles={1}\n uploadFn={async (file: File): Promise<UploadPanelFile> => {\n const r = await uploadFile(file);\n setPrizeEditForm(prev => ({ ...prev, image_url: r.url }));\n return {\n url: r.url,\n name: file.name,\n type: file.type || (r as any).type || 'image/*',\n size: file.size || (r as any).size || 0,\n };\n }}\n />\n </Box>\n </HStack>\n </FormControl>\n </SimpleGrid>\n <FormControl>\n <FormLabel>Popis (volitelné)</FormLabel>\n <Input value={prizeEditForm.description || ''} onChange={(e)=>setPrizeEditForm({ ...prizeEditForm, description: e.target.value })} />\n </FormControl>\n <SimpleGrid columns={{ base: 1, md: 3 }} spacing={3}>\n <FormControl>\n <FormLabel>Typ výhry</FormLabel>\n <Select value={prizeEditForm.kind || 'physical'} onChange={(e)=>setPrizeEditForm({ ...prizeEditForm, kind: e.target.value as any })}>\n <option value=\"physical\">Fyzická výhra</option>\n <option value=\"points\">Body</option>\n <option value=\"xp\">XP</option>\n <option value=\"points_xp\">Body + XP</option>\n </Select>\n </FormControl>\n {(prizeEditForm.kind === 'points' || prizeEditForm.kind === 'points_xp') && (\n <FormControl>\n <FormLabel>Body</FormLabel>\n <NumberInput min={0} value={Number(prizeEditForm.points)||0} onChange={(v)=>setPrizeEditForm({ ...prizeEditForm, points: Number(v)||0 })}>\n <NumberInputField />\n </NumberInput>\n </FormControl>\n )}\n {(prizeEditForm.kind === 'xp' || prizeEditForm.kind === 'points_xp') && (\n <FormControl>\n <FormLabel>XP</FormLabel>\n <NumberInput min={0} value={Number(prizeEditForm.xp)||0} onChange={(v)=>setPrizeEditForm({ ...prizeEditForm, xp: Number(v)||0 })}>\n <NumberInputField />\n </NumberInput>\n </FormControl>\n )}\n </SimpleGrid>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <HStack>\n <Button onClick={()=>{ onClosePrizeEdit(); setEditingPrize(null); }} variant=\"ghost\">Zrušit</Button>\n <Button colorScheme=\"blue\" onClick={saveEditPrize} isLoading={savingPrize}>Uložit</Button>\n </HStack>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </Container>\n </AdminLayout>\n );\n};\n\nexport default SweepstakesAdminPage;\n","export const FACR_CLUB_ID = process.env.REACT_APP_FACR_CLUB_ID || '';\nexport const FACR_CLUB_TYPE: 'football' | 'futsal' = (process.env.REACT_APP_FACR_CLUB_TYPE as any) || 'football';\n\nexport const isFacrConfigured = (): boolean => !!FACR_CLUB_ID;\n","import React, { useState, useRef, useEffect } from 'react';\nimport { Box, IconButton, Flex, Heading, Link as ChakraLink } from '@chakra-ui/react';\nimport { FiChevronLeft, FiChevronRight, FiArrowRight } from 'react-icons/fi';\nimport '../../styles/sparta-styles.css';\n\ninterface Article {\n id: string;\n title: string;\n slug: string;\n image: string;\n categories: string[];\n date: string;\n duration?: string;\n isVideo?: boolean;\n unlimited?: boolean;\n}\n\ninterface SpartaHorizontalSliderProps {\n title: string;\n titleLink?: string;\n articles: Article[];\n itemsPerView?: {\n mobile: number;\n tablet: number;\n desktop: number;\n };\n gap?: number;\n showControls?: boolean;\n enableDrag?: boolean;\n showUnlimitedBadge?: boolean;\n showCategories?: boolean;\n showDuration?: boolean;\n}\n\nconst SpartaHorizontalSlider: React.FC<SpartaHorizontalSliderProps> = ({\n title,\n titleLink = '#',\n articles,\n itemsPerView = { mobile: 1, tablet: 2, desktop: 3 },\n gap = 16,\n showControls = true,\n enableDrag = true,\n showUnlimitedBadge = true,\n showCategories = true,\n showDuration = true,\n}) => {\n const [currentIndex, setCurrentIndex] = useState(0);\n const [isDragging, setIsDragging] = useState(false);\n const [startX, setStartX] = useState(0);\n const [scrollLeft, setScrollLeft] = useState(0);\n const trackRef = useRef<HTMLDivElement>(null);\n\n // Calculate how many items are visible based on viewport\n const getItemsPerView = () => {\n if (typeof window === 'undefined') return itemsPerView.desktop;\n \n const width = window.innerWidth;\n if (width < 768) return itemsPerView.mobile;\n if (width < 1024) return itemsPerView.tablet;\n return itemsPerView.desktop;\n };\n\n const [visibleItems, setVisibleItems] = useState(getItemsPerView());\n\n useEffect(() => {\n const handleResize = () => {\n setVisibleItems(getItemsPerView());\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n const maxIndex = Math.max(0, articles.length - visibleItems);\n const canGoNext = currentIndex < maxIndex;\n const canGoPrev = currentIndex > 0;\n\n const handleNext = () => {\n if (canGoNext) {\n setCurrentIndex(prev => Math.min(prev + 1, maxIndex));\n }\n };\n\n const handlePrev = () => {\n if (canGoPrev) {\n setCurrentIndex(prev => Math.max(prev - 1, 0));\n }\n };\n\n // Drag functionality\n const handleMouseDown = (e: React.MouseEvent) => {\n if (!enableDrag || !trackRef.current) return;\n setIsDragging(true);\n setStartX(e.pageX - trackRef.current.offsetLeft);\n setScrollLeft(trackRef.current.scrollLeft);\n };\n\n const handleMouseUp = () => {\n setIsDragging(false);\n };\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (!isDragging || !trackRef.current) return;\n e.preventDefault();\n const x = e.pageX - trackRef.current.offsetLeft;\n const walk = (x - startX) * 2;\n trackRef.current.scrollLeft = scrollLeft - walk;\n };\n\n // Calculate transform based on current index\n const slideWidth = trackRef.current?.children[0]?.clientWidth || 0;\n const transformValue = -(currentIndex * (slideWidth + gap));\n\n return (\n <Box className=\"sparta-slider-container sparta-container sparta-section\">\n {/* Header with title and controls */}\n <Flex className=\"sparta-slider-header\" justifyContent=\"space-between\" alignItems=\"center\" mb={4}>\n <Heading className=\"sparta-slider-title\" as=\"h2\">\n <ChakraLink href={titleLink} display=\"inline-flex\" alignItems=\"center\" gap={2}>\n {title}\n <Box as={FiArrowRight} />\n </ChakraLink>\n </Heading>\n\n {showControls && (\n <Flex className=\"sparta-slider-controls\" gap={2}>\n <IconButton\n aria-label=\"Previous\"\n icon={<FiChevronLeft />}\n onClick={handlePrev}\n isDisabled={!canGoPrev}\n className=\"sparta-slider-button\"\n variant=\"ghost\"\n />\n <IconButton\n aria-label=\"Next\"\n icon={<FiChevronRight />}\n onClick={handleNext}\n isDisabled={!canGoNext}\n className=\"sparta-slider-button\"\n variant=\"ghost\"\n />\n </Flex>\n )}\n </Flex>\n\n {/* Slider viewport */}\n <Box className=\"sparta-slider-viewport\" overflow=\"hidden\">\n <Flex\n ref={trackRef}\n className=\"sparta-slider-track\"\n gap={`${gap}px`}\n transition=\"transform 0.3s cubic-bezier(0.4, 0, 0.6, 1)\"\n transform={`translate3d(${transformValue}px, 0, 0)`}\n cursor={enableDrag ? (isDragging ? 'grabbing' : 'grab') : 'default'}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseUp}\n >\n {articles.map((article) => (\n <Box\n key={article.id}\n className=\"sparta-slider-slide\"\n flexShrink={0}\n data-dragging={isDragging}\n >\n <ChakraLink\n href={`/articles/${article.slug}`}\n className=\"sparta-article-card\"\n textDecoration=\"none\"\n _hover={{ textDecoration: 'none' }}\n >\n {/* Article Image */}\n <Box className=\"sparta-article-image\" position=\"relative\">\n <img\n src={article.image}\n alt={article.title}\n loading=\"lazy\"\n draggable={false}\n />\n\n {/* Meta info overlay */}\n {(showUnlimitedBadge && article.unlimited) && (\n <Box className=\"sparta-article-meta\">\n <Box className=\"sparta-article-badge\">\n UNLIMITED\n </Box>\n </Box>\n )}\n\n {/* Video duration */}\n {showDuration && article.duration && (\n <Box\n position=\"absolute\"\n bottom=\"8px\"\n right=\"8px\"\n padding=\"4px 8px\"\n background=\"rgba(0, 0, 0, 0.8)\"\n borderRadius=\"4px\"\n fontSize=\"0.75rem\"\n fontWeight=\"500\"\n >\n {article.duration}\n </Box>\n )}\n </Box>\n\n {/* Article Details */}\n <Box className=\"sparta-article-details\">\n {showCategories && article.categories.length > 0 && (\n <Flex className=\"sparta-article-categories\">\n {article.categories.map((cat, idx) => (\n <React.Fragment key={idx}>\n <span>{cat}</span>\n {idx < article.categories.length - 1 && (\n <Box className=\"sparta-hero-separator\" />\n )}\n </React.Fragment>\n ))}\n </Flex>\n )}\n\n <Heading className=\"sparta-article-title\" as=\"h3\" size=\"sm\">\n {article.title}\n </Heading>\n\n <Box className=\"sparta-article-date\" mt=\"auto\">\n {new Date(article.date).toLocaleDateString('cs-CZ', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n })}\n </Box>\n </Box>\n </ChakraLink>\n </Box>\n ))}\n </Flex>\n </Box>\n </Box>\n );\n};\n\nexport default SpartaHorizontalSlider;\n\n// Example usage:\n/*\n<SpartaHorizontalSlider\n title=\"Videa\"\n titleLink=\"/sparta-tv\"\n articles={[\n {\n id: '1',\n title: 'HIGHLIGHTS: Sparta - Slavia',\n slug: 'highlights-sparta-slavia',\n image: 'https://example.com/image.jpg',\n categories: ['Match content', 'Highlights'],\n date: '2025-10-05',\n duration: '4:32',\n isVideo: true,\n unlimited: true,\n },\n // ... more articles\n ]}\n itemsPerView={{ mobile: 1, tablet: 2, desktop: 3 }}\n showUnlimitedBadge={true}\n showCategories={true}\n showDuration={true}\n/>\n*/\n","import React from 'react';\nimport PremiumLayout from './PremiumLayout';\nimport { usePublicSettings } from '../../hooks/usePublicSettings';\nimport { getFeaturedArticles, getArticles, Article } from '../../services/articles';\nimport { getSponsors, Sponsor as ApiSponsor } from '../../services/sponsors';\nimport { api as axiosApi } from '../../services/api';\nimport { assetUrl } from '../../utils/url';\nimport { getPlayers, Player as ApiPlayer } from '../../services/players';\nimport { getClothing, ClothingItem } from '../../services/clothing';\nimport { Box, Heading, Text, SimpleGrid } from '@chakra-ui/react';\nimport { facrApi } from '../../services/facr/facrApi';\nimport { FACR_CLUB_ID, FACR_CLUB_TYPE } from '../../config/facr';\nimport NewsList, { NewsListItem } from '../../components/pack/NewsList';\nimport StandingsCard, { StandingRow } from '../../components/pack/StandingsCard';\nimport NextMatch, { NextMatchData } from '../../components/pack/NextMatch';\nimport VideosSection from '../../components/home/VideosSection';\nimport MerchSection from '../../components/home/MerchSection';\nimport SpartaHorizontalSlider from '../../components/elements/SpartaHorizontalSlider';\n\nconst LegacyPremiumHomePage: React.FC = () => {\n const { data: settings } = usePublicSettings();\n const clubName = settings?.club_name || 'Fotbal Club';\n const igUrl = React.useMemo(() => {\n const u = (settings?.instagram_url || '').trim();\n if (!u) return '';\n const rx = /^https?:\\/\\/(?:www\\.)?instagram\\.com\\/(?:p|reel|tv)\\/[^\\/?#]+/i;\n return rx.test(u) ? u : '';\n }, [settings?.instagram_url]);\n\n // Build zoom slider images from featured/news\n const [heroImages, setHeroImages] = React.useState<string[]>([]);\n const [sponsors, setSponsors] = React.useState<ApiSponsor[]>([]);\n const [merch, setMerch] = React.useState<ClothingItem[]>([]);\n\n React.useEffect(() => {\n let active = true;\n (async () => {\n try {\n const [featured, latest] = await Promise.all([\n getFeaturedArticles({ page_size: 3 }).catch(() => ({ data: [] as Article[] })),\n getArticles({ page: 1, page_size: 8, published: true }).catch(() => ({ data: [] as Article[] })),\n ]);\n const imgs = ([] as (string | undefined)[])\n .concat((featured?.data || []).map(a => a.image_url))\n .concat((latest?.data || []).map(a => a.image_url))\n .slice(0, 5)\n .map(u => assetUrl(u))\n .filter((u): u is string => typeof u === 'string');\n if (active) setHeroImages(imgs as string[]);\n } catch {}\n try {\n const s = await getSponsors();\n if (active) setSponsors(s || []);\n } catch {}\n try {\n const m = await getClothing();\n if (active) setMerch(m || []);\n } catch {}\n })();\n return () => { active = false; };\n }, []);\n\n // Trigger social embed parsing after mount and when social URLs change (SPA)\n React.useEffect(() => {\n const w: any = window as any;\n try { if (w.FB && w.FB.XFBML && typeof w.FB.XFBML.parse === 'function') w.FB.XFBML.parse(); } catch {}\n try { if (w.instgrm && w.instgrm.Embeds && typeof w.instgrm.Embeds.process === 'function') w.instgrm.Embeds.process(); } catch {}\n }, [settings?.facebook_url, settings?.instagram_url]);\n\n // Initialize zoom slider and theme widgets if present\n React.useEffect(() => {\n const timer = setTimeout(() => {\n try {\n const w: any = window as any;\n if (w && w.jQuery && typeof w.jQuery === 'function') {\n const $ = w.jQuery;\n if ($ && typeof ($ as any).fn?.zoomslider === 'function') {\n $('.lte-slider-zoom').each((_i: any, el: any) => {\n try { ($ as any)(el).zoomslider(); } catch {}\n });\n }\n }\n if (typeof (w as any).initSwiperWrappers === 'function') {\n (w as any).initSwiperWrappers();\n }\n } catch {}\n }, 50);\n return () => clearTimeout(timer);\n }, [heroImages]);\n\n // Re-init swiper when merch arrives\n React.useEffect(() => {\n if (!merch.length) return;\n const w: any = window as any;\n try { if (typeof w.initSwiperWrappers === 'function') w.initSwiperWrappers(); } catch {}\n }, [merch]);\n\n // Populate dynamic sections similar to pro/js/* in TS\n React.useEffect(() => {\n let cancelled = false;\n\n function h(tag: string, attrs: Record<string, any> = {}, children: (HTMLElement | string)[] = []) {\n const el = document.createElement(tag);\n Object.entries(attrs).forEach(([k, v]) => {\n if (k === 'class') el.className = v;\n else if (k === 'html') el.innerHTML = v;\n else el.setAttribute(k, String(v));\n });\n children.forEach(c => {\n if (typeof c === 'string') el.appendChild(document.createTextNode(c));\n else el.appendChild(c);\n });\n return el;\n }\n\n // Helpers\n const fetchJSON = async (url: string) => {\n try {\n const res = await fetch(url, { cache: 'no-store' });\n if (!res.ok) return null;\n return await res.json();\n } catch { return null; }\n };\n\n // Blog latest (primary 4)\n async function renderLatestBlog() {\n const mount = document.getElementById('latest-blog-items');\n if (!mount) return;\n mount.innerHTML = '<div style=\"width:100%;text-align:center;padding:12px;color:#888;\">Načítání…</div>';\n try {\n const resp = await getArticles({ page: 1, page_size: 12, published: true });\n if (cancelled) return;\n const items = (resp?.data || []).slice(0, 4);\n const frag = document.createDocumentFragment();\n items.forEach((a) => {\n const col = h('div', { class: 'item div-thumbnail col-xl-6 col-lg-6 col-md-6 col-sm-6 col-ms-6 col-xs-12' });\n const art = h('article', { class: 'post type-post has-post-thumbnail hentry' });\n const url = a.slug ? `/news/${a.slug}` : `/articles/${a.id}`;\n const aPhoto = h('a', { href: url, class: 'lte-photo' });\n const img = h('img', { src: assetUrl(a.image_url) || '/images/news/placeholder.jpg', width: '500', height: '300', decoding: 'async', class: 'attachment-atleticos-blog size-atleticos-blog wp-post-image', alt: '' });\n aPhoto.appendChild(img);\n aPhoto.appendChild(h('span', { class: 'lte-photo-overlay' }));\n const descr = h('div', { class: 'lte-description' });\n const aHeader = h('a', { href: url, class: 'lte-header' });\n aHeader.appendChild(h('h3', { html: a.title }));\n descr.appendChild(aHeader);\n art.appendChild(aPhoto); art.appendChild(descr); col.appendChild(art);\n frag.appendChild(col);\n });\n mount.innerHTML = '';\n mount.appendChild(frag);\n // Re-init Masonry for the home grid\n try {\n const w: any = window as any;\n const $: any = (w && (w.jQuery || w.$)) || null;\n if ($ && typeof $.fn.imagesLoaded === 'function') {\n $(mount).imagesLoaded(() => { try { if (typeof w.initMasonry === 'function') w.initMasonry(); } catch {} });\n } else {\n try { if (typeof w.initMasonry === 'function') w.initMasonry(); } catch {}\n }\n } catch {}\n } catch {\n mount.innerHTML = '<div style=\"width:100%;text-align:center;padding:12px;color:#c00;\">Nepodařilo se načíst novinky.</div>';\n }\n }\n\n // Videos latest using backend YouTube cache\n async function renderLatestVideos() {\n const featureMount = document.getElementById('latest-video-feature');\n const gridMount = document.getElementById('latest-videos-grid');\n if (!featureMount && !gridMount) return;\n if (featureMount) featureMount.innerHTML = '<div style=\"width:100%;text-align:center;padding:12px;color:#888;\">Načítání…</div>';\n try {\n const res = await axiosApi.get('/youtube/videos');\n if (cancelled) return;\n const items = (res?.data?.videos || []) as Array<{ video_id: string; title: string; thumbnail_url: string; published_text?: string; }>\n if (featureMount) featureMount.innerHTML = '';\n if (!items.length) return;\n const first = items[0];\n if (featureMount && first) {\n const container = h('div', { class: 'items col-xl-12 col-lg-12 col-md-12 col-sm-12 col-ms-12 col-xs-12' });\n const article = h('article', { class: 'post format-video has-post-thumbnail hentry' });\n const wrap = h('div', { class: 'lte-wrapper' });\n const aEl = h('a', { href: `https://www.youtube.com/watch?v=${first.video_id}`, target: '_blank', class: 'lte-photo lte-video-popup swipebox' });\n aEl.appendChild(h('img', { loading: 'lazy', decoding: 'async', width: '1600', height: '969', src: first.thumbnail_url, class: 'attachment-full size-full wp-post-image', alt: '' }));\n const iconWrap = h('span', { class: 'lte-icon-video' });\n iconWrap.appendChild(h('span', { html: '' }));\n aEl.appendChild(iconWrap);\n wrap.appendChild(aEl);\n const descr = h('div', { class: 'lte-description' });\n const headerA = h('a', { href: `https://www.youtube.com/watch?v=${first.video_id}`, class: 'lte-header', target: '_blank' });\n headerA.appendChild(h('h3', { html: first.title || '' }));\n descr.appendChild(headerA);\n descr.appendChild(h('div', { class: 'lte-excerpt' }));\n article.appendChild(wrap); article.appendChild(descr); container.appendChild(article);\n featureMount.appendChild(container);\n }\n if (gridMount) {\n const frag = document.createDocumentFragment();\n items.slice(1, 5).forEach(v => {\n const col = h('div', { class: 'items col-xl-6 col-lg-6 col-md-6 col-sm-6 col-ms-12 col-xs-12' });\n const article = h('article', { class: 'post format-video has-post-thumbnail hentry' });\n const wrap = h('div', { class: 'lte-wrapper' });\n const aEl = h('a', { href: `https://www.youtube.com/watch?v=${v.video_id}`, target: '_blank', class: 'lte-photo lte-video-popup swipebox' });\n aEl.appendChild(h('img', { loading: 'lazy', decoding: 'async', width: '1600', height: '969', src: v.thumbnail_url, class: 'attachment-full size-full wp-post-image', alt: '' }));\n const iconWrap = h('span', { class: 'lte-icon-video' });\n iconWrap.appendChild(h('span', { html: '' }));\n aEl.appendChild(iconWrap);\n wrap.appendChild(aEl);\n const descr = h('div', { class: 'lte-description' });\n const headerA = h('a', { href: `https://www.youtube.com/watch?v=${v.video_id}`, class: 'lte-header', target: '_blank' });\n headerA.appendChild(h('h3', { html: v.title || '' }));\n descr.appendChild(headerA);\n descr.appendChild(h('div', { class: 'lte-excerpt' }));\n article.appendChild(wrap); article.appendChild(descr); col.appendChild(article);\n frag.appendChild(col);\n });\n gridMount.appendChild(frag);\n }\n } catch {}\n }\n\n // FACR: upcoming + table from prefetch cache\n async function renderFACR() {\n const root = document.getElementById('facr-upcoming');\n const tbody = document.getElementById('facr-table-body');\n const tabs = document.getElementById('facr-comp-tabs');\n if (!root && !tbody) return;\n const clubInfo = await fetchJSON('/cache/prefetch/facr_club_info.json');\n const tables = await fetchJSON('/cache/prefetch/facr_tables.json');\n if (!clubInfo && !tables) return;\n\n // Upcoming\n try {\n const comps: any[] = Array.isArray(clubInfo?.competitions) ? clubInfo.competitions : [];\n const parseCZ = (s: string) => {\n try { const [d, t] = String(s||'').split(' '); const [day, month, year] = d.split('.').map(Number); const [hh, mm] = (t||'').split(':').map(Number); return new Date(year, (month||1)-1, day||1, hh||0, mm||0); } catch { return null; }\n };\n const candidates: Array<{ comp: any; match: any; dt: Date }>[] = comps.map((c: any) => (c.matches||[]).map((m:any)=>({ comp:c, match:m, dt: parseCZ(m.date_time) as Date})).filter((x: { dt: Date }) => x.dt instanceof Date));\n const now = Date.now();\n const threeD = 3*24*60*60*1000;\n const flat = candidates.map(list=> list.sort((a,b)=>a.dt.getTime()-b.dt.getTime()));\n const picks: Array<{ comp:any; match:any; dt:Date }> = [];\n flat.forEach(list => {\n if (!list.length) return;\n let pick = list.filter((x: { dt: Date }) => x.dt.getTime() <= now && now - x.dt.getTime() <= threeD).slice(-1)[0];\n if (!pick) pick = list.find((x: { dt: Date }) => x.dt.getTime() >= now) || list[list.length-1];\n if (pick) picks.push(pick);\n });\n picks.sort((a,b)=> a.dt.getTime()-b.dt.getTime());\n const sel = picks[0];\n if (root && sel) {\n const m = sel.match, c = sel.comp;\n const homeLogo = m.home_logo_url || '/dist/img/logo-club-empty.svg';\n const awayLogo = m.away_logo_url || '/dist/img/logo-club-empty.svg';\n const dateOnly = (()=>{ const d=sel.dt; return `${d.getDate()}. ${d.getMonth()+1}. ${d.getFullYear()}`; })();\n const timeToken = (String(m.date_time||'').split(' ')[1]||'').slice(0,5);\n const score = String(m.score||'');\n const s1 = score.includes(':') ? score.split(':')[0] : '';\n const s2 = score.includes(':') ? score.split(':')[1] : '';\n const midText = (sel.dt.getTime()>now) ? 'Začátek' : (score||'-');\n root.innerHTML = `\n <div class=\"lte-football-upcoming\">\n <div class=\"facr-comp-title lte-football-date\" style=\"text-align:center; margin-bottom:6px;\">${c.name || c.code || 'Soutěž'}</div>\n <div class=\"lte-teams\">\n <span class=\"lte-team-name lte-team-1 lte-header\" title=\"${m.home}\">\n <span class=\"lte-team-logo\"><img decoding=\"async\" src=\"${homeLogo}\"></span>${m.home}\n ${s1 ? `<span class=\"lte-team-count-mob\">${s1}</span>`: ''}\n </span>\n <span class=\"lte-team-count\">\n <span id=\"facr-mid\" style=\"font-size:32px; font-weight:700; display:inline-block; min-width:120px; text-align:center;\">${midText}</span>\n ${s1 && s2 ? `<span class=\"facr-mob-center-score\">${s1}<span>:</span>${s2}</span>` : ''}\n </span>\n <span class=\"lte-team-name lte-team-2 lte-header\" title=\"${m.away}\">\n ${s2 ? `<span class=\\\"lte-team-count-mob\\\">${s2}</span>`: ''}${m.away}<span class=\"lte-team-logo\"><img decoding=\"async\" src=\"${awayLogo}\"></span>\n </span>\n </div>\n <span class=\"lte-football-date\" style=\"text-align:center;\">${dateOnly}${m.venue?`, ${m.venue}`:''}</span>\n ${timeToken ? `<span class=\"lte-football-time\" style=\"display:block; text-align:center;\">${timeToken}</span>`:''}\n </div>`;\n }\n } catch {}\n\n // Table\n try {\n const compsTbl: any[] = Array.isArray(tables?.competitions) ? tables.competitions : [];\n if (tabs) {\n tabs.innerHTML = compsTbl.map((c: any, i: number) => `<button class=\"facr-tab ${i===0?'active':''}\" data-idx=\"${i}\">${c.name || c.code || 'Soutěž'}</button>`).join('');\n tabs.querySelectorAll('button').forEach((btn) => {\n btn.addEventListener('click', () => {\n tabs.querySelectorAll('button').forEach(b=> b.classList.remove('active'));\n btn.classList.add('active');\n const idx = Number((btn as HTMLButtonElement).dataset.idx||'0');\n const comp = compsTbl[Math.max(0, Math.min(idx, compsTbl.length-1))];\n const rows = comp?.table?.overall || [];\n if (tbody) {\n tbody.innerHTML = rows.map((r:any)=> `\n <tr>\n <td class=\"lte-row\"><span>${r.rank||''}</span></td>\n <td class=\"lte-club-logo\"><img decoding=\"async\" src=\"${r.team_logo_url || '/dist/img/logo-club-empty.svg'}\"></td>\n <td class=\"lte-name\">${r.team||''}</td>\n <td class=\"lte-rate\">${r.played||''}</td>\n <td class=\"lte-rate\">${r.wins||''}</td>\n <td class=\"lte-rate\">${r.draws||''}</td>\n <td class=\"lte-rate\">${r.losses||''}</td>\n <td class=\"lte-rate\">${r.score||''}</td>\n <td class=\"lte-summary\">${r.points||''}</td>\n </tr>`).join('');\n }\n });\n });\n }\n // initialize first\n const firstBtn = tabs?.querySelector('button') as HTMLButtonElement | null;\n if (firstBtn) firstBtn.click();\n } catch {}\n }\n\n // Team slider using Players API\n async function renderTeamSlider() {\n const wrapperEl = document.getElementById('team-swiper-wrapper-1') as HTMLElement | null;\n if (!wrapperEl) return;\n try {\n const list = await getPlayers();\n // Load teams to infer gender buckets from team names\n let rawTeams: any[] = [];\n try {\n const tRes = await axiosApi.get('/teams');\n rawTeams = Array.isArray(tRes.data) ? tRes.data : (Array.isArray((tRes.data as any)?.data) ? (tRes.data as any).data : []);\n } catch {}\n const genderByTeamId: Record<number, 'men' | 'women'> = {};\n rawTeams.forEach((t: any) => {\n const id = (t && (t.id ?? t.ID)) as number | undefined;\n const nm = String(t?.name ?? t?.Name ?? '').toLowerCase();\n if (!id) return;\n // Normalize accents for Czech keywords\n const norm = nm.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n const isWomen = /(zeny|zena|zene|zen|women|girl)/i.test(norm);\n genderByTeamId[id] = isWomen ? 'women' : 'men';\n });\n\n let current: 'men' | 'women' = 'men';\n const switcher = document.getElementById('gender-switcher');\n\n function buildSlidesForGender(g: 'men'|'women') {\n const filtered = (list || []).filter((p: any) => {\n const pg = String(p?.gender ?? p?.Gender ?? '').toLowerCase();\n if (pg === 'men' || pg === 'women') return pg === g;\n const tid = p?.team_id ?? p?.TeamID;\n const gval = (typeof tid === 'number' && genderByTeamId[tid]) ? genderByTeamId[tid] : 'men';\n return gval === g;\n });\n const finalList: ApiPlayer[] = (filtered.length ? filtered : (list || [])).slice(0, 12);\n const html = finalList.map((p: ApiPlayer) => {\n const img = assetUrl(p.image_url) || '/dist/img/logo-club-empty.svg';\n const num = (p as any).jersey_number || '';\n const name = [p.first_name, p.last_name].filter(Boolean).join(' ');\n const role = (p as any).position || '';\n return `\n <div class=\"lte-item swiper-slide\">\n <div class=\"lte-team-item\">\n <a class=\"lte-image\" style=\"background-image: url()\">\n <img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"1200\" src=\"${img}\" class=\"attachment-full size-full\" />\n </a>\n <div class=\"lte-descr\">\n <div class=\"lte-num\">${num||''}</div>\n <a href=\"${img}\" target=\"_blank\"><h4 class=\"lte-header\">${name}</h4></a>\n <p class=\"lte-subheader\"><span>${role}</span></p>\n </div>\n </div>\n </div>`;\n }).join('');\n const wEl = document.getElementById('team-swiper-wrapper-1') as HTMLElement | null;\n if (!wEl) return;\n wEl.innerHTML = html;\n const w: any = window as any;\n if (typeof (w as any).initSwiperWrappers === 'function') {\n try { (w as any).initSwiperWrappers(); } catch {}\n }\n }\n\n // Bind UI switcher to update active button and slides\n if (switcher && !(switcher as any).__boundTS) {\n switcher.addEventListener('click', (ev: any) => {\n const target = (ev.target as HTMLElement);\n const btn = target && (target.closest ? target.closest('button[data-gender]') : null) as HTMLButtonElement | null;\n if (!btn) return;\n const g = (btn.dataset.gender === 'women') ? 'women' : 'men';\n current = g;\n Array.from(switcher.querySelectorAll('button[data-gender]')).forEach((b) => {\n const bb = b as HTMLButtonElement;\n bb.classList.toggle('active', (bb.dataset.gender === g));\n });\n buildSlidesForGender(current);\n });\n (switcher as any).__boundTS = true;\n }\n\n // Initial render\n buildSlidesForGender(current);\n } catch {}\n }\n\n renderLatestBlog();\n renderLatestVideos();\n renderFACR();\n renderTeamSlider();\n\n return () => { cancelled = true; };\n }, []);\n\n // Sponsors grid render (simple)\n const sponsorsGrid = (\n <div id=\"sponzori\" className=\"elementor-element elementor-element-031d23b e-flex e-con-boxed e-con e-parent\" data-core-v316-plus=\"true\">\n <div className=\"e-con-inner\">\n <div className=\"elementor-element elementor-widget elementor-widget-lte-partners\">\n <div className=\"elementor-widget-container\">\n <div className=\"container-fluid lte-partners-sc has-lte-divider lte-hover-effect-opacity\">\n <div className=\"row centered\">\n {(sponsors || []).slice(0, 24).map((s) => (\n <div key={s.id} className=\"col-xl-3 col-lg-3 col-md-6 col-sm-6 col-ms-6 col-xs-12 partners-wrap center-flex\">\n <div className=\"partners-item item center-flex\">\n <a href={s.website_url || '#'} target=\"_blank\" rel=\"noreferrer\">\n {/* eslint-disable-next-line jsx-a11y/alt-text */}\n <img src={assetUrl(s.logo_url) || '/images/sponsors/placeholder.png'} className=\"image\" />\n </a>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n\n const zsAttr = heroImages.length ? JSON.stringify(heroImages) : JSON.stringify(['/dist/img/logo-club-empty.svg']);\n\n return (\n <PremiumLayout>\n <div className=\"lte-text-page margin-disabled\">\n {/* Zoom slider */}\n <section className=\"elementor-section elementor-top-section elementor-section-full_width\">\n <div className=\"elementor-container elementor-column-gap-no\">\n <div className=\"elementor-column elementor-col-100 elementor-top-column\">\n <div className=\"elementor-widget-wrap elementor-element-populated\">\n <div className=\"elementor-widget elementor-widget-lte-zoomslider\">\n <div className=\"elementor-widget-container\">\n <div\n className=\"lte-slider-zoom zoom-default zoom-origin-center-center lte-zs-overlay-black bullets-bottom\"\n data-zs-overlay=\"black\"\n data-zs-initzoom=\"1.2\"\n data-zs-speed=\"20000\"\n data-zs-interval=\"4500\"\n data-zs-switchSpeed=\"7000\"\n data-zs-arrows=\"false\"\n data-zs-bullets=\"bottom\"\n data-zs-src={zsAttr}\n >\n <div className=\"container lte-zs-slider-wrapper\">\n <div className=\"lte-zs-slider-inner visible\">\n <div className=\"lte-heading lte-size-lg lte-style-subheader-italic lte-uppercase lte-color-white\">\n <div className=\"lte-heading-content\">\n <h2 className=\"lte-header\">{clubName} <span> {new Date().getFullYear()}/{(new Date().getFullYear()+1).toString().slice(2)} </span></h2>\n </div>\n </div>\n <div className=\"lte-btn-wrap\" style={{ marginTop: 12 }}>\n <a href=\"/blog\" className=\"lte-btn btn-lg color-hover-white\"><span className=\"lte-btn-inner\"><span className=\"lte-btn-before\"></span>Zjistit více</span></a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n {/* Upcoming matches + table wrappers (content is rendered by TS above matching facr-frontend behavior) */}\n <div className=\"elementor-element lte-background-black e-flex e-con-boxed e-con e-parent\" data-core-v316-plus=\"true\">\n <div className=\"e-con-inner\">\n <div className=\"elementor-widget elementor-widget-football-upcoming\">\n <div className=\"elementor-widget-container\">\n <div id=\"facr-upcoming\" className=\"lte-football-upcoming\"></div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Blog latest */}\n <div className=\"elementor-element e-flex e-con-boxed e-con e-parent\" data-core-v316-plus=\"true\">\n <div className=\"e-con-inner\">\n <div className=\"elementor-element lte-heading-style-header-subheader elementor-widget elementor-widget-lte-header\">\n <div className=\"elementor-widget-container\">\n <div className=\"lte-heading lte-style-header-subheader lte-uppercase lte-subcolor-main has-subheader heading-tag-h3 heading-subtag-h6\">\n <div className=\"lte-heading-content\">\n <h6 className=\"lte-subheader\">Náš Blog</h6>\n <h3 className=\"lte-header\">Aktuální zprávy z klubu</h3>\n </div>\n </div>\n </div>\n </div>\n <div className=\"elementor-element elementor-widget elementor-widget-lte-blog\">\n <div className=\"elementor-widget-container\">\n <div className=\"blog lte-blog-sc row centered layout-posts\">\n <div id=\"latest-blog-items\" className=\"row masonry\" aria-live=\"polite\"></div>\n </div>\n </div>\n </div>\n <div className=\"elementor-element elementor-widget elementor-widget-lte-button\" style={{ marginTop: 12 }}>\n <div className=\"elementor-widget-container\">\n <div className=\"lte-btn-wrap\">\n <a href=\"/blog\" className=\"lte-btn btn-xs btn-transparent color-hover-default\"><span className=\"lte-btn-inner\"><span className=\"lte-btn-before\"></span>Více novinek</span></a>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Table */}\n <div className=\"elementor-element e-flex e-con-boxed e-con e-parent\" data-core-v316-plus=\"true\">\n <div className=\"e-con-inner\">\n <div className=\"elementor-element lte-heading-style-header-subheader elementor-widget elementor-widget-lte-header\">\n <div className=\"elementor-widget-container\">\n <div className=\"lte-heading lte-style-header-subheader lte-uppercase lte-subcolor-main has-subheader heading-tag-h3 heading-subtag-h6\">\n <div className=\"lte-heading-content\">\n <p className=\"Badge u-mb-8\" id=\"facr-comp-badge\" style={{ marginBottom: 0 }}>Soutěž</p><br />\n <h6 className=\"lte-subheader\"><span> Sezóna </span> {new Date().getFullYear()}-{(new Date().getFullYear()+1).toString().slice(2)}</h6>\n <h3 className=\"lte-header\">Tabulka bodů</h3>\n </div>\n </div>\n </div>\n </div>\n <div id=\"facr-comp-tabs\" className=\"u-mb-8\" style={{ marginBottom: 16, display: 'flex', gap: 8, flexWrap: 'wrap' }}></div>\n <div className=\"elementor-element elementor-widget elementor-widget-football-table\">\n <div className=\"elementor-widget-container\">\n <table className=\"lte-football-table\">\n <thead>\n <tr>\n <th>#</th><th></th><th className=\"lte-name\">Klub</th><th>Z</th><th>V</th><th>R</th><th>P</th><th>Skóre</th><th>B</th>\n </tr>\n </thead>\n <tbody id=\"facr-table-body\"></tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n\n {/* Videos */}\n <div className=\"elementor-element lte-background-gray e-flex e-con-boxed e-con e-parent\" data-core-v316-plus=\"true\">\n <div className=\"e-con-inner\">\n <div className=\"elementor-element lte-heading-align-center elementor-widget elementor-widget-lte-header\">\n <div className=\"elementor-widget-container\">\n <div className=\"lte-heading lte-style-default lte-uppercase lte-subcolor-white has-watermark heading-tag-h3 heading-subtag-h6\">\n <div className=\"lte-heading-content\">\n <span className=\"lte-watermark\">Sestřihy zápasů</span>\n </div>\n </div>\n </div>\n </div>\n <div className=\"elementor-element e-flex e-con-boxed e-con e-child\">\n <div className=\"e-con-inner\">\n <div className=\"elementor-element e-con-full e-flex e-con e-child\">\n <div className=\"elementor-element elementor-widget elementor-widget-lte-blog\">\n <div className=\"elementor-widget-container\">\n <div className=\"blog lte-blog-sc row centered layout-posts-large hideLastOdd lte-grid-bg\">\n <div id=\"latest-video-feature\" className=\"items col-xl-12 col-lg-12 col-md-12 col-sm-12 col-ms-12 col-xs-12\" aria-live=\"polite\"></div>\n </div>\n <div className=\"clearfix\"></div>\n </div>\n </div>\n </div>\n <div className=\"elementor-element e-con-full e-flex e-con e-child\">\n <div className=\"elementor-element elementor-widget elementor-widget-lte-blog\">\n <div className=\"elementor-widget-container\">\n <div className=\"blog lte-blog-sc row centered layout-posts lte-grid-bg\">\n <div id=\"latest-videos-grid\" className=\"row\" aria-live=\"polite\"></div>\n </div>\n <div className=\"clearfix\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Social embeds */}\n <div id=\"social\" className=\"elementor-element e-flex e-con-boxed e-con e-parent\" aria-labelledby=\"social-heading\">\n <div className=\"e-con-inner\">\n <div className=\"elementor-element lte-heading-align-center elementor-widget elementor-widget-lte-header\">\n <div className=\"elementor-widget-container\">\n <div className=\"lte-heading lte-style-default lte-uppercase heading-tag-h3\">\n <div className=\"lte-heading-content\">\n <h3 id=\"social-heading\" className=\"lte-header\">Sledujte nás</h3>\n </div>\n </div>\n </div>\n </div>\n <div className=\"row centered\" style={{ marginTop: 20 }}>\n <div className=\"col-xl-6 col-lg-6 col-md-12 col-sm-12 col-xs-12\">\n <div id=\"fb-root\"></div>\n <div className=\"fb-page\"\n data-href={settings?.facebook_url || 'https://www.facebook.com/'}\n data-height=\"500\"\n data-small-header=\"false\"\n data-adapt-container-width=\"true\"\n data-hide-cover=\"false\"\n data-show-facepile=\"true\"\n data-tabs=\"timeline\"\n data-width=\"600\">\n <blockquote className=\"fb-xfbml-parse-ignore\">\n <a href={settings?.facebook_url || '#'}>{settings?.club_name || 'Klub'}</a>\n </blockquote>\n </div>\n </div>\n <div className=\"col-xl-6 col-lg-6 col-md-12 col-sm-12 col-xs-12\">\n {igUrl ? (\n <blockquote className=\"instagram-media\" data-instgrm-permalink={igUrl} data-instgrm-version=\"14\" style={{ background: '#FFF', border: 0, borderRadius: 3, boxShadow: '0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15)', margin: 1, maxWidth: 658, minWidth: 326, padding: 0, width: '99.375%' }}></blockquote>\n ) : (\n <a href={settings?.instagram_url || 'https://www.instagram.com/'} target=\"_blank\" rel=\"noreferrer\">Instagram</a>\n )}\n </div>\n </div>\n </div>\n </div>\n\n {/* Sponsors grid */}\n {sponsorsGrid}\n \n {/* Team section */}\n <div id=\"tym\" className=\"elementor-element elementor-element-ed06b06 e-con-full e-flex e-con e-parent\" data-core-v316-plus=\"true\">\n <div className=\"elementor-element lte-heading-style-header-subheader lte-heading-align-center lte-watermark-offset-1 elementor-widget elementor-widget-lte-header\">\n <div className=\"elementor-widget-container\">\n <div className=\"lte-heading lte-style-header-subheader lte-uppercase lte-subcolor-main has-subheader has-watermark heading-tag-h3 heading-subtag-h6\">\n <div className=\"lte-heading-content\">\n <h6 className=\"lte-subheader\">náš tým</h6>\n <h3 className=\"lte-header\">prohlédněte si náš tým</h3>\n <span className=\"lte-watermark\">náš tým</span>\n </div>\n </div>\n </div>\n </div>\n <div id=\"gender-switcher\" aria-label=\"Přepínač pohlaví týmu\" style={{ display:'flex', gap:8, justifyContent:'center', margin:'10px 0' }}>\n <button type=\"button\" className=\"switch-btn active\" data-gender=\"men\">Muži</button>\n <button type=\"button\" className=\"switch-btn\" data-gender=\"women\">Ženy</button>\n </div>\n </div>\n <div id=\"team-section-1\" className=\"elementor-element e-con-full lte-background-black e-flex e-con e-parent\" data-core-v316-plus=\"true\">\n <div className=\"elementor-widget elementor-widget-lte-team\">\n <div className=\"elementor-widget-container\">\n <div className=\"team-preloader\" id=\"team-preloader-1\" aria-hidden=\"true\" style={{ display:'none', alignItems:'center', justifyContent:'center', gap:6, color:'#fff', padding:'8px 0' }}>\n <div className=\"spinner\" style={{ width:16, height:16, border:'2px solid rgba(255,255,255,.3)', borderTopColor:'#fff', borderRadius:'50%' }} />\n <div className=\"loading-text\">Načítání…</div>\n </div>\n <div className=\"lte-swiper-slider-wrapper\">\n <div className=\"lte-swiper-slider swiper-container lte-team-list lte-team-layout-default\" data-space-between=\"30\" data-arrows=\"sides-outside\" data-autoplay=\"0\" data-loop=\"\" data-speed=\"1000\" data-effect=\"coverflow\" data-slides-per-group=\"-1\" data-touch-move=\"0.2\" data-breakpoints=\"5;4;4;3;3;1\">\n <div className=\"swiper-wrapper\" id=\"team-swiper-wrapper-1\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Merch section */}\n <div id=\"merch\" className=\"elementor-element elementor-element-merch e-flex e-con-boxed e-con e-parent\" data-core-v316-plus=\"true\">\n <div className=\"e-con-inner\">\n <div className=\"elementor-element lte-heading-style-header-subheader elementor-widget elementor-widget-lte-header\">\n <div className=\"elementor-widget-container\">\n <div className=\"lte-heading lte-style-header-subheader lte-uppercase lte-subcolor-main has-subheader heading-tag-h3 heading-subtag-h6\">\n <div className=\"lte-heading-content\">\n <h6 className=\"lte-subheader\">Fanshop</h6>\n <h3 className=\"lte-header\">Klubové oblečení</h3>\n </div>\n </div>\n </div>\n </div>\n <div className=\"elementor-element elementor-widget elementor-widget-lte-products\">\n <div className=\"elementor-widget-container\">\n <div className=\"lte-swiper-slider-wrapper\">\n <div className=\"lte-swiper-slider swiper-container lte-products lte-team-list\"\n data-space-between=\"30\" data-arrows=\"sides-outside\" data-autoplay=\"0\" data-loop=\"\" data-speed=\"1000\"\n data-effect=\"coverflow\" data-slides-per-group=\"-1\" data-touch-move=\"0.2\" data-breakpoints=\"4;3;3;2;2;1\">\n <div className=\"swiper-wrapper\">\n {(merch || []).slice(0, 12).map((it) => (\n <div key={it.id} className=\"lte-item swiper-slide\">\n <div className=\"lte-team-item\">\n <a className=\"lte-image\" href={it.url || '#'} target=\"_blank\" rel=\"noreferrer\">\n {/* eslint-disable-next-line jsx-a11y/alt-text */}\n <img loading=\"lazy\" decoding=\"async\" width={800} height={800} src={assetUrl(it.image_url) || '/dist/img/logo-club-empty.svg'} className=\"attachment-full size-full\" />\n </a>\n <div className=\"lte-descr\">\n <a href={it.url || '#'} target=\"_blank\" rel=\"noreferrer\"><h4 className=\"lte-header\">{it.title}</h4></a>\n <p className=\"lte-subheader\"><span>{typeof it.price === 'number' ? `${it.price} ${it.currency || 'Kč'}` : ''}</span></p>\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </PremiumLayout>\n );\n};\n\nconst PremiumHomePage: React.FC = () => {\n const { data: settings } = usePublicSettings();\n const clubName = settings?.club_name || 'Fotbal Club';\n const clubId = settings?.club_id || FACR_CLUB_ID;\n const clubType = settings?.club_type || FACR_CLUB_TYPE;\n\n const [heroArticles, setHeroArticles] = React.useState<Article[]>([]);\n const [latestArticles, setLatestArticles] = React.useState<Article[]>([]);\n const [newsItems, setNewsItems] = React.useState<NewsListItem[]>([]);\n const [standingsRows, setStandingsRows] = React.useState<StandingRow[]>([]);\n const [nextMatch, setNextMatch] = React.useState<NextMatchData | null>(null);\n const [nextCompetitionName, setNextCompetitionName] = React.useState<string | undefined>(undefined);\n const [nextMatchCountdown, setNextMatchCountdown] = React.useState<string | undefined>(undefined);\n\n React.useEffect(() => {\n let cancelled = false;\n\n const parseCZDateTime = (s: string): Date | null => {\n try {\n const [d, t] = String(s || '').split(' ');\n const parts = (d || '').split('.').map((n) => Number(n));\n const day = parts[0];\n const month = parts[1];\n const year = parts[2];\n const [hh, mm] = (t || '').split(':').map((n) => Number(n));\n if (!day || !month || !year) return null;\n return new Date(year, (month || 1) - 1, day, hh || 0, mm || 0);\n } catch {\n return null;\n }\n };\n\n const load = async () => {\n // Articles (featured + latest)\n try {\n const [featuredResp, latestResp] = await Promise.all([\n getFeaturedArticles({ page_size: 4 }).catch(() => ({ data: [] as Article[] })),\n getArticles({ page: 1, page_size: 8, published: true }).catch(() => ({ data: [] as Article[] })),\n ]);\n if (cancelled) return;\n const featured = (featuredResp?.data || []) as Article[];\n const latest = (latestResp?.data || []) as Article[];\n setHeroArticles(featured.slice(0, 3));\n setLatestArticles(latest);\n\n const featuredIds = new Set(featured.map((a) => a.id));\n const combinedForList = [...featured, ...latest].filter((a) => !featuredIds.has(a.id));\n const mappedNews: NewsListItem[] = combinedForList.slice(0, 8).map((a) => ({\n id: a.id,\n title: a.title,\n excerpt: (a as any).excerpt || undefined,\n image: a.image_url,\n slug: a.slug,\n }));\n setNewsItems(mappedNews);\n } catch {}\n\n // FACR data for next match + standings\n try {\n if (!clubId) return;\n const [clubInfo, tableInfo] = await Promise.all([\n facrApi.getClub(String(clubId), (clubType as any) || 'football').catch(() => null),\n facrApi.getClubTable(String(clubId), (clubType as any) || 'football').catch(() => null),\n ]);\n if (cancelled) return;\n\n // Next match selection (nearest future; fallback to last played)\n if (clubInfo && Array.isArray((clubInfo as any).competitions)) {\n const comps: any[] = (clubInfo as any).competitions || [];\n const now = Date.now();\n let best: { m: any; compName: string; dt: Date } | null = null;\n comps.forEach((c: any) => {\n const compName = c.name || c.code || 'Soutěž';\n (c.matches || []).forEach((m: any) => {\n const dt = parseCZDateTime(m.date_time);\n if (!dt) return;\n const ts = dt.getTime();\n if (ts < now) return;\n if (!best || ts < best.dt.getTime()) {\n best = { m, compName, dt };\n }\n });\n });\n\n if (!best && comps.length > 0) {\n const c = comps[0];\n const list = (c.matches || []).slice().reverse();\n const m = list[0];\n if (m) {\n const dt = parseCZDateTime(m.date_time) || new Date();\n best = { m, compName: c.name || c.code || 'Soutěž', dt };\n }\n }\n\n if (best && !cancelled) {\n setNextMatch({\n competition: best.compName,\n home: best.m.home,\n home_id: best.m.home_id,\n home_logo_url: best.m.home_logo_url,\n away: best.m.away,\n away_id: best.m.away_id,\n away_logo_url: best.m.away_logo_url,\n });\n setNextCompetitionName(best.compName);\n try {\n const label = `${best.dt.toLocaleDateString('cs-CZ')} ${best.dt.toLocaleTimeString('cs-CZ', {\n hour: '2-digit',\n minute: '2-digit',\n })}`;\n setNextMatchCountdown(label);\n } catch {\n setNextMatchCountdown(undefined);\n }\n }\n }\n\n // Standings pick first competition with rows\n if (tableInfo && Array.isArray((tableInfo as any).competitions)) {\n const compsTbl: any[] = (tableInfo as any).competitions || [];\n const first = compsTbl.find((c: any) => Array.isArray(c.table?.overall) && c.table.overall.length > 0);\n if (first && Array.isArray(first.table?.overall)) {\n setStandingsRows(first.table.overall as StandingRow[]);\n }\n }\n } catch {}\n };\n\n load();\n return () => {\n cancelled = true;\n };\n }, [clubId, clubType]);\n\n const heroPrimary = heroArticles[0];\n\n const spartaSliderArticles = React.useMemo(() => {\n const byId = new Map<number, Article>();\n [...heroArticles, ...latestArticles].forEach((a) => {\n if (!a) return;\n if (!byId.has(a.id)) byId.set(a.id, a);\n });\n return Array.from(byId.values())\n .slice(0, 10)\n .map((a) => ({\n id: String(a.id),\n title: a.title,\n slug: a.slug || String(a.id),\n image: assetUrl(a.image_url) || '/images/news/placeholder.jpg',\n categories: ((a as any).category?.name ? [(a as any).category.name] : []) as string[],\n date: (a as any).published_at || (a as any).created_at || new Date().toISOString(),\n }));\n }, [heroArticles, latestArticles]);\n\n const stripHtml = (html?: string) => {\n if (!html) return '';\n try {\n return html.replace(/<[^>]+>/g, ' ');\n } catch {\n return html;\n }\n };\n\n return (\n <PremiumLayout>\n {/* Sparta hero */}\n <Box className=\"sparta-hero-container sparta-container sparta-section\">\n {heroPrimary && (\n <>\n <Box className=\"sparta-hero-background\">\n <img\n src={assetUrl(heroPrimary.image_url) || '/dist/img/logo-club-empty.svg'}\n alt={heroPrimary.title}\n />\n </Box>\n <Box className=\"sparta-hero-article\">\n <Box className=\"sparta-hero-categories\">\n <span className=\"sparta-hero-category-badge\">{clubName}</span>\n {(heroPrimary as any).category?.name && (\n <>\n <Box className=\"sparta-hero-separator\" />\n <span>{(heroPrimary as any).category.name}</span>\n </>\n )}\n </Box>\n <Heading as=\"h1\" className=\"sparta-hero-title\">\n {heroPrimary.title}\n </Heading>\n {heroPrimary.content && (\n <Text className=\"sparta-hero-description\">\n {(() => {\n const plain = stripHtml(heroPrimary.content);\n return plain.length > 180 ? `${plain.slice(0, 180)}…` : plain;\n })()}\n </Text>\n )}\n <Box mt={4} className=\"sparta-hero-button\">\n <a\n href={heroPrimary.slug ? `/news/${heroPrimary.slug}` : `/articles/${heroPrimary.id}`}\n className=\"sparta-button-primary\"\n >\n Číst článek\n </a>\n </Box>\n </Box>\n </>\n )}\n </Box>\n\n {/* News slider */}\n {spartaSliderArticles.length > 0 && (\n <Box className=\"sparta-container sparta-section\">\n <SpartaHorizontalSlider\n title=\"Aktuality\"\n titleLink=\"/blog\"\n articles={spartaSliderArticles}\n />\n </Box>\n )}\n\n {/* Next match + standings */}\n {(nextMatch || standingsRows.length > 0) && (\n <Box className=\"sparta-container sparta-section\">\n <SimpleGrid columns={{ base: 1, lg: 3 }} spacing={8}>\n {nextMatch && (\n <Box gridColumn={{ base: 'span 1', lg: 'span 2' }}>\n <Heading as=\"h2\" size=\"md\" mb={3} textTransform=\"uppercase\">\n Nejbližší zápas\n </Heading>\n <NextMatch\n data={nextMatch}\n competitionName={nextCompetitionName}\n countdown={nextMatchCountdown}\n />\n </Box>\n )}\n {standingsRows.length > 0 && (\n <Box>\n <Heading as=\"h2\" size=\"md\" mb={3} textTransform=\"uppercase\">\n Tabulka\n </Heading>\n <StandingsCard rows={standingsRows} />\n </Box>\n )}\n </SimpleGrid>\n </Box>\n )}\n\n {/* News list */}\n <Box className=\"sparta-container sparta-section\">\n <Heading as=\"h2\" size=\"md\" mb={3} textTransform=\"uppercase\">\n Novinky\n </Heading>\n <NewsList\n items={newsItems}\n seeAllHref=\"/blog\"\n seeAllLabel=\"Všechny články\"\n />\n </Box>\n\n {/* Videos */}\n <Box className=\"sparta-container sparta-section\">\n <VideosSection variant=\"grid\" />\n </Box>\n\n {/* Merch */}\n <Box className=\"sparta-container sparta-section\">\n <MerchSection variant=\"carousel\" />\n </Box>\n </PremiumLayout>\n );\n};\n\nexport default PremiumHomePage;\n","import React, { useState, useEffect } from 'react';\nimport { Box, Button, FormControl, FormLabel, Heading, HStack, IconButton, Image, Input, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, Spinner, Table, Tbody, Td, Th, Thead, Tr, useColorModeValue, useDisclosure, useToast, VStack, Select, Text, Switch, Badge, Alert, AlertIcon, AlertTitle, AlertDescription, Divider, Grid, GridItem } from '@chakra-ui/react';\nimport { FiPlus, FiEdit2, FiTrash2, FiUpload, FiAlertCircle, FiCheckCircle } from 'react-icons/fi';\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport { Banner as AdminBanner, getBanners, createBanner, updateBanner, deleteBanner } from '../../services/banners';\nimport { uploadFile, getArticles } from '../../services/articles';\nimport { assetUrl } from '../../utils/url';\nimport UploadPanel, { UploadPanelFile } from '../../components/common/UploadPanel';\n\n// Banner placement presets with dimensions and descriptions\ntype BannerPreset = {\n value: string;\n label: string;\n description: string;\n width: number;\n height: number;\n aspectRatio: number;\n position: 'top' | 'middle' | 'footer' | 'article' | 'under_table';\n};\n\nconst BANNER_PRESETS: BannerPreset[] = [\n {\n value: 'homepage_middle',\n label: 'Střední banner (Homepage - střed)',\n description: 'Banner ve středu stránky mezi obsahem',\n width: 970,\n height: 250,\n aspectRatio: 3.88,\n position: 'middle'\n },\n {\n value: 'homepage_footer',\n label: 'Spodní banner (Homepage - zápatí)',\n description: 'Banner v dolní části stránky před zápatím',\n width: 1200,\n height: 200,\n aspectRatio: 6,\n position: 'footer'\n },\n {\n value: 'article_inline',\n label: 'Banner v článcích',\n description: 'Banner zobrazený v textu článků',\n width: 728,\n height: 90,\n aspectRatio: 8.09,\n position: 'article'\n },\n {\n value: 'article_sidebar',\n label: 'Banner v článku (sidebar)',\n description: 'Banner v pravém sloupci detailu článku',\n width: 300,\n height: 250,\n aspectRatio: 1.2,\n position: 'article'\n },\n {\n value: 'homepage_under_table',\n label: 'Pod tabulkou (Homepage)',\n description: 'Banner pod sekcí Tabulky na titulní stránce',\n width: 970,\n height: 90,\n aspectRatio: 10.78,\n position: 'under_table'\n }\n];\n\nconst BannersAdminPage: React.FC = () => {\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const inputBg = useColorModeValue('white', 'gray.700');\n const toast = useToast();\n const qc = useQueryClient();\n const { data, isLoading } = useQuery<AdminBanner[]>(['admin-banners'], () => getBanners());\n const [editing, setEditing] = useState<Partial<AdminBanner> | null>(null);\n const [imageResolution, setImageResolution] = useState<{ width: number; height: number } | null>(null);\n const [recommendedPlacements, setRecommendedPlacements] = useState<BannerPreset[]>([]);\n const [hasArticles, setHasArticles] = useState<boolean>(true);\n const { isOpen, onOpen, onClose } = useDisclosure();\n\n // Get preset by value\n const getPreset = (placement?: string): BannerPreset | undefined => {\n return BANNER_PRESETS.find(p => p.value === placement);\n };\n\n // Recommend placements based on image resolution\n const recommendPlacement = (imgWidth: number, imgHeight: number): BannerPreset[] => {\n const imgAspectRatio = imgWidth / imgHeight;\n \n // Sort presets by how close their aspect ratio is to the image\n const scored = BANNER_PRESETS.map(preset => {\n const ratioDiff = Math.abs(preset.aspectRatio - imgAspectRatio);\n const widthDiff = Math.abs(preset.width - imgWidth) / preset.width;\n const heightDiff = Math.abs(preset.height - imgHeight) / preset.height;\n \n // Lower score is better\n const score = ratioDiff * 2 + widthDiff + heightDiff;\n \n return { preset, score };\n }).sort((a, b) => a.score - b.score);\n \n // Return top 3 recommendations\n return scored.slice(0, 3).map(s => s.preset);\n };\n const openCreate = () => {\n const defaultPreset = BANNER_PRESETS[0];\n setEditing({ \n name: '', \n is_active: true, \n placement: defaultPreset.value, \n width: defaultPreset.width, \n height: defaultPreset.height \n } as any);\n setImageResolution(null);\n setRecommendedPlacements([]);\n onOpen();\n };\n const openEdit = (s: AdminBanner) => { \n setEditing({ ...s }); \n setImageResolution(null);\n setRecommendedPlacements([]);\n onOpen(); \n };\n const closeModal = () => { \n setEditing(null); \n setImageResolution(null);\n setRecommendedPlacements([]);\n onClose(); \n };\n\n // Determine if at least one published article exists to allow \"Banner v článcích\"\n useEffect(() => {\n (async () => {\n try {\n const resp = await getArticles({ page: 1, page_size: 1, published: true });\n setHasArticles(((resp?.total ?? 0) > 0) || ((resp?.data?.length ?? 0) > 0));\n } catch {\n setHasArticles(true); // fail-open so UI is not unnecessarily blocked\n }\n })();\n }, []);\n\n const createMut = useMutation({\n mutationFn: (payload: any) => createBanner(payload),\n onSuccess: () => { toast({ title: 'Banner vytvořen', status: 'success' }); qc.invalidateQueries({ queryKey: ['admin-banners'] }); closeModal(); },\n onError: (e: any) => toast({ title: 'Vytvoření selhalo', description: e?.response?.data?.message || 'Chyba', status: 'error' }),\n });\n const updateMut = useMutation({\n mutationFn: ({ id, payload }: { id: number | string; payload: any }) => updateBanner(id, payload),\n onSuccess: () => { toast({ title: 'Banner upraven', status: 'success' }); qc.invalidateQueries({ queryKey: ['admin-banners'] }); closeModal(); },\n onError: (e: any) => toast({ title: 'Aktualizace selhala', description: e?.response?.data?.message || 'Chyba', status: 'error' }),\n });\n const deleteMut = useMutation({\n mutationFn: (id: number | string) => deleteBanner(id),\n onSuccess: () => { toast({ title: 'Banner smazán', status: 'success' }); qc.invalidateQueries({ queryKey: ['admin-banners'] }); },\n onError: (e: any) => toast({ title: 'Smazání selhalo', description: e?.response?.data?.message || 'Chyba', status: 'error' }),\n });\n\n const onSubmit = async () => {\n if (!editing) return;\n const payload = {\n name: editing.name || '',\n image_url: (editing as any).image_url,\n click_url: (editing as any).click_url,\n is_active: editing.is_active ?? true,\n placement: (editing as any).placement || '',\n width: (editing as any).width || undefined,\n height: (editing as any).height || undefined,\n };\n if ((editing as any).id != null) {\n await updateMut.mutateAsync({ id: (editing as any).id, payload });\n } else {\n await createMut.mutateAsync(payload);\n }\n };\n\n const onUpload = async (file: File): Promise<UploadPanelFile> => {\n // First, detect image resolution\n const img = new window.Image();\n const imageLoadPromise = new Promise<{ width: number; height: number }>((resolve, reject) => {\n img.onload = () => resolve({ width: img.width, height: img.height });\n img.onerror = reject;\n img.src = URL.createObjectURL(file);\n });\n\n try {\n const resolution = await imageLoadPromise;\n setImageResolution(resolution);\n\n // Recommend placements based on resolution\n const recommended = recommendPlacement(resolution.width, resolution.height);\n setRecommendedPlacements(recommended);\n\n // Upload the file\n const res = await uploadFile(file);\n\n // Update editing state with uploaded URL\n setEditing((prev) => ({ ...(prev || {}), image_url: res.url }));\n\n // If no placement selected yet, auto-select the best recommendation\n if (!editing?.placement && recommended.length > 0) {\n const bestMatch = recommended[0];\n setEditing((prev) => ({\n ...(prev || {}),\n placement: bestMatch.value,\n width: bestMatch.width,\n height: bestMatch.height,\n }));\n }\n\n // Clean up object URL\n URL.revokeObjectURL(img.src);\n\n return {\n url: res.url,\n name: file.name,\n type: file.type || (res as any).type || 'image/*',\n size: file.size || (res as any).size || 0,\n };\n } catch (e: any) {\n const message = e?.message || 'Nahrání selhalo';\n throw new Error(message);\n }\n };\n\n const banners = data || [];\n\n return (\n <AdminLayout>\n <Box>\n <HStack justify=\"space-between\" mb={4}>\n <Heading size=\"lg\">Bannery a reklamní plochy</Heading>\n <Button leftIcon={<FiPlus />} colorScheme=\"blue\" onClick={openCreate}>\n Nový banner\n </Button>\n </HStack>\n <Text color=\"gray.500\" mb={6}>\n Správa bannerů a reklamních ploch zobrazovaných na webu. Můžete přidávat, upravovat a odebírat bannery.\n </Text>\n\n <Box \n bg={useColorModeValue('white', 'gray.800')} \n borderWidth=\"1px\" \n borderRadius=\"lg\" \n overflowX=\"auto\"\n boxShadow=\"sm\"\n mb={6}\n >\n <Table size=\"sm\">\n <Thead>\n <Tr>\n <Th w=\"100px\">Náhled</Th>\n <Th>Název</Th>\n <Th>Umístění</Th>\n <Th>Rozměry</Th>\n <Th w=\"100px\">Aktivní</Th>\n <Th w=\"160px\">Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {isLoading && (\n <Tr><Td colSpan={6} textAlign=\"center\"><Spinner size=\"sm\" mr={2} />Načítání…</Td></Tr>\n )}\n {!isLoading && banners.map((b: AdminBanner) => {\n const preset = getPreset((b as any).placement);\n return (\n <Tr key={b.id} opacity={b.is_active ? 1 : 0.6}>\n <Td>\n <Image src={assetUrl((b as any).image_url) || '/sponsor-placeholder.svg'} alt={b.name} boxSize=\"56px\" objectFit=\"contain\" bg={inputBg} borderRadius=\"md\" />\n </Td>\n <Td>\n <Text fontWeight=\"500\">{b.name}</Text>\n {(b as any).click_url && (\n <Text fontSize=\"xs\" color=\"gray.500\" noOfLines={1}>{(b as any).click_url}</Text>\n )}\n </Td>\n <Td>\n {preset ? (\n <VStack align=\"start\" spacing={0}>\n <Text fontSize=\"sm\" fontWeight=\"500\">{preset.label}</Text>\n <Badge colorScheme=\"blue\" fontSize=\"xs\">{preset.position}</Badge>\n </VStack>\n ) : (\n <Text fontSize=\"xs\" color=\"gray.500\">-</Text>\n )}\n </Td>\n <Td>\n {(b as any).width && (b as any).height ? (\n <Text fontSize=\"xs\">{(b as any).width} × {(b as any).height}</Text>\n ) : '-'}\n </Td>\n <Td>\n <Badge colorScheme={b.is_active ? 'green' : 'gray'}>\n {b.is_active ? 'Ano' : 'Ne'}\n </Badge>\n </Td>\n <Td>\n <HStack>\n <IconButton aria-label=\"Upravit\" size=\"sm\" icon={<FiEdit2 />} onClick={() => openEdit(b)} />\n <IconButton aria-label=\"Smazat\" size=\"sm\" colorScheme=\"red\" icon={<FiTrash2 />} onClick={() => { if (b.id != null) deleteMut.mutate(b.id); }} />\n </HStack>\n </Td>\n </Tr>\n );\n })}\n </Tbody>\n </Table>\n </Box>\n <Modal isOpen={isOpen} onClose={closeModal} size=\"lg\">\n <ModalOverlay />\n <ModalContent maxW=\"90vw\" maxH=\"90vh\" overflowY=\"auto\">\n <ModalHeader>{(editing as any)?.id ? 'Upravit banner' : 'Nový banner'}</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack align=\"stretch\" spacing={4}>\n <FormControl isRequired>\n <FormLabel>Název</FormLabel>\n <Input value={editing?.name || ''} onChange={(e) => setEditing((prev) => ({ ...(prev as any), name: e.target.value }))} />\n </FormControl>\n <FormControl>\n <FormLabel>Odkaz (po kliku)</FormLabel>\n <Input type=\"url\" value={(editing as any)?.click_url || ''} onChange={(e) => setEditing((prev) => ({ ...(prev as any), click_url: e.target.value }))} placeholder=\"https://partner.cz\" />\n </FormControl>\n {/* Image resolution info */}\n {imageResolution && (\n <Alert status=\"info\" borderRadius=\"md\">\n <AlertIcon />\n <Box flex=\"1\">\n <AlertTitle fontSize=\"sm\">Rozlišení obrázku: {imageResolution.width} × {imageResolution.height} px</AlertTitle>\n <AlertDescription fontSize=\"xs\">\n Poměr stran: {(imageResolution.width / imageResolution.height).toFixed(2)}:1\n </AlertDescription>\n </Box>\n </Alert>\n )}\n\n {/* Recommended placements */}\n {recommendedPlacements.length > 0 && (\n <Box p={3} bg={useColorModeValue('blue.50', 'blue.900')} borderRadius=\"md\">\n <Text fontSize=\"sm\" fontWeight=\"600\" mb={2} color={useColorModeValue('blue.700', 'blue.200')}>\n <FiCheckCircle style={{ display: 'inline', marginRight: '6px' }} />\n Doporučená umístění na základě rozlišení:\n </Text>\n <VStack align=\"stretch\" spacing={1}>\n {recommendedPlacements.map((preset, idx) => (\n <HStack key={preset.value} justify=\"space-between\" fontSize=\"xs\">\n <Text>\n <Badge colorScheme={idx === 0 ? 'green' : 'blue'} mr={2}>\n {idx === 0 ? 'Nejlepší' : `#${idx + 1}`}\n </Badge>\n {preset.label} ({preset.width}×{preset.height})\n </Text>\n {editing?.placement !== preset.value && (\n <Button \n size=\"xs\" \n variant=\"link\" \n colorScheme=\"blue\"\n onClick={() => {\n setEditing(prev => ({\n ...prev,\n placement: preset.value,\n width: preset.width,\n height: preset.height\n }));\n }}\n >\n Použít\n </Button>\n )}\n </HStack>\n ))}\n </VStack>\n </Box>\n )}\n\n <FormControl isRequired>\n <FormLabel>Umístění na webu</FormLabel>\n <Select \n value={(editing as any)?.placement || ''} \n onChange={(e) => {\n const placement = e.target.value;\n const preset = getPreset(placement);\n setEditing((prev) => ({\n ...(prev as any),\n placement,\n width: preset?.width,\n height: preset?.height\n }));\n }}\n >\n <option value=\"\">— vyberte umístění —</option>\n {BANNER_PRESETS.map(preset => {\n const isArticleInline = preset.value === 'article_inline';\n const disabled = isArticleInline && !hasArticles;\n const label = isArticleInline && !hasArticles\n ? `${preset.label} — nelze použít (na webu zatím není žádný článek)`\n : `${preset.label} (${preset.width}×${preset.height})`;\n return (\n <option\n key={preset.value}\n value={preset.value}\n disabled={disabled}\n title={isArticleInline && !hasArticles ? 'Tuto pozici lze použít až když existuje alespoň 1 publikovaný článek.' : preset.description}\n >\n {label}\n </option>\n );\n })}\n </Select>\n {editing?.placement && (() => {\n const preset = getPreset((editing as any).placement);\n return preset ? (\n <Text fontSize=\"xs\" color=\"gray.500\" mt={1}>\n {preset.description}\n </Text>\n ) : null;\n })()}\n </FormControl>\n\n {/* Placement dimensions display (read-only) */}\n {editing?.placement && (() => {\n const preset = getPreset((editing as any).placement);\n return preset ? (\n <Box p={3} bg={inputBg} borderRadius=\"md\" borderWidth=\"1px\" borderColor={borderColor}>\n <HStack justify=\"space-between\" mb={1}>\n <Text fontSize=\"sm\" fontWeight=\"600\">Rozměry banneru:</Text>\n <Badge colorScheme=\"blue\">{preset.width} × {preset.height} px</Badge>\n </HStack>\n <Text fontSize=\"xs\" color=\"gray.500\">\n Poměr stran: {preset.aspectRatio.toFixed(2)}:1 • Pozice: {preset.position}\n </Text>\n </Box>\n ) : null;\n })()}\n\n <Divider />\n <FormControl>\n <FormLabel>Obrázek banneru</FormLabel>\n <VStack align=\"stretch\" spacing={3}>\n {/* Preview */}\n {(editing as any)?.image_url && (() => {\n const preset = getPreset((editing as any)?.placement);\n const previewWidth = preset ? Math.min(preset.width, 600) : 300;\n const previewHeight = preset ? (previewWidth / preset.aspectRatio) : 150;\n \n return (\n <Box>\n <Text fontSize=\"xs\" color=\"gray.500\" mb={2}>Náhled banneru:</Text>\n <Box \n borderWidth=\"2px\" \n borderColor={borderColor} \n borderRadius=\"md\" \n p={2}\n bg={inputBg}\n >\n <Image \n src={assetUrl((editing as any)?.image_url) || '/sponsor-placeholder.svg'} \n alt=\"banner preview\" \n width={`${previewWidth}px`}\n height={`${previewHeight}px`}\n objectFit=\"contain\"\n mx=\"auto\"\n display=\"block\"\n />\n </Box>\n {preset && (\n <Text fontSize=\"xs\" color=\"gray.500\" mt={1} textAlign=\"center\">\n Zobrazení v pozici: {preset.label}\n </Text>\n )}\n </Box>\n );\n })()}\n <UploadPanel\n label=\"Obrázek banneru\"\n description=\"Nahrajte obrázek banneru. Rozlišení použijeme pro doporučení ideálního umístění.\"\n accept=\"image/*\"\n multiple={false}\n maxFiles={1}\n allowUrlImport={false}\n uploadFn={onUpload}\n />\n {!((editing as any)?.image_url) && (\n <Alert status=\"warning\" fontSize=\"xs\">\n <AlertIcon boxSize=\"12px\" />\n <Text fontSize=\"xs\">Nahrajte obrázek pro automatické doporučení umístění</Text>\n </Alert>\n )}\n </VStack>\n </FormControl>\n <FormControl display=\"flex\" alignItems=\"center\">\n <FormLabel mb=\"0\">Aktivní</FormLabel>\n <Switch isChecked={!!editing?.is_active} onChange={(e) => setEditing((prev) => ({ ...(prev as any), is_active: e.target.checked }))} />\n </FormControl>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" mr={3} onClick={closeModal}>Zrušit</Button>\n <Button colorScheme=\"blue\" onClick={onSubmit} isLoading={createMut.isLoading || updateMut.isLoading}>Uložit</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </Box>\n </AdminLayout>\n );\n};\n\nexport default BannersAdminPage;","import { useState, useEffect } from 'react';\nimport { useNavigate, useLocation, Navigate } from 'react-router-dom';\nimport { \n Box, \n Button, \n FormControl, \n FormLabel, \n Input, \n InputGroup,\n InputRightElement,\n VStack, \n Heading, \n useToast, \n useColorModeValue,\n Image,\n Center,\n Checkbox,\n} from '@chakra-ui/react';\nimport { useAuth } from '../contexts/AuthContext';\nimport api from '../services/api';\nimport { useTranslation } from 'react-i18next';\nimport { getPublicSettings, PublicSettings } from '../services/settings';\nimport { assetUrl } from '../utils/url';\nimport { PasswordHelpTooltip } from '../components/common/HelpTooltipCard';\n\ninterface LocationState {\n from: {\n pathname: string;\n };\n}\n\nconst AuthPage: React.FC = () => {\n // All hooks must be called at the top level, before any conditional returns\n const { t } = useTranslation();\n const { isAuthenticated, adminExists, login } = useAuth();\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [remember, setRemember] = useState(true);\n const [settings, setSettings] = useState<PublicSettings | null>(null);\n const navigate = useNavigate();\n const location = useLocation();\n const toast = useToast();\n const bgColor = useColorModeValue('white', 'gray.800');\n\n // Load public settings to display club logo\n useEffect(() => {\n let mounted = true;\n (async () => {\n try {\n const s = await getPublicSettings();\n if (mounted) setSettings(s);\n } catch (_) {\n // ignore\n }\n })();\n return () => { mounted = false; };\n }, []);\n \n // If user is already authenticated, redirect to admin dashboard\n if (isAuthenticated) {\n return <Navigate to=\"/admin\" replace />;\n }\n\n const from = (location.state as LocationState)?.from?.pathname || '/';\n\n const handleLogin = async (e: React.FormEvent) => {\n e.preventDefault();\n setIsLoading(true);\n\n try {\n const response = await api.post('/auth/login', { email, password });\n const { token, user } = response.data;\n login(token, user, remember);\n toast({\n title: 'Přihlášení proběhlo úspěšně',\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n // Role-based redirect after login, honoring optional `from` target\n // and a stored post-setup target (fc_post_setup_target) for step 2\n const role = String(user?.role || '').toLowerCase();\n const targetFrom = (location.state as LocationState)?.from?.pathname;\n let storedTarget: string | null = null;\n try {\n storedTarget = localStorage.getItem('fc_post_setup_target');\n if (storedTarget) {\n localStorage.removeItem('fc_post_setup_target');\n }\n } catch {}\n if (role === 'admin' || role === 'editor') {\n const target = targetFrom || storedTarget || '/admin';\n navigate(target, { replace: true });\n } else if (role === 'user') {\n navigate('/', { replace: true });\n } else {\n // Fallback for unknown roles (e.g., fan): go to frontpage\n navigate('/', { replace: true });\n }\n } catch (error: any) {\n toast({\n title: 'Přihlášení selhalo',\n description: error.response?.data?.error || error.response?.data?.message || 'Neplatný e-mail nebo heslo',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n } finally {\n setIsLoading(false);\n }\n };\n\n // Removed inline reset sender button; keep single link to forgot-password page/modal\n\n // Registration has been removed for initial setup flow; only login is shown\n\n return (\n <Box minH=\"100vh\" display=\"flex\" alignItems=\"center\" justifyContent=\"center\" bg=\"gray.50\">\n <Box w=\"100%\" maxW=\"md\" p={8} bg={bgColor} borderRadius=\"lg\" boxShadow=\"lg\">\n <Center mb={4}>\n {settings?.club_logo_url ? (\n <Image src={assetUrl(settings.club_logo_url) || settings.club_logo_url} alt={settings.club_name || 'Club logo'} maxH=\"64px\" objectFit=\"contain\" />\n ) : (\n <Heading size=\"md\">Přihlášení</Heading>\n )}\n </Center>\n <VStack as=\"form\" onSubmit={handleLogin} spacing={4} align=\"stretch\">\n <FormControl id=\"login-email\" isRequired>\n <FormLabel>E-mailová adresa</FormLabel>\n <Input \n type=\"email\" \n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"Zadejte svůj e-mail\"\n />\n </FormControl>\n <FormControl id=\"login-password\">\n <FormLabel\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n >\n <Box as=\"span\" display=\"inline-flex\" alignItems=\"center\">\n <Box as=\"span\" mr={1}>Heslo</Box>\n <Box as=\"span\" color=\"red.500\">*</Box>\n </Box>\n <PasswordHelpTooltip />\n </FormLabel>\n <InputGroup>\n <Input \n type={showPassword ? 'text' : 'password'} \n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Zadejte své heslo\"\n required\n aria-required=\"true\"\n />\n <InputRightElement width=\"4.5rem\">\n <Button h=\"1.75rem\" size=\"sm\" onClick={() => setShowPassword((s) => !s)}>{showPassword ? 'Skrýt' : 'Zobrazit'}</Button>\n </InputRightElement>\n </InputGroup>\n </FormControl>\n <Checkbox isChecked={remember} onChange={(e) => setRemember(e.target.checked)}>Zapamatovat přihlášení</Checkbox>\n <Button \n type=\"submit\" \n colorScheme=\"blue\" \n isLoading={isLoading} \n loadingText=\"Přihlašuji...\"\n mt={4}\n >\n {t('auth.login')}\n </Button>\n <Box display=\"flex\" alignItems=\"center\" justifyContent=\"flex-end\">\n <Button variant=\"link\" colorScheme=\"blue\" onClick={() => navigate('/forgot-password?admin=1')}>{t('auth.forgot_password')}</Button>\n </Box>\n </VStack>\n </Box>\n </Box>\n );\n};\n\nexport default AuthPage;\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Box,\n Button,\n HStack,\n IconButton,\n Input,\n SimpleGrid,\n Text,\n Tooltip,\n useColorModeValue,\n VStack,\n Slider,\n SliderTrack,\n SliderFilledTrack,\n SliderThumb,\n} from '@chakra-ui/react';\nimport { BsEyedropper } from 'react-icons/bs';\n\ntype Hsva = { h: number; s: number; v: number; a: number };\n\ntype ColorPickerProps = {\n value: string;\n onChange: (hex: string) => void;\n onChangeComplete?: (hex: string) => void;\n label?: React.ReactNode;\n showAlpha?: boolean;\n showEyeDropper?: boolean;\n recentStorageKey?: string;\n onInteractionStart?: () => void;\n onInteractionEnd?: () => void;\n compact?: boolean;\n hideHistory?: boolean;\n};\n\ntype ColorHistory = {\n manual: string[];\n recent: string[];\n};\n\nconst DEFAULT_HISTORY: ColorHistory = { manual: [], recent: [] };\nconst GLOBAL_KEY = 'myclub-colorpicker-v1';\n\nfunction clamp01(x: number) {\n return Math.min(1, Math.max(0, x));\n}\n\nfunction parseHex(input: string): { r: number; g: number; b: number; a: number } | null {\n if (!input) return null;\n let h = input.trim();\n if (!h.startsWith('#')) h = `#${h}`;\n h = h.slice(1);\n if (![3, 4, 6, 8].includes(h.length)) return null;\n if (h.length === 3 || h.length === 4) {\n h = h\n .split('')\n .map((c) => c + c)\n .join('');\n }\n const hasAlpha = h.length === 8;\n const r = parseInt(h.slice(0, 2), 16);\n const g = parseInt(h.slice(2, 4), 16);\n const b = parseInt(h.slice(4, 6), 16);\n const a = hasAlpha ? parseInt(h.slice(6, 8), 16) / 255 : 1;\n if (Number.isNaN(r) || Number.isNaN(g) || Number.isNaN(b) || Number.isNaN(a)) return null;\n return { r, g, b, a };\n}\n\nfunction rgbaToHex(r: number, g: number, b: number, a: number) {\n const toHex = (n: number) => Math.round(Math.min(255, Math.max(0, n))).toString(16).padStart(2, '0');\n const hr = toHex(r);\n const hg = toHex(g);\n const hb = toHex(b);\n const ha = toHex(a * 255);\n if (a >= 0.999) return `#${hr}${hg}${hb}`;\n return `#${hr}${hg}${hb}${ha}`;\n}\n\nfunction hexToHsva(hex: string): Hsva {\n const parsed = parseHex(hex) || { r: 255, g: 0, b: 0, a: 1 };\n const r = parsed.r / 255;\n const g = parsed.g / 255;\n const b = parsed.b / 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const d = max - min;\n let h = 0;\n const v = max;\n const s = max === 0 ? 0 : d / max;\n if (d !== 0) {\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) * 60;\n break;\n case g:\n h = ((b - r) / d + 2) * 60;\n break;\n case b:\n default:\n h = ((r - g) / d + 4) * 60;\n break;\n }\n }\n if (!Number.isFinite(h)) h = 0;\n return { h, s, v, a: parsed.a };\n}\n\nfunction hsvaToHex(c: Hsva): string {\n const h = ((c.h % 360) + 360) % 360;\n const s = clamp01(c.s);\n const v = clamp01(c.v);\n const a = clamp01(c.a);\n const C = v * s;\n const X = C * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = v - C;\n let r = 0;\n let g = 0;\n let b = 0;\n if (h < 60) {\n r = C;\n g = X;\n b = 0;\n } else if (h < 120) {\n r = X;\n g = C;\n b = 0;\n } else if (h < 180) {\n r = 0;\n g = C;\n b = X;\n } else if (h < 240) {\n r = 0;\n g = X;\n b = C;\n } else if (h < 300) {\n r = X;\n g = 0;\n b = C;\n } else {\n r = C;\n g = 0;\n b = X;\n }\n const rr = (r + m) * 255;\n const gg = (g + m) * 255;\n const bb = (b + m) * 255;\n return rgbaToHex(rr, gg, bb, a);\n}\n\nfunction loadHistory(key?: string): ColorHistory {\n if (typeof window === 'undefined') return DEFAULT_HISTORY;\n try {\n const raw = window.localStorage.getItem(key || GLOBAL_KEY);\n if (!raw) return DEFAULT_HISTORY;\n const parsed = JSON.parse(raw) as ColorHistory;\n if (!parsed || typeof parsed !== 'object') return DEFAULT_HISTORY;\n return {\n manual: Array.isArray(parsed.manual) ? parsed.manual : [],\n recent: Array.isArray(parsed.recent) ? parsed.recent : [],\n };\n } catch {\n return DEFAULT_HISTORY;\n }\n}\n\nfunction saveHistory(history: ColorHistory, key?: string) {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(key || GLOBAL_KEY, JSON.stringify(history));\n } catch {\n }\n}\n\nfunction pushRecentColor(history: ColorHistory, hex: string, limit = 10): ColorHistory {\n const color = (hex || '').toLowerCase();\n if (!color) return history;\n const recent = [color, ...history.recent.filter((c) => c !== color)];\n return { ...history, recent: recent.slice(0, limit) };\n}\n\nfunction pushManualColor(history: ColorHistory, hex: string): ColorHistory {\n const color = (hex || '').toLowerCase();\n if (!color) return history;\n if (history.manual.includes(color)) return history;\n return { ...history, manual: [...history.manual, color] };\n}\n\nexport const ColorPicker: React.FC<ColorPickerProps> = ({\n value,\n onChange,\n onChangeComplete,\n label,\n showAlpha = false,\n showEyeDropper = true,\n recentStorageKey,\n onInteractionStart,\n onInteractionEnd,\n compact = false,\n hideHistory = false,\n}) => {\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const textColor = useColorModeValue('gray.700', 'gray.100');\n const subtleText = useColorModeValue('gray.500', 'gray.400');\n\n const [hsva, setHsva] = useState<Hsva>(() => hexToHsva(value || '#ff0000'));\n const [hex, setHex] = useState<string>(() => hsvaToHex(hsva));\n const [hexInput, setHexInput] = useState<string>(hex.toUpperCase());\n const [isEditingHex, setIsEditingHex] = useState(false);\n const [history, setHistory] = useState<ColorHistory>(() => loadHistory(recentStorageKey));\n const [eyeDropperAvailable, setEyeDropperAvailable] = useState(false);\n\n const svRef = useRef<HTMLDivElement | null>(null);\n const latestHsvaRef = useRef<Hsva>(hsva);\n\n useEffect(() => {\n if (typeof window !== 'undefined' && (window as any).EyeDropper) {\n setEyeDropperAvailable(true);\n }\n }, []);\n\n useEffect(() => {\n const normalized = hsvaToHex(hexToHsva(value || hex));\n setHsva(hexToHsva(normalized));\n setHex(normalized);\n if (!isEditingHex) setHexInput(normalized.toUpperCase());\n }, [value]);\n\n useEffect(() => {\n latestHsvaRef.current = hsva;\n }, [hsva]);\n\n useEffect(() => {\n setHistory(loadHistory(recentStorageKey));\n }, [recentStorageKey]);\n\n const emitChange = useCallback(\n (nextHsva: Hsva, { complete, addToRecent }: { complete?: boolean; addToRecent?: boolean } = {}) => {\n const nextHex = hsvaToHex(nextHsva);\n setHsva(nextHsva);\n setHex(nextHex);\n if (!isEditingHex) setHexInput(nextHex.toUpperCase());\n onChange(nextHex);\n if (addToRecent) {\n setHistory((prev) => {\n const updated = pushRecentColor(prev, nextHex);\n saveHistory(updated, recentStorageKey);\n return updated;\n });\n }\n if (complete && onChangeComplete) onChangeComplete(nextHex);\n },\n [isEditingHex, onChange, onChangeComplete, recentStorageKey],\n );\n\n const handleSvPointer = useCallback(\n (clientX: number, clientY: number) => {\n const rect = svRef.current?.getBoundingClientRect();\n if (!rect) return;\n const x = clamp01((clientX - rect.left) / rect.width);\n const y = clamp01((clientY - rect.top) / rect.height);\n const s = x;\n const v = 1 - y;\n const base = latestHsvaRef.current;\n emitChange({ ...base, s, v }, { addToRecent: false });\n },\n [emitChange],\n );\n\n const handleSvPointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n onInteractionStart?.();\n (e.target as HTMLElement).setPointerCapture?.(e.pointerId);\n handleSvPointer(e.clientX, e.clientY);\n \n let rafId: number | undefined;\n const move = (ev: PointerEvent) => {\n // Use requestAnimationFrame for smooth 60fps updates\n if (rafId) cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(() => {\n handleSvPointer(ev.clientX, ev.clientY);\n });\n };\n const up = (ev: PointerEvent) => {\n if (rafId) {\n cancelAnimationFrame(rafId);\n rafId = undefined;\n }\n handleSvPointer(ev.clientX, ev.clientY);\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n const latest = latestHsvaRef.current;\n emitChange(latest, { complete: true, addToRecent: true });\n onInteractionEnd?.();\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n },\n [handleSvPointer, emitChange, hsva, onInteractionEnd, onInteractionStart],\n );\n\n const handleHueChange = useCallback((next: number) => {\n emitChange({ ...hsva, h: next }, { addToRecent: false });\n }, [hsva, emitChange]);\n\n const handleHueChangeStart = () => {\n onInteractionStart?.();\n };\n\n const handleHueChangeEnd = useCallback((next: number) => {\n emitChange({ ...hsva, h: next }, { complete: true, addToRecent: true });\n onInteractionEnd?.();\n }, [hsva, emitChange, onInteractionEnd]);\n\n const handleAlphaChange = useCallback((next: number) => {\n emitChange({ ...hsva, a: clamp01(next / 100) }, { addToRecent: false });\n }, [hsva, emitChange]);\n\n const handleAlphaChangeEnd = useCallback((next: number) => {\n emitChange({ ...hsva, a: clamp01(next / 100) }, { complete: true, addToRecent: true });\n }, [hsva, emitChange]);\n\n const handleHexInputBlur = () => {\n setIsEditingHex(false);\n const parsed = parseHex(hexInput);\n if (!parsed) {\n setHexInput(hex.toUpperCase());\n return;\n }\n const nextHsva = hexToHsva(hexInput);\n emitChange(nextHsva, { complete: true, addToRecent: true });\n };\n\n const handleSaveManual = () => {\n setHistory((prev) => {\n const updated = pushManualColor(prev, hex);\n saveHistory(updated, recentStorageKey);\n return updated;\n });\n };\n\n const handlePickFromScreen = async () => {\n if (typeof window === 'undefined') return;\n if (!eyeDropperAvailable || !(window as any).EyeDropper) return;\n try {\n onInteractionStart?.();\n const EyeDropperCtor = (window as any).EyeDropper;\n const eyeDropper = new EyeDropperCtor();\n const result = await eyeDropper.open();\n const picked = result?.sRGBHex as string | undefined;\n if (picked) {\n const base = latestHsvaRef.current;\n const pickedHsva = hexToHsva(picked);\n const nextHsva = { ...pickedHsva, a: base.a };\n emitChange(nextHsva, { complete: true, addToRecent: true });\n }\n } catch {\n } finally {\n onInteractionEnd?.();\n }\n };\n\n const svBackground = useMemo(\n () => `linear-gradient(to top, black, transparent), linear-gradient(to right, white, hsl(${hsva.h}, 100%, 50%))`,\n [hsva.h],\n );\n\n const svPointerStyle = useMemo(() => {\n const x = hsva.s * 100;\n const y = (1 - hsva.v) * 100;\n return { left: `${x}%`, top: `${y}%` };\n }, [hsva.s, hsva.v]);\n\n const alphaPercent = Math.round(hsva.a * 100);\n\n const currentHex = hex;\n\n return (\n <Box\n borderWidth=\"1px\"\n borderRadius=\"lg\"\n p={compact ? 2 : 3}\n bg={cardBg}\n borderColor={borderColor}\n boxShadow=\"sm\"\n >\n {label ? (\n <Text fontSize=\"sm\" fontWeight=\"medium\" mb={2} color={textColor}>\n {label}\n </Text>\n ) : null}\n\n <Box\n ref={svRef}\n position=\"relative\"\n borderRadius=\"lg\"\n overflow=\"hidden\"\n height={compact ? '110px' : '140px'}\n cursor=\"crosshair\"\n backgroundImage={svBackground}\n onPointerDown={handleSvPointerDown}\n >\n <Box\n position=\"absolute\"\n width=\"16px\"\n height=\"16px\"\n borderRadius=\"full\"\n borderWidth=\"2px\"\n borderColor=\"white\"\n boxShadow=\"0 0 0 1px rgba(0,0,0,0.4)\"\n transform=\"translate(-50%, -50%)\"\n style={svPointerStyle}\n />\n </Box>\n\n <Box mt={3}>\n <Slider\n aria-label=\"Hue\"\n min={0}\n max={360}\n value={hsva.h}\n onChange={handleHueChange}\n onChangeStart={handleHueChangeStart}\n onChangeEnd={handleHueChangeEnd}\n size=\"sm\"\n >\n <SliderTrack\n bg=\"linear-gradient(to right, red, #ff0, #0f0, #0ff, #00f, #f0f, red)\"\n h=\"8px\"\n borderRadius=\"full\"\n >\n <SliderFilledTrack bg=\"transparent\" />\n </SliderTrack>\n <SliderThumb boxSize={4} borderWidth=\"2px\" borderColor=\"white\" />\n </Slider>\n </Box>\n\n {showAlpha && (\n <Box mt={3}>\n <Slider\n aria-label=\"Opacity\"\n min={0}\n max={100}\n value={alphaPercent}\n onChange={handleAlphaChange}\n onChangeEnd={handleAlphaChangeEnd}\n size=\"sm\"\n >\n <SliderTrack\n bg={`linear-gradient(to right, transparent, ${currentHex})`}\n h=\"8px\"\n borderRadius=\"full\"\n >\n <SliderFilledTrack bg=\"transparent\" />\n </SliderTrack>\n <SliderThumb boxSize={4} borderWidth=\"2px\" borderColor=\"white\" />\n </Slider>\n </Box>\n )}\n\n <HStack spacing={2} mt={3} align=\"center\">\n <Box\n width=\"32px\"\n height=\"32px\"\n borderRadius=\"full\"\n borderWidth=\"1px\"\n borderColor={borderColor}\n bg={currentHex}\n />\n <Input\n value={hexInput}\n onChange={(e) => {\n setIsEditingHex(true);\n setHexInput(e.target.value);\n }}\n onBlur={handleHexInputBlur}\n size=\"sm\"\n fontFamily=\"mono\"\n maxW=\"130px\"\n />\n {showAlpha && (\n <Input\n value={`${alphaPercent}%`}\n onChange={(e) => {\n const raw = e.target.value.replace(/[^0-9]/g, '');\n const n = Math.max(0, Math.min(100, parseInt(raw || '0', 10)));\n emitChange({ ...hsva, a: n / 100 }, { addToRecent: false });\n }}\n onBlur={() => handleAlphaChangeEnd(alphaPercent)}\n size=\"sm\"\n maxW=\"80px\"\n />\n )}\n {showEyeDropper && (\n <Tooltip\n label={\n eyeDropperAvailable\n ? 'Vybrat barvu z obrazovky'\n : 'Pipeta není v tomto prohlížeči podporována.'\n }\n >\n <IconButton\n aria-label=\"Vybrat barvu z obrazovky\"\n icon={<BsEyedropper />}\n size=\"sm\"\n variant=\"outline\"\n onClick={eyeDropperAvailable ? handlePickFromScreen : undefined}\n isDisabled={!eyeDropperAvailable}\n />\n </Tooltip>\n )}\n </HStack>\n\n {!hideHistory && (\n <VStack align=\"stretch\" spacing={2} mt={3}>\n {history.manual.length > 0 && (\n <Box>\n <Text fontSize=\"xs\" mb={1} color={subtleText}>\n Uložené barvy\n </Text>\n <SimpleGrid columns={8} spacing={1}>\n {history.manual.map((c) => (\n <Box\n key={`manual-${c}`}\n as=\"button\"\n type=\"button\"\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n emitChange(hexToHsva(c), { complete: true, addToRecent: true });\n }}\n width=\"18px\"\n height=\"18px\"\n borderRadius=\"full\"\n borderWidth={currentHex.toLowerCase() === c ? '2px' : '1px'}\n borderColor={currentHex.toLowerCase() === c ? 'blue.500' : borderColor}\n bg={c}\n />\n ))}\n </SimpleGrid>\n </Box>\n )}\n\n {history.recent.length > 0 && (\n <Box>\n <Text fontSize=\"xs\" mb={1} color={subtleText}>\n Poslední barvy\n </Text>\n <SimpleGrid columns={8} spacing={1}>\n {history.recent.map((c) => (\n <Box\n key={`recent-${c}`}\n as=\"button\"\n type=\"button\"\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n emitChange(hexToHsva(c), { complete: true, addToRecent: true });\n }}\n width=\"16px\"\n height=\"16px\"\n borderRadius=\"full\"\n borderWidth={currentHex.toLowerCase() === c ? '2px' : '1px'}\n borderColor={currentHex.toLowerCase() === c ? 'blue.500' : borderColor}\n bg={c}\n />\n ))}\n </SimpleGrid>\n </Box>\n )}\n\n <Button\n mt={1}\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleSaveManual}\n >\n + Přidat barvu\n </Button>\n </VStack>\n )}\n </Box>\n );\n};\n\nexport default ColorPicker;\n","import { Box, Text, VStack, HStack, Badge, Icon, Spinner, Alert, AlertIcon, Image, Input, Button, useToast } from '@chakra-ui/react';\nimport React, { useState } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { FaCalendarAlt, FaFutbol, FaExclamationTriangle, FaMapMarkerAlt, FaCloud } from 'react-icons/fa';\nimport { useQuery } from '@tanstack/react-query';\nimport { api, API_URL } from '../../services/api';\nimport { useSettings } from '@/hooks/useSettings';\nimport { useTranslation } from 'react-i18next';\nimport { Widget } from './Widget';\nimport { format, parse, isToday, isTomorrow, isAfter } from 'date-fns';\nimport { cs } from 'date-fns/locale';\nimport { Match } from '../../types';\nimport { fetchTeamLogoOverrides } from '@/services/adminMatches';\nimport { assetUrl, sanitizeClubName } from '@/utils/url';\nimport { getCompetitionAliasesPublic, CompetitionAlias } from '@/services/competitionAliases';\nimport { TeamLogo } from '../common/TeamLogo';\nimport '../../styles/logos.css';\n\nconst FACR_DATE_FMT = 'dd.MM.yyyy HH:mm';\n\nconst formatMatchDate = (dateString: string) => {\n try {\n // Parse FACR date format from cache JSON (e.g., \"17.08.2025 15:00\")\n const date = parse(dateString, FACR_DATE_FMT, new Date());\n \n if (isToday(date)) {\n return format(date, 'HH:mm');\n } else if (isTomorrow(date)) {\n return format(date, \"HH:mm '(zítra)'\");\n } else {\n return format(date, 'dd.MM. HH:mm');\n }\n } catch (error) {\n console.error('Error formatting date:', error, dateString);\n return dateString;\n }\n};\n\nexport const MatchesWidget: React.FC<{\n categoryName?: string;\n hideEmpty?: boolean;\n onMatchClick?: (match: Match) => void;\n}> = ({ categoryName, hideEmpty = false, onMatchClick }) => {\n const { t } = useTranslation();\n const toast = useToast();\n const [email, setEmail] = useState<string>('');\n const [prefWeekly, setPrefWeekly] = useState<boolean>(true);\n const [prefMatches, setPrefMatches] = useState<boolean>(true);\n const [subscribing, setSubscribing] = useState<boolean>(false);\n const location = useLocation();\n const isAdminRoute = String(location.pathname || '').startsWith('/admin');\n\n const resolveUrl = (path: string) => {\n try {\n if (/^https?:\\/\\//i.test(path)) return path;\n const origin = new URL(API_URL, window.location.origin).origin;\n return origin + path;\n } catch {\n return path;\n }\n };\n\n const subscribe = async () => {\n if (!email) {\n toast({ title: t('form.email_required'), status: 'warning' });\n return;\n }\n setSubscribing(true);\n try {\n const res = await fetch(resolveUrl('/api/v1/newsletter/subscribe'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, preferences: { weekly: prefWeekly, matches: prefMatches } })\n });\n if (!res.ok) {\n const jt = await res.json().catch(() => ({} as any));\n throw new Error(jt?.error || `HTTP ${res.status}`);\n }\n toast({ title: t('matches.subscribe_success'), status: 'success' });\n setEmail('');\n } catch (e: any) {\n toast({ title: t('matches.subscribe_error'), description: e?.message || String(e), status: 'error' });\n } finally {\n setSubscribing(false);\n }\n };\n const { settings } = useSettings();\n \n // Check if a match is a home match\n const isHomeMatch = (match: Match) => {\n if (!match?.home || !settings) return false;\n const homeTeam = sanitizeClubName(match.home).toLowerCase();\n const clubName = sanitizeClubName((settings as any)?.club_name || '').toLowerCase();\n return homeTeam.includes(clubName) || clubName.includes(homeTeam);\n };\n\n const { data: overrides = {} } = useQuery({\n queryKey: ['teamLogoOverrides'],\n queryFn: fetchTeamLogoOverrides,\n staleTime: 5 * 60 * 1000,\n });\n const byId: Record<string, { name?: string; logo_url?: string }> = (overrides as any)?.by_id || {};\n const byNameMap: Record<string, string> = (overrides as any)?.by_name || {} as Record<string, string>;\n const normName = (s?: string) => String(s || '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[\\u2012\\u2013\\u2014\\u2015\\u2212]/g, '-')\n .replace(/\\bn\\.?\\b/g, ' nad ')\n .replace(/\\bp\\.?\\b/g, ' pod ')\n .replace(/[\\,\\s]*(z\\.?\\s*s\\.?|o\\.?\\s*s\\.?)\\s*$/g, '')\n .replace(/[\\.,!;:()\\[\\]{}]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\n const aliasNameIndex = React.useMemo(() => {\n const urlToName: Record<string, string> = {};\n for (const v of Object.values(byId || {})) {\n const nm = String((v as any)?.name || '').trim();\n const lg = String((v as any)?.logo_url || '').trim();\n if (nm && lg) urlToName[lg] = nm;\n }\n const idx: Record<string, string> = {};\n for (const [alias, url] of Object.entries(byNameMap || {})) {\n const canon = urlToName[String(url)] || '';\n const key = normName(alias);\n if (canon && key) idx[key] = canon;\n }\n return idx;\n }, [byId, byNameMap]);\n const nameIndex = React.useMemo(() => {\n const idx: Record<string, { id: string; name: string; logo_url: string }> = {};\n try {\n for (const [id, v] of Object.entries(byId || {})) {\n const nm = String((v as any)?.name || '').trim();\n const lg = String((v as any)?.logo_url || '').trim();\n if (!nm) continue;\n const key = normName(nm);\n if (!key) continue;\n idx[key] = { id, name: nm, logo_url: lg };\n }\n } catch {}\n return idx;\n }, [byId]);\n const getOverrideName = (teamName?: string, teamId?: string) => {\n const tid = teamId ? String(teamId) : '';\n if (tid && byId?.[tid]?.name && String(byId[tid].name).trim()) {\n return String(byId[tid].name).trim();\n }\n try {\n const n = normName(teamName);\n if (aliasNameIndex[n]) return aliasNameIndex[n];\n let hit: any = nameIndex[n];\n if (!hit) {\n for (const [k, v] of Object.entries(nameIndex)) {\n if (!k) continue;\n if (n.endsWith(k) || k.endsWith(n)) { hit = v; break; }\n }\n }\n if (hit && (hit as any).name) return String((hit as any).name);\n } catch {}\n return String(teamName || '');\n };\n const getLogo = (teamName?: string, original?: string) => {\n const byName = (overrides as any)?.by_name || {} as Record<string, string>;\n const norm = (s: string) => String(s || '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\n const stripPrefixes = (s: string) => {\n let x = norm(s);\n x = x.replace(/\\b(mestsky|m\\.?f\\.?k\\.?|mfk|tj|sk|sokol|fotbalovy|fotbalový|fotbalovy\\s+klub|fotbalovy\\s+klub)\\b/g, '');\n return x.replace(/\\s+/g, ' ').trim();\n };\n const byNameNorm: Record<string, string> = Object.keys(byName || {}).reduce((acc: Record<string, string>, k) => { acc[norm(k)] = byName[k]; return acc; }, {});\n const strippedPairs = Object.keys(byName || {}).map((k) => ({ key: stripPrefixes(k), url: byName[k] }));\n const pick = (name?: string, orig?: string) => {\n if (!name) return orig;\n const exact = byName[name];\n let candidate = exact || byNameNorm[norm(name)];\n if (!candidate) {\n const s = stripPrefixes(name);\n for (const { key, url } of strippedPairs) { if (key && (s.endsWith(key) || key.endsWith(s))) { candidate = url; break; } }\n }\n const chosen = candidate || orig;\n if (typeof chosen === 'string' && chosen.startsWith('/')) {\n const origin = new URL(API_URL, window.location.origin).origin;\n return origin + chosen;\n }\n return chosen || (assetUrl('/dist/img/logo-club-empty.svg') as string);\n };\n return pick(teamName, original);\n };\n \n const { data: matches = [], isLoading, error } = useQuery<Match[]>({\n queryKey: ['upcomingMatchesCache'],\n queryFn: async () => {\n // Build absolute origin from API URL env (which may include /api/v1)\n const origin = new URL(API_URL, window.location.origin).origin;\n const url = `${origin}/cache/prefetch/facr_club_info.json`;\n\n const res = await fetch(url, { headers: { 'Cache-Control': 'no-cache' } });\n if (!res.ok) throw new Error(`Failed to load cache: ${res.status}`);\n const json = await res.json();\n\n // Flatten competitions -> matches, enrich with competition name\n const comps = Array.isArray(json?.competitions) ? json.competitions : [];\n const items: any[] = comps.flatMap((c: any) =>\n (Array.isArray(c.matches) ? c.matches : []).map((m: any) => ({ ...m, competitionName: c.name, competition_id: c.id }))\n );\n\n // Parse, filter for future, sort ascending, take next 5\n const now = new Date();\n const upcoming = items\n .map((m) => ({\n ...m,\n __dt: parse(String(m.date_time || m.date), FACR_DATE_FMT, new Date()),\n }))\n .filter((m) => isAfter(m.__dt, now))\n .sort((a, b) => a.__dt.getTime() - b.__dt.getTime())\n .slice(0, 5)\n .map((m) => ({\n id: m.match_id,\n date_time: m.date_time || m.date,\n competitionName: m.competitionName,\n home: getOverrideName(m.home || m.home_team, m.home_id),\n away: getOverrideName(m.away || m.away_team, m.away_id),\n score: m.score,\n venue: m.venue,\n home_logo_url: (m.home_id && byId?.[m.home_id]?.logo_url) ? String(byId[m.home_id].logo_url) : getLogo(m.home || m.home_team, m.home_logo_url),\n away_logo_url: (m.away_id && byId?.[m.away_id]?.logo_url) ? String(byId[m.away_id].logo_url) : getLogo(m.away || m.away_team, m.away_logo_url),\n home_id: m.home_id,\n away_id: m.away_id,\n })) as Match[];\n\n return upcoming;\n },\n });\n\n // Load competition aliases (public) to resolve competition names to unified aliases like \"U11\"\n const aliasesQ = useQuery<{ list: CompetitionAlias[] }>({\n queryKey: ['competition-aliases-public'],\n queryFn: async () => {\n try {\n const list = await getCompetitionAliasesPublic();\n return { list };\n } catch {\n return { list: [] as CompetitionAlias[] };\n }\n },\n staleTime: 5 * 60 * 1000,\n });\n\n const normalize = (s?: string) => String(s || '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\n\n const resolveAliasName = React.useCallback((compName?: string): string => {\n const name = String(compName || '');\n const normComp = normalize(name);\n const list = aliasesQ.data?.list || [];\n for (const a of list) {\n const aAlias = normalize(a.alias);\n const aOrig = normalize(a.original_name || '');\n if (aOrig && (normComp.includes(aOrig) || aOrig.includes(normComp))) return a.alias;\n if (aAlias && (normComp.includes(aAlias) || aAlias.includes(normComp))) return a.alias;\n }\n return name;\n }, [aliasesQ.data?.list]);\n\n const displayMatches = React.useMemo(() => {\n if (!Array.isArray(matches)) return [] as Match[];\n if (!categoryName) return matches as Match[];\n const needle = normalize(categoryName);\n const filtered = (matches as Match[]).filter((m: any) => {\n const comp = String((m as any).competitionName || '');\n const resolved = resolveAliasName(comp);\n const nComp = normalize(comp);\n const nResolved = normalize(resolved);\n // Prefer exact match on alias or competition name\n if (nResolved && nResolved === needle) return true;\n if (nComp === needle) return true;\n // Fallback: substring (kept for robustness when names vary)\n return (nResolved && nResolved.includes(needle)) || nComp.includes(needle);\n });\n // Respect hideEmpty: when no matches for the filter, return empty list\n return filtered;\n }, [matches, categoryName, resolveAliasName]);\n\n if (isLoading) {\n return (\n <Widget title={t('matches.upcoming')}>\n <VStack p={4}>\n <Spinner size=\"md\" />\n <Text>{t('matches.loading')}</Text>\n </VStack>\n </Widget>\n );\n }\n\n if (error) {\n return (\n <Widget title={t('matches.upcoming')}>\n <Alert status=\"error\" variant=\"left-accent\">\n <AlertIcon />\n {t('matches.error')}\n </Alert>\n </Widget>\n );\n }\n\n if (!displayMatches || displayMatches.length === 0) {\n if (hideEmpty) return null;\n return (\n <Widget title={t('matches.upcoming')}>\n <VStack p={4} spacing={4}>\n <Icon as={FaCalendarAlt} boxSize={8} color=\"gray.400\" />\n <Text color=\"gray.500\" textAlign=\"center\">\n {t('matches.none_found')}\n </Text>\n </VStack>\n </Widget>\n );\n }\n\n return (\n <Widget title={t('matches.upcoming')}>\n <VStack spacing={{ base: 2, md: 3 }} align=\"stretch\" divider={<Box borderBottomWidth=\"1px\" borderColor=\"gray.200\" />}>\n {displayMatches.map((match) => (\n <Box \n key={match.id} \n p={{ base: 3, md: 4 }} \n bg=\"gray.50\"\n _hover={{ bg: 'gray.100' }} \n borderRadius=\"lg\"\n transition=\"background-color 0.2s\"\n shadow=\"sm\"\n cursor={onMatchClick ? 'pointer' : 'default'}\n role={onMatchClick ? 'button' as any : undefined}\n tabIndex={onMatchClick ? 0 : undefined}\n onClick={() => onMatchClick && onMatchClick(match)}\n onKeyDown={(e) => {\n if (!onMatchClick) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onMatchClick(match);\n }\n }}\n >\n <HStack justify=\"space-between\" mb={1} spacing={2} flexWrap=\"wrap\">\n <Text \n fontSize={{ base: 'xs', sm: 'sm' }} \n color=\"gray.700\" \n fontWeight=\"medium\"\n whiteSpace=\"nowrap\"\n >\n {formatMatchDate(match.date_time)}\n </Text>\n <HStack spacing={1}>\n {isHomeMatch(match) && (\n <Icon as={FaCloud} boxSize={3} color=\"blue.500\" title=\"Domácí zápas - počasí v modálu\" />\n )}\n <Badge \n colorScheme=\"blue\" \n variant=\"subtle\" \n fontSize=\"xs\"\n bg=\"blue.50\"\n color=\"blue.700\"\n >\n {match.competitionName}\n </Badge>\n </HStack>\n </HStack>\n \n <HStack justify=\"space-between\" align=\"center\">\n <HStack flex={1} minW={0} spacing={2}>\n <Box flexShrink={0} className=\"match-widget-logo\">\n <TeamLogo\n teamId={(match as any).home_id}\n teamName={match.home}\n facrLogo={match.home_logo_url}\n size=\"small\"\n fallbackIcon={<Icon as={FaFutbol} color=\"gray.400\" boxSize={{ base: 4, md: 5 }} />}\n />\n </Box>\n <Text \n fontSize={{ base: 'xs', sm: 'sm' }} \n fontWeight=\"medium\" \n isTruncated\n color=\"gray.800\"\n >\n {sanitizeClubName(match.home)}\n </Text>\n </HStack>\n <Text \n fontSize={{ base: 'xs', sm: 'sm' }} \n fontWeight=\"bold\" \n minW={{ base: '32px', sm: '40px' }} \n textAlign=\"center\"\n color=\"gray.900\"\n flexShrink={0}\n >\n {match.score || 'vs'}\n </Text>\n <HStack flex={1} justify=\"flex-end\" spacing={2} minW={0}>\n <Text \n fontSize={{ base: 'xs', sm: 'sm' }} \n fontWeight=\"medium\" \n isTruncated \n textAlign=\"right\"\n color=\"gray.800\"\n >\n {sanitizeClubName(match.away)}\n </Text>\n <Box flexShrink={0} className=\"match-widget-logo\">\n <TeamLogo\n teamId={(match as any).away_id}\n teamName={match.away}\n facrLogo={match.away_logo_url}\n size=\"small\"\n fallbackIcon={<Icon as={FaFutbol} color=\"gray.400\" boxSize={{ base: 4, md: 5 }} />}\n />\n </Box>\n </HStack>\n </HStack>\n \n {match.venue && (\n <HStack mt={2} spacing={2} color=\"gray.500\" fontSize=\"sm\">\n <Icon as={FaMapMarkerAlt} boxSize={3} />\n <Text isTruncated>{match.venue}</Text>\n </HStack>\n )}\n </Box>\n ))}\n {/* Fan subscription form (hidden on admin pages) */}\n {!isAdminRoute && (\n <VStack p={3} spacing={2} align=\"stretch\">\n <Text fontSize=\"sm\" color=\"gray.600\">{t('matches.subscribe_prompt')}</Text>\n <HStack>\n <Input type=\"email\" placeholder={t('form.email_placeholder')} value={email} onChange={(e) => setEmail(e.target.value)} />\n <Button colorScheme=\"red\" onClick={subscribe} isLoading={subscribing}>{t('matches.subscribe')}</Button>\n </HStack>\n </VStack>\n )}\n </VStack>\n </Widget>\n );\n};\n","import React, { useEffect, useRef } from 'react';\nimport { Box } from '@chakra-ui/react';\n\n// Dynamically load Leaflet\nlet L: any = null;\n\ninterface ContactMapProps {\n latitude: number;\n longitude: number;\n zoom?: number;\n address?: string;\n clubName?: string;\n mapStyle?: string;\n height?: number;\n clubPrimaryColor?: string;\n clubSecondaryColor?: string;\n}\n\n// Available map styles\nexport const MAP_STYLES = {\n // Clean & Minimal\n 'positron': {\n name: 'Positron (Light)',\n url: 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png',\n attribution: '© OpenStreetMap © CartoDB',\n description: 'Clean light map, perfect for overlays'\n },\n 'positron-no-labels': {\n name: 'Positron No Labels',\n url: 'https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png',\n attribution: '© OpenStreetMap © CartoDB',\n description: 'Minimal light map without labels'\n },\n \n // Dark Themes\n 'dark': {\n name: 'Dark Matter',\n url: 'https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png',\n attribution: '© OpenStreetMap © CartoDB',\n description: 'Dark theme, great for night mode'\n },\n 'dark-no-labels': {\n name: 'Dark No Labels',\n url: 'https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png',\n attribution: '© OpenStreetMap © CartoDB',\n description: 'Dark map without labels'\n },\n \n // Black & White\n 'toner': {\n name: 'Toner (B&W)',\n url: 'https://tiles.stadiamaps.com/tiles/stamen_toner/{z}/{x}/{y}{r}.png',\n attribution: '© Stamen Design © OpenStreetMap',\n description: 'High contrast black and white'\n },\n 'toner-lite': {\n name: 'Toner Lite (B&W)',\n url: 'https://tiles.stadiamaps.com/tiles/stamen_toner_lite/{z}/{x}/{y}{r}.png',\n attribution: '© Stamen Design © OpenStreetMap',\n description: 'Subtle black and white'\n },\n \n // Colorful Options\n 'voyager': {\n name: 'Voyager',\n url: 'https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png',\n attribution: '© OpenStreetMap © CartoDB',\n description: 'Balanced colors, good readability'\n },\n 'terrain': {\n name: 'Terrain',\n url: 'https://tiles.stadiamaps.com/tiles/stamen_terrain/{z}/{x}/{y}{r}.jpg',\n attribution: '© Stamen Design © OpenStreetMap',\n description: 'Natural terrain visualization'\n },\n 'watercolor': {\n name: 'Watercolor',\n url: 'https://tiles.stadiamaps.com/tiles/stamen_watercolor/{z}/{x}/{y}.jpg',\n attribution: '© Stamen Design © OpenStreetMap',\n description: 'Artistic watercolor style'\n },\n \n // Default\n 'default': {\n name: 'OpenStreetMap',\n url: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',\n attribution: '© OpenStreetMap contributors',\n description: 'Standard OpenStreetMap'\n },\n \n // Satellite\n 'satellite': {\n name: 'Satellite',\n url: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',\n attribution: '© Esri',\n description: 'Satellite imagery'\n },\n};\n\nconst ContactMap: React.FC<ContactMapProps> = ({\n latitude,\n longitude,\n zoom = 15,\n address,\n clubName,\n mapStyle = 'default',\n height = 400,\n clubPrimaryColor,\n clubSecondaryColor,\n}) => {\n const mapRef = useRef<HTMLDivElement>(null);\n const mapInstanceRef = useRef<any>(null);\n const tileLayerRef = useRef<any>(null);\n const markerRef = useRef<any>(null);\n const [isLoaded, setIsLoaded] = React.useState(false);\n const [loadError, setLoadError] = React.useState<string | null>(null);\n\n useEffect(() => {\n // Load Leaflet CSS and JS dynamically\n const loadLeaflet = async () => {\n try {\n // Check if already loaded\n if ((window as any).L) {\n L = (window as any).L;\n setIsLoaded(true);\n return;\n }\n\n // Load CSS\n if (!document.getElementById('leaflet-css')) {\n const link = document.createElement('link');\n link.id = 'leaflet-css';\n link.rel = 'stylesheet';\n link.href = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.css';\n link.integrity = 'sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=';\n link.crossOrigin = '';\n document.head.appendChild(link);\n }\n\n // Load JS\n if (!document.getElementById('leaflet-js')) {\n const script = document.createElement('script');\n script.id = 'leaflet-js';\n script.src = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.js';\n script.integrity = 'sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=';\n script.crossOrigin = '';\n \n script.onload = () => {\n L = (window as any).L;\n setIsLoaded(true);\n };\n\n script.onerror = () => {\n setLoadError('Failed to load map library');\n };\n\n document.head.appendChild(script);\n }\n } catch (error) {\n setLoadError('Error loading map');\n }\n };\n\n loadLeaflet();\n }, []);\n\n useEffect(() => {\n if (!isLoaded || !L || !mapRef.current || mapInstanceRef.current) return;\n\n try {\n // Initialize map\n const map = L.map(mapRef.current, {\n center: [latitude, longitude],\n zoom: zoom,\n scrollWheelZoom: false, // Disable scroll zoom for better UX\n });\n\n mapInstanceRef.current = map;\n\n // Initial tile layer\n const { tileUrl, attribution } = (() => {\n let url = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\n let attr = '© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors';\n if (mapStyle && MAP_STYLES[mapStyle as keyof typeof MAP_STYLES]) {\n const style = MAP_STYLES[mapStyle as keyof typeof MAP_STYLES];\n url = style.url;\n attr = style.attribution;\n } else if (mapStyle && mapStyle.startsWith('http')) {\n url = mapStyle;\n }\n return { tileUrl: url, attribution: attr };\n })();\n\n tileLayerRef.current = L.tileLayer(tileUrl, {\n attribution,\n maxZoom: 19,\n }).addTo(map);\n\n // Create custom marker icon with club colors\n const markerColor = clubPrimaryColor || '#3388ff';\n const customIcon = createCustomMarkerIcon(markerColor, L);\n\n // Add marker\n markerRef.current = L.marker([latitude, longitude], { icon: customIcon }).addTo(map);\n\n // Add popup if address is provided\n if (clubName || address) {\n let popupContent = '';\n if (clubName) popupContent += `<b>${clubName}</b><br>`;\n if (address) popupContent += address;\n markerRef.current.bindPopup(popupContent);\n }\n\n // Enable scroll zoom on click\n map.on('click', () => {\n map.scrollWheelZoom.enable();\n });\n\n // Disable scroll zoom on mouseout\n map.on('mouseout', () => {\n map.scrollWheelZoom.disable();\n });\n\n // Invalidate size after initial mount to ensure tiles render fully\n // (use a short delay to let layout settle)\n try {\n setTimeout(() => {\n try { map.invalidateSize(); } catch {}\n }, 150);\n } catch {}\n\n } catch (error) {\n console.error('Error initializing map:', error);\n setLoadError('Failed to initialize map');\n }\n\n // Cleanup on unmount\n return () => {\n try {\n if (mapInstanceRef.current) {\n mapInstanceRef.current.remove();\n }\n } finally {\n mapInstanceRef.current = null;\n tileLayerRef.current = null;\n markerRef.current = null;\n }\n };\n }, [isLoaded]);\n\n // Observe container visibility to invalidate size when it becomes visible (e.g., tabs, accordions)\n useEffect(() => {\n if (!mapRef.current) return;\n const el = mapRef.current;\n const observer = new IntersectionObserver((entries) => {\n const e = entries[0];\n if (e && e.isIntersecting && mapInstanceRef.current) {\n try {\n // Next frame ensures correct layout measurement\n requestAnimationFrame(() => {\n try { mapInstanceRef.current!.invalidateSize(); } catch {}\n });\n } catch {}\n }\n }, { root: null, threshold: 0.1 });\n observer.observe(el);\n return () => observer.disconnect();\n }, [isLoaded]);\n\n // Observe container resize to keep Leaflet in sync with layout changes\n useEffect(() => {\n if (!mapRef.current || !('ResizeObserver' in window)) return;\n const el = mapRef.current;\n const ro = new ResizeObserver(() => {\n if (!mapInstanceRef.current) return;\n try { mapInstanceRef.current.invalidateSize(); } catch {}\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [isLoaded]);\n\n // Update center/zoom and marker when coords/zoom change\n useEffect(() => {\n if (!mapInstanceRef.current || !L) return;\n try {\n const map = mapInstanceRef.current;\n if (typeof latitude === 'number' && typeof longitude === 'number') {\n map.setView([latitude, longitude], typeof zoom === 'number' ? zoom : map.getZoom());\n if (markerRef.current) {\n markerRef.current.setLatLng([latitude, longitude]);\n }\n }\n } catch {}\n }, [latitude, longitude, zoom]);\n\n // Update map style (tile layer) when mapStyle changes\n useEffect(() => {\n if (!mapInstanceRef.current || !L) return;\n try {\n const map = mapInstanceRef.current;\n // Compute URL and attribution\n let url = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\n let attr = '© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors';\n if (mapStyle && MAP_STYLES[mapStyle as keyof typeof MAP_STYLES]) {\n const style = MAP_STYLES[mapStyle as keyof typeof MAP_STYLES];\n url = style.url;\n attr = style.attribution;\n } else if (mapStyle && mapStyle.startsWith('http')) {\n url = mapStyle;\n }\n if (tileLayerRef.current) {\n map.removeLayer(tileLayerRef.current);\n }\n tileLayerRef.current = L.tileLayer(url, { attribution: attr, maxZoom: 19 }).addTo(map);\n } catch {}\n }, [mapStyle]);\n\n // Update popup content when clubName/address change\n useEffect(() => {\n try {\n if (markerRef.current) {\n if (clubName || address) {\n let popupContent = '';\n if (clubName) popupContent += `<b>${clubName}</b><br>`;\n if (address) popupContent += address;\n markerRef.current.bindPopup(popupContent);\n } else {\n markerRef.current.unbindPopup();\n }\n }\n } catch {}\n }, [clubName, address]);\n\n // Helper function to create color filter\n function createColorFilter(color: string): string | null {\n try {\n // Validate and normalize color\n const tempDiv = document.createElement('div');\n tempDiv.style.color = color;\n document.body.appendChild(tempDiv);\n const computedColor = window.getComputedStyle(tempDiv).color;\n document.body.removeChild(tempDiv);\n return computedColor;\n } catch {\n return null;\n }\n }\n\n // Helper function to create custom marker with club colors\n function createCustomMarkerIcon(color: string, leaflet: any) {\n // Create SVG marker with custom color\n const svgIcon = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 36\" width=\"36\" height=\"54\">\n <defs>\n <filter id=\"shadow\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\">\n <feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"2\"/>\n <feOffset dx=\"0\" dy=\"2\" result=\"offsetblur\"/>\n <feComponentTransfer>\n <feFuncA type=\"linear\" slope=\"0.3\"/>\n </feComponentTransfer>\n <feMerge>\n <feMergeNode/>\n <feMergeNode in=\"SourceGraphic\"/>\n </feMerge>\n </filter>\n </defs>\n <path fill=\"${color}\" stroke=\"#fff\" stroke-width=\"1.5\" filter=\"url(#shadow)\"\n d=\"M12 0C7.03 0 3 4.03 3 9c0 7.5 9 18 9 18s9-10.5 9-18c0-4.97-4.03-9-9-9z\"/>\n <circle cx=\"12\" cy=\"9\" r=\"3\" fill=\"#fff\"/>\n </svg>\n `;\n \n const iconUrl = 'data:image/svg+xml;base64,' + btoa(svgIcon);\n \n return leaflet.icon({\n iconUrl: iconUrl,\n iconSize: [36, 54],\n iconAnchor: [18, 54],\n popupAnchor: [0, -54],\n });\n }\n\n if (loadError) {\n return (\n <Box\n ref={mapRef}\n w=\"100%\"\n h={`${height}px`}\n bg=\"gray.100\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n borderRadius=\"md\"\n >\n {loadError}\n </Box>\n );\n }\n\n return (\n <Box\n ref={mapRef}\n w=\"100%\"\n h={`${height}px`}\n borderRadius=\"md\"\n overflow=\"hidden\"\n boxShadow=\"md\"\n />\n );\n};\n\nexport default ContactMap;\n","/**\r\n * Utility functions for handling logo display and styling\r\n */\r\n\r\n/**\r\n * Checks if a logo URL is from the logoapi service\r\n */\r\nexport const isLogoApiUrl = (url?: string | null): boolean => {\r\n return Boolean(url?.includes('logoapi.sportcreative.eu'));\r\n};\r\n\r\n/**\r\n * Gets appropriate styling for logos based on their source and container type\r\n */\r\nexport const getLogoStyle = (\r\n logoUrl?: string | null,\r\n isCircular: boolean = false,\r\n size: 'small' | 'medium' | 'large' = 'medium'\r\n): React.CSSProperties => {\r\n const isLogoApi = isLogoApiUrl(logoUrl);\r\n \r\n if (isLogoApi && isCircular) {\r\n // Add padding for SVG logos in circular containers to prevent cutoff\r\n const paddingMap = {\r\n small: '2px',\r\n medium: '4px',\r\n large: '6px'\r\n };\r\n \r\n return {\r\n padding: paddingMap[size],\r\n boxSizing: 'border-box',\r\n objectFit: 'contain'\r\n };\r\n }\r\n \r\n return {\r\n objectFit: 'contain'\r\n };\r\n};\r\n\r\n/**\r\n * Gets appropriate className for logo containers\r\n */\r\nexport const getLogoClassName = (\r\n logoUrl?: string | null,\r\n isCircular: boolean = false,\r\n size: 'small' | 'medium' | 'large' = 'medium'\r\n): string => {\r\n const classes = [];\r\n \r\n if (isCircular) {\r\n classes.push('circular-logo-container');\r\n }\r\n \r\n classes.push(`match-logo-${size}`);\r\n \r\n return classes.join(' ');\r\n};\r\n\r\n/**\r\n * Common logo props for Chakra UI Image components\r\n */\r\nexport const getLogoProps = (\r\n logoUrl?: string | null,\r\n isCircular: boolean = false,\r\n size: 'small' | 'medium' | 'large' = 'medium'\r\n) => {\r\n const sizeMap = {\r\n small: { boxSize: '24px' },\r\n medium: { boxSize: '32px' },\r\n large: { boxSize: '48px' }\r\n };\r\n \r\n return {\r\n ...sizeMap[size],\r\n objectFit: 'contain' as const,\r\n borderRadius: isCircular ? 'full' as const : undefined,\r\n style: getLogoStyle(logoUrl, isCircular, size),\r\n className: getLogoClassName(logoUrl, isCircular, size)\r\n };\r\n};\r\n","import React, { useEffect, useState, useRef } from 'react';\nimport { Image, ImageProps, Skeleton } from '@chakra-ui/react';\nimport { getTeamLogo } from '../../utils/sportLogosAPI';\nimport { getLogoStyle, getLogoClassName } from '../../utils/logoUtils';\nimport '../../styles/logos.css';\nimport { usePublicSettings } from '../../hooks/usePublicSettings';\nimport { assetUrl } from '../../utils/url';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\n// Lightweight cached overrides loader\nlet __teamOverridesCache: { ts: number; data: { by_id?: Record<string, { name?: string; logo_url?: string }>; by_name?: Record<string, string> } } | null = null;\nconst loadTeamOverrides = async (): Promise<{ by_id?: Record<string, { name?: string; logo_url?: string }>; by_name?: Record<string, string> }> => {\n const now = Date.now();\n const TTL = 30_000; // Extended to 30 seconds to reduce frequent requests\n if (__teamOverridesCache && now - __teamOverridesCache.ts < TTL) {\n return __teamOverridesCache.data || {};\n }\n // Try fresh public endpoint first\n try {\n const res = await fetch(`/api/v1/public/team-logo-overrides?t=${now}`, { cache: 'no-cache' });\n if (res.ok) {\n const json = await res.json();\n __teamOverridesCache = { ts: now, data: json || {} };\n return json || {};\n }\n } catch {}\n // Fallback to static cache snapshot\n try {\n const res2 = await fetch('/cache/prefetch/team_logo_overrides.json', { cache: 'no-cache' });\n if (res2.ok) {\n const json = await res2.json();\n __teamOverridesCache = { ts: now, data: json || {} };\n return json || {};\n }\n } catch {}\n // Final fallback: previously cached data or empty\n if (__teamOverridesCache) return __teamOverridesCache.data || {};\n __teamOverridesCache = { ts: now, data: {} };\n return {};\n};\n\n// Normalization helpers for name-based matching\nconst __normalize = (s?: string) => {\n let out = String(s || '');\n out = out\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase();\n out = out.replace(/[\\u2012\\u2013\\u2014\\u2015\\u2212]/g, '-');\n out = out.replace(/\\bn\\.?\\b/g, ' nad ');\n out = out.replace(/\\bp\\.?\\b/g, ' pod ');\n out = out.replace(/[.,!;:()\\[\\]{}]/g, ' ');\n // Remove legal suffixes often appended to Czech organizations\n out = out.replace(/[\\s,]*(z\\.?\\s*s\\.?|o\\.?\\s*s\\.?)\\s*$/g, '');\n // Remove common organization phrases\n const orgPhrases = [\n 'fotbalovy klub',\n 'sportovni klub',\n 'telovychovna jednota',\n 'skolni sportovni klub',\n 'spolek',\n 'fotbal',\n 'futsal',\n ];\n for (const phrase of orgPhrases) {\n const re = new RegExp('(^|\\\\b)'+ phrase + '(\\\\b|$)', 'g');\n out = out.replace(re, ' ');\n }\n // Remove common short prefixes/tokens (FK, FC, MFK, TJ, SK, SFC, AFK, BFK, HFK, etc.)\n out = out.replace(/\\b(1\\.)?\\s*(sfc|afc|fc|fk|mfk|tj|sk|afk|bfk|hfk)\\b\\.?/g, ' ');\n out = out.replace(/\\s+/g, ' ').trim();\n return out;\n};\n\ninterface TeamLogoProps extends Omit<ImageProps, 'src'> {\n teamId?: string;\n teamName?: string;\n facrLogo?: string;\n size?: 'small' | 'medium' | 'large' | 'custom';\n fallbackIcon?: React.ReactElement;\n}\n\n/**\n * TeamLogo component with automatic logoapi.sportcreative.eu integration\n * Features:\n * - Fetches from logoapi first (with local caching)\n * - Falls back to FACR logo if logoapi doesn't have it\n * - Properly centers and formats logos\n * - Handles SVG optimization\n */\nexport const TeamLogo: React.FC<TeamLogoProps> = ({\n teamId,\n teamName,\n facrLogo,\n size = 'medium',\n fallbackIcon,\n alt,\n ...imageProps\n}) => {\n const [logoUrl, setLogoUrl] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(false);\n const { data: publicSettings } = usePublicSettings();\n const [observeRef, inView] = useIntersectionObserver({ threshold: 0.01, rootMargin: '150px 0px', freezeOnceVisible: true });\n const debounceTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n if (!inView) return; // defer fetching until visible\n let mounted = true;\n \n // Clear any existing timeout\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n }\n \n const fetchLogo = async () => {\n try {\n setLoading(true);\n setError(false);\n // Load admin overrides (cached)\n let overrides: { by_id?: Record<string, { name?: string; logo_url?: string }>; by_name?: Record<string, string> } = {} as any;\n try { overrides = await loadTeamOverrides(); } catch {}\n // Prefer local club logo for own team when IDs match\n const currentClubId = publicSettings?.club_id;\n const currentClubLogoUrl = publicSettings?.club_logo_url;\n if (\n teamId && currentClubId && String(teamId) === String(currentClubId) && currentClubLogoUrl\n ) {\n if (mounted) {\n setLogoUrl(assetUrl(currentClubLogoUrl) || currentClubLogoUrl);\n }\n } else if (teamId && overrides?.by_id?.[teamId]?.logo_url) {\n const v = overrides.by_id[teamId]!.logo_url as string;\n if (mounted) {\n if (typeof v === 'string' && v.startsWith('/')) {\n setLogoUrl(assetUrl(v) || v);\n } else {\n setLogoUrl(v);\n }\n }\n } else {\n // Try name-based override first if ID override not found\n let appliedByName = false;\n try {\n const byName: Record<string, string> = (overrides as any)?.by_name || {};\n if (teamName && byName && Object.keys(byName).length > 0) {\n const normMap: Record<string, string> = {};\n for (const k of Object.keys(byName)) { normMap[__normalize(k)] = byName[k]; }\n const normTeam = __normalize(teamName);\n let candidate = byName[teamName] || normMap[normTeam];\n if (!candidate) {\n // Suffix/containment match after normalization to handle sponsors/affixes\n const entries = Object.keys(byName).map((k) => ({ keyNorm: __normalize(k), url: byName[k] }));\n for (const { keyNorm, url } of entries) {\n if (!keyNorm) continue;\n if (normTeam.endsWith(keyNorm) || keyNorm.endsWith(normTeam)) { candidate = url; break; }\n }\n }\n if (!candidate) {\n const t1 = normTeam.split(' ')[0];\n if (t1 && t1.length >= 5) {\n for (const { keyNorm, url } of Object.keys(byName).map((k) => ({ keyNorm: __normalize(k), url: byName[k] }))) {\n const k1 = String(keyNorm).split(' ')[0];\n if (k1 === t1) { candidate = url; break; }\n }\n }\n }\n if (candidate) {\n appliedByName = true;\n if (mounted) {\n if (typeof candidate === 'string' && candidate.startsWith('/')) {\n setLogoUrl(assetUrl(candidate) || candidate);\n } else {\n setLogoUrl(candidate);\n }\n }\n }\n }\n } catch {}\n if (!appliedByName) {\n const url = await getTeamLogo(teamId, teamName, facrLogo);\n if (mounted) {\n setLogoUrl(url);\n }\n }\n }\n } catch (e) {\n console.error('Failed to fetch logo:', e);\n if (mounted) {\n setError(true);\n // Fallback to FACR or placeholder\n setLogoUrl(facrLogo || '/logo-placeholder.svg');\n }\n } finally {\n if (mounted) {\n setLoading(false);\n }\n }\n };\n \n // Debounce the fetch to prevent rapid successive calls\n debounceTimeoutRef.current = setTimeout(() => {\n fetchLogo();\n }, 100); // 100ms debounce\n\n return () => {\n mounted = false;\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n }\n };\n }, [teamId, teamName, facrLogo, inView]);\n\n // Size mapping\n const sizeMap = {\n small: { boxSize: '24px' },\n medium: { boxSize: '32px' },\n large: { boxSize: '48px' },\n custom: {},\n };\n\n const sizeProps = size !== 'custom' ? sizeMap[size] : {};\n \n // Class name based on size\n const className = `match-logo-${size} ${imageProps.className || ''}`.trim();\n\n if (loading) {\n return (\n <div ref={observeRef as any} style={{ display: 'inline-block' }}>\n <Skeleton\n {...sizeProps}\n borderRadius=\"4px\"\n className=\"logo-loading\"\n />\n </div>\n );\n }\n\n // Check if this is a circular container\n const isCircular = imageProps.borderRadius === 'full' || imageProps.style?.borderRadius === '50%';\n \n // Get appropriate styling and className using utility functions\n // Only pass size to utils if it's not 'custom' (utils only accept standard sizes)\n const utilSize = size !== 'custom' ? size : 'medium';\n const logoStyle = getLogoStyle(logoUrl, isCircular, utilSize);\n const logoClassName = getLogoClassName(logoUrl, isCircular, utilSize);\n\n return (\n <div ref={observeRef as any} style={{ display: 'inline-block' }}>\n <Image\n src={(assetUrl(logoUrl || undefined) || logoUrl || '/logo-placeholder.svg')}\n alt={alt || teamName || 'Team logo'}\n decoding=\"async\"\n draggable={false}\n {...sizeProps}\n {...imageProps}\n className={`${className} ${logoClassName}`}\n objectFit=\"contain\"\n loading=\"lazy\"\n fallback={fallbackIcon}\n style={{\n ...imageProps.style,\n ...logoStyle\n }}\n onError={() => {\n if (!error) {\n setError(true);\n // If current URL is a local upload that failed, try fotbal.cz fallback\n if (logoUrl && logoUrl.startsWith('/uploads/logos/facr/') && teamId) {\n const fotbalCzUrl = `https://is1.fotbal.cz/media/kluby/${teamId}/${teamId}_crop.jpg`;\n setLogoUrl(fotbalCzUrl);\n setError(false); // Reset error to try the new URL\n } else {\n setLogoUrl(facrLogo || '/logo-placeholder.svg');\n }\n }\n }}\n />\n </div>\n );\n};\n\nexport default TeamLogo;\n","import { useEffect, useRef, useState } from 'react';\n\ninterface UseIntersectionObserverOptions extends IntersectionObserverInit {\n freezeOnceVisible?: boolean;\n}\n\nexport function useIntersectionObserver(\n options: UseIntersectionObserverOptions = {}\n): [React.RefObject<HTMLDivElement>, boolean] {\n const { threshold = 0.1, root = null, rootMargin = '0px', freezeOnceVisible = false } = options;\n \n const elementRef = useRef<HTMLDivElement>(null);\n const [isVisible, setIsVisible] = useState(false);\n const [hasBeenVisible, setHasBeenVisible] = useState(false);\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element) return;\n\n // If already visible and frozen, don't observe again\n if (freezeOnceVisible && hasBeenVisible) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n const visible = entry.isIntersecting;\n setIsVisible(visible);\n \n if (visible) {\n setHasBeenVisible(true);\n if (freezeOnceVisible) {\n observer.disconnect();\n }\n }\n },\n { threshold, root, rootMargin }\n );\n\n observer.observe(element);\n\n return () => {\n observer.disconnect();\n };\n }, [threshold, root, rootMargin, freezeOnceVisible, hasBeenVisible]);\n\n return [elementRef, freezeOnceVisible ? hasBeenVisible : isVisible];\n}\n","import { useQuery } from '@tanstack/react-query';\nimport { getPublicSettings, PublicSettings } from '../services/settings';\n\nexport const usePublicSettings = () =>\n useQuery<PublicSettings>({\n queryKey: ['public-settings'],\n queryFn: getPublicSettings,\n staleTime: 5 * 60 * 1000, // 5 minutes instead of 0\n cacheTime: 30 * 60 * 1000,\n refetchOnWindowFocus: false,\n refetchOnMount: false, // Don't refetch on mount to improve performance\n });\n","import { assetUrl } from '../utils/url';\nimport { API_URL } from './api';\n\nexport interface RelatedClub {\n id: string;\n name: string;\n logo_url?: string;\n competition?: string;\n last_played_iso?: string;\n matches_played?: number;\n}\n\nconst normalize = (value: string) =>\n String(value || '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\n\nconst resolveBackendUrl = (path: string): string => {\n try {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (path.startsWith('/cache') || path.startsWith('/uploads') || path.startsWith('/api/')) {\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n return new URL(path, origin).toString();\n }\n return path;\n } catch {\n return path;\n }\n};\n\nconst fetchJSON = async <T>(path: string): Promise<T | null> => {\n try {\n const res = await fetch(resolveBackendUrl(path), { cache: 'no-cache' });\n if (!res.ok) return null;\n return (await res.json()) as T;\n } catch {\n return null;\n }\n};\n\nconst parseDateTime = (dt?: string): Date | null => {\n if (!dt) return null;\n const [datePart, timePart = '00:00'] = String(dt).split(' ');\n const [day, month, year] = (datePart || '').split('.');\n if (!day || !month || !year) return null;\n const iso = `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}T${timePart.slice(0, 5)}:00`;\n const d = new Date(iso);\n return Number.isNaN(d.getTime()) ? null : d;\n};\n\nlet cachePromise: Promise<RelatedClub[]> | null = null;\n\nconst buildRelatedClubs = (clubInfo: any): RelatedClub[] => {\n if (!clubInfo) return [];\n const ourNameNorm = normalize(clubInfo.name || '');\n const competitions = Array.isArray(clubInfo.competitions) ? clubInfo.competitions : [];\n const map = new Map<string, RelatedClub & { lastPlayedDate?: Date }>();\n\n const considerTeam = (team: {\n name?: string;\n id?: string;\n logo?: string;\n competition?: string;\n occurredAt?: Date | null;\n }) => {\n const teamName = team.name?.trim();\n if (!teamName) return;\n const normName = normalize(teamName);\n if (!normName || normName === ourNameNorm) return;\n\n const existing = map.get(normName);\n const matchesPlayed = (existing?.matches_played ?? 0) + 1;\n const lastPlayedDate = team.occurredAt && (!existing?.lastPlayedDate || team.occurredAt > existing.lastPlayedDate)\n ? team.occurredAt\n : existing?.lastPlayedDate;\n const logoUrl = team.logo || existing?.logo_url;\n const competition = team.competition || existing?.competition;\n\n map.set(normName, {\n id: team.id || existing?.id || normName,\n name: teamName,\n logo_url: logoUrl ? assetUrl(logoUrl) || logoUrl : existing?.logo_url,\n competition,\n matches_played: matchesPlayed,\n last_played_iso: lastPlayedDate ? lastPlayedDate.toISOString() : existing?.last_played_iso,\n lastPlayedDate,\n });\n };\n\n competitions.forEach((comp: any) => {\n const matches = Array.isArray(comp?.matches) ? comp.matches : [];\n matches.forEach((match: any) => {\n const occurredAt = parseDateTime(match?.date_time);\n considerTeam({\n name: match?.home,\n id: match?.home_id || match?.homeId,\n logo: match?.home_logo_url,\n competition: comp?.name,\n occurredAt,\n });\n considerTeam({\n name: match?.away,\n id: match?.away_id || match?.awayId,\n logo: match?.away_logo_url,\n competition: comp?.name,\n occurredAt,\n });\n });\n });\n\n return Array.from(map.values())\n .map(({ lastPlayedDate, ...rest }) => rest)\n .sort((a, b) => {\n const ad = a.last_played_iso ? new Date(a.last_played_iso).getTime() : 0;\n const bd = b.last_played_iso ? new Date(b.last_played_iso).getTime() : 0;\n return bd - ad;\n });\n};\n\nconst fetchRelatedClubs = async (): Promise<RelatedClub[]> => {\n const clubInfo = await fetchJSON<any>('/cache/prefetch/facr_club_info.json');\n if (!clubInfo) return [];\n return buildRelatedClubs(clubInfo);\n};\n\nexport const getRelatedClubs = async (): Promise<RelatedClub[]> => {\n if (!cachePromise) {\n cachePromise = fetchRelatedClubs().catch(() => []);\n }\n return cachePromise;\n};\n","import api, { API_URL } from './api';\nimport { getArticles } from './articles';\nimport { getCategories } from './categories';\nimport { getPlayers } from './public';\nimport { getUpcomingEvents } from './eventService';\nimport { getSponsors } from './sponsors';\nimport facrApi from './facr/facrApi';\nimport { getRelatedClubs, RelatedClub } from './relatedClubs';\n\nexport interface SearchResult {\n type: 'club' | 'match' | 'match_past' | 'article' | 'player' | 'event' | 'sponsor' | 'team' | 'contact' | 'gallery' | 'category';\n id: string | number;\n title: string;\n subtitle?: string;\n description?: string;\n image_url?: string;\n logo_url?: string;\n url?: string;\n date?: string;\n time?: string;\n score?: number;\n metadata?: Record<string, any>;\n}\n\nexport interface SearchResults {\n clubs: SearchResult[];\n matches: SearchResult[];\n matchesPast: SearchResult[];\n articles: SearchResult[];\n players: SearchResult[];\n events: SearchResult[];\n sponsors: SearchResult[];\n teams: SearchResult[];\n contacts: SearchResult[];\n gallery: SearchResult[];\n categories: SearchResult[];\n total: number;\n}\n\n// Enhanced scoring function for relevance with keyword support (accent-insensitive)\nconst scoreMatch = (text: string, query: string): number => {\n const base = (t: string, q: string): number => {\n if (!t || !q) return 0;\n if (t === q) return 100;\n if (t.startsWith(q)) return 80;\n const idx = t.indexOf(q);\n if (idx >= 0) return 60 - Math.min(idx, 30);\n const keywords = q.split(/\\s+/).filter(k => k.length > 1);\n if (keywords.length > 1) {\n let matchedKeywords = 0;\n let totalScore = 0;\n for (const keyword of keywords) {\n if (t.includes(keyword)) {\n matchedKeywords++;\n const keywordIdx = t.indexOf(keyword);\n totalScore += (keywordIdx === 0 ? 25 : 15 - Math.min(keywordIdx, 10));\n }\n }\n if (matchedKeywords >= keywords.length / 2) {\n return Math.min(55, totalScore * (matchedKeywords / keywords.length));\n }\n }\n const chars = q.split('');\n let lastIdx = -1;\n let matched = 0;\n for (const char of chars) {\n const charIdx = t.indexOf(char, lastIdx + 1);\n if (charIdx > lastIdx) {\n matched++;\n lastIdx = charIdx;\n }\n }\n if (matched >= chars.length * 0.8) {\n return Math.min(25, Math.floor((matched / chars.length) * 25));\n }\n return 0;\n };\n const strip = (s: string) => s.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n const t0 = (text || '').toLowerCase();\n const q0 = (query || '').toLowerCase();\n const t1 = strip(t0);\n const q1 = strip(q0);\n return Math.max(base(t0, q0), base(t1, q1));\n};\n\n// Resolve backend URLs for assets\nconst resolveBackendUrl = (path: string): string => {\n try {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (path.startsWith('/cache') || path.startsWith('/uploads') || path.startsWith('/api/')) {\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n return new URL(path, origin).toString();\n }\n return path;\n } catch {\n return path;\n }\n};\n\n// Small helper to fetch JSON from backend or cache with safe failure handling\nconst fetchJSON = async <T>(path: string): Promise<T | null> => {\n try {\n const url = resolveBackendUrl(path);\n const res = await fetch(url, { cache: 'no-cache' });\n if (!res.ok) return null;\n return (await res.json()) as T;\n } catch {\n return null;\n }\n};\n\nconst normalizeName = (value: string) =>\n String(value || '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\n\nexport async function searchAll(query: string): Promise<SearchResults> {\n if (!query || query.trim().length === 0) {\n return {\n clubs: [],\n matches: [],\n matchesPast: [],\n articles: [],\n players: [],\n events: [],\n sponsors: [],\n teams: [],\n contacts: [],\n gallery: [],\n categories: [],\n total: 0,\n };\n }\n\n const q = query.trim().toLowerCase();\n\n try {\n const relatedClubsPromise = getRelatedClubs();\n // Fetch all data in parallel\n const [\n relatedClubsRes,\n clubsRes,\n matchesRes,\n matchesPastRes,\n articlesRes,\n playersRes,\n eventsRes,\n sponsorsRes,\n teamsRes,\n contactsRes,\n galleryRes,\n categoriesRes,\n ] = await Promise.allSettled([\n relatedClubsPromise,\n facrApi.searchClubs(query).catch(() => ({ results: [] })),\n (async () => {\n const apiUrl = resolveBackendUrl(`/api/v1/matches?q=${encodeURIComponent(query)}`);\n try {\n const r = await fetch(apiUrl, { cache: 'no-cache' });\n let arr: any = [];\n if (r.ok) arr = await r.json();\n if (!Array.isArray(arr) || arr.length === 0) {\n const fallback = await fetchJSON<any[]>(`/cache/prefetch/matches.json`);\n return Array.isArray(fallback) ? fallback : [];\n }\n return arr;\n } catch {\n const fallback = await fetchJSON<any[]>(`/cache/prefetch/matches.json`);\n return Array.isArray(fallback) ? fallback : [];\n }\n })(),\n (async () => {\n const apiUrl = resolveBackendUrl(`/api/v1/matches/history?q=${encodeURIComponent(query)}`);\n try {\n const r = await fetch(apiUrl, { cache: 'no-cache' });\n let arr: any = [];\n if (r.ok) arr = await r.json();\n if (Array.isArray(arr) && arr.length > 0) return arr;\n } catch {}\n // Build from FACR club cache as fallback\n const facr = await fetchJSON<any>(`/cache/prefetch/facr_club_info.json`);\n if (!facr || !Array.isArray(facr?.competitions)) return [];\n const now = new Date();\n const out: any[] = [];\n for (const c of facr.competitions) {\n const compName = String(c?.name || c?.code || '').trim();\n const matches = Array.isArray(c?.matches) ? c.matches : [];\n for (const m of matches) {\n const dt = String(m?.date_time || '').trim();\n if (!dt) continue;\n const [datePart, timePart = '00:00'] = dt.split(' ');\n const [day, month, year] = String(datePart || '').split('.');\n if (!day || !month || !year) continue;\n const isoDate = `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n const timeStr = String(timePart).slice(0, 5);\n const ts = new Date(`${isoDate}T${timeStr || '00:00'}:00`);\n if (!(ts instanceof Date) || isNaN(ts.getTime())) continue;\n // Past only\n if (ts.getTime() >= now.getTime()) continue;\n // Parse score if present (e.g., \"2:1\")\n const scoreText = String(m?.score || '').trim();\n let result_home: number | undefined;\n let result_away: number | undefined;\n if (scoreText) {\n const mm = scoreText.match(/^(\\d+)\\s*:\\s*(\\d+)$/);\n if (mm) {\n result_home = parseInt(mm[1], 10);\n result_away = parseInt(mm[2], 10);\n }\n }\n out.push({\n id: m?.match_id || m?.matchId,\n home: m?.home,\n away: m?.away,\n competition: compName,\n date: isoDate,\n time: timeStr || undefined,\n venue: m?.venue,\n home_logo_url: m?.home_logo_url,\n away_logo_url: m?.away_logo_url,\n // include score fields when available so UI can render them\n score: scoreText || undefined,\n result_home,\n result_away,\n });\n }\n }\n return out;\n })(),\n getArticles({ q: query, published: true, page: 1, page_size: 50 }),\n getPlayers(),\n getUpcomingEvents(),\n getSponsors(),\n (async () => {\n const res = await api.get('/teams');\n return Array.isArray(res.data) ? res.data : res.data?.data || [];\n })(),\n (async () => {\n try {\n const res = await api.get('/contacts');\n const grouped = res.data?.categories || {};\n const uncategorized = res.data?.uncategorized || [];\n const allContacts = [...uncategorized];\n Object.values(grouped).forEach((contacts: any) => {\n if (Array.isArray(contacts)) {\n allContacts.push(...contacts);\n }\n });\n return allContacts;\n } catch {\n return [];\n }\n })(),\n (async () => {\n try {\n const res = await api.get('/gallery/albums');\n return Array.isArray(res.data) ? res.data : res.data?.data || res.data?.albums || [];\n } catch {\n return [];\n }\n })(),\n getCategories(),\n ]);\n\n const relatedClubs: RelatedClub[] = relatedClubsRes.status === 'fulfilled' ? relatedClubsRes.value : [];\n const relatedById = new Map<string, RelatedClub>();\n const relatedByName = new Map<string, RelatedClub>();\n relatedClubs.forEach((club) => {\n const idKey = String(club.id || '').toLowerCase();\n if (idKey) relatedById.set(idKey, club);\n const nameKey = normalizeName(club.name);\n if (nameKey) relatedByName.set(nameKey, club);\n });\n const hasRelatedFilter = relatedById.size > 0 || relatedByName.size > 0;\n\n // Process clubs\n const clubsData = clubsRes.status === 'fulfilled' ? (clubsRes.value as any)?.results || [] : [];\n const clubs: SearchResult[] = clubsData\n .filter((c: any) => {\n const name = String(c.name || '').trim();\n if (!name) return false;\n return true;\n })\n .map((c: any) => {\n const idKey = String(c.club_id || c.id || '').toLowerCase();\n const nameKey = normalizeName(c.name);\n const related = (idKey && relatedById.get(idKey)) || (nameKey && relatedByName.get(nameKey)) || null;\n const score = Math.max(scoreMatch(c.name, q), scoreMatch(c.category || '', q));\n const logo = related?.logo_url || c.logo_url;\n const subtitle = related?.competition || c.category || c.club_type;\n return {\n type: 'club' as const,\n id: c.club_id || c.id,\n title: c.name,\n subtitle,\n logo_url: logo ? resolveBackendUrl(logo) : undefined,\n metadata: {\n club_type: c.club_type,\n last_played_iso: related?.last_played_iso,\n matches_played: related?.matches_played,\n },\n score,\n } as SearchResult;\n })\n .sort((a: SearchResult, b: SearchResult) => (b.score || 0) - (a.score || 0));\n\n const matchPassesFilter = (home?: string, away?: string, homeId?: string, awayId?: string) => {\n if (!hasRelatedFilter) return true;\n const homeName = normalizeName(home || '');\n const awayName = normalizeName(away || '');\n if (homeName && relatedByName.has(homeName)) return true;\n if (awayName && relatedByName.has(awayName)) return true;\n const homeKey = String(homeId || '').toLowerCase();\n const awayKey = String(awayId || '').toLowerCase();\n if (homeKey && relatedById.has(homeKey)) return true;\n if (awayKey && relatedById.has(awayKey)) return true;\n return false;\n };\n\n // Process matches (upcoming)\n const matchesData = matchesRes.status === 'fulfilled' ? matchesRes.value : [];\n const matches: SearchResult[] = (Array.isArray(matchesData) ? matchesData : [])\n .filter((m: any) => {\n const comp = m.competition || m.competition_name || m.league || '';\n const queryMatches = (\n scoreMatch(m.home || '', q) > 0 ||\n scoreMatch(m.away || '', q) > 0 ||\n scoreMatch(m.venue || '', q) > 0 ||\n scoreMatch(comp, q) > 0\n );\n // If related filter is active, allow either related match OR explicit query match\n return matchPassesFilter(m.home, m.away, m.home_id || m.homeId, m.away_id || m.awayId) || queryMatches;\n })\n .filter((m: any) => {\n const comp = m.competition || m.competition_name || m.league || '';\n return (\n scoreMatch(m.home || '', q) > 0 ||\n scoreMatch(m.away || '', q) > 0 ||\n scoreMatch(m.venue || '', q) > 0 ||\n scoreMatch(comp, q) > 0\n );\n })\n .map((m: any, idx: number) => ({\n type: 'match' as const,\n id: m.id || idx,\n title: `${m.home || 'TBD'} vs ${m.away || 'TBD'}`,\n subtitle: m.competition || m.competition_name || m.league,\n date: m.date,\n time: m.time,\n metadata: {\n home: m.home,\n away: m.away,\n home_logo_url: m.home_logo_url,\n away_logo_url: m.away_logo_url,\n venue: m.venue,\n external_match_id: m.match_id || m.id,\n },\n score: Math.max(\n scoreMatch(m.home || '', q),\n scoreMatch(m.away || '', q),\n scoreMatch(m.venue || '', q),\n scoreMatch(m.competition || m.competition_name || m.league || '', q)\n ),\n })).sort((a: SearchResult, b: SearchResult) => (b.score || 0) - (a.score || 0));\n\n // Process matches (past)\n const matchesPastData = matchesPastRes.status === 'fulfilled' ? matchesPastRes.value : [];\n const matchesPast: SearchResult[] = (Array.isArray(matchesPastData) ? matchesPastData : [])\n .filter((m: any) => {\n const comp = m.competition || m.competition_name || m.league || '';\n const queryMatches = (\n scoreMatch(m.home || '', q) > 0 ||\n scoreMatch(m.away || '', q) > 0 ||\n scoreMatch(m.venue || '', q) > 0 ||\n scoreMatch(comp, q) > 0\n );\n return matchPassesFilter(m.home, m.away, m.home_id || m.homeId, m.away_id || m.awayId) || queryMatches;\n })\n .filter((m: any) => {\n const comp = m.competition || m.competition_name || m.league || '';\n return (\n scoreMatch(m.home || '', q) > 0 ||\n scoreMatch(m.away || '', q) > 0 ||\n scoreMatch(m.venue || '', q) > 0 ||\n scoreMatch(comp, q) > 0\n );\n })\n .map((m: any, idx: number) => ({\n type: 'match_past' as const,\n id: `past-${m.id || idx}`,\n title: `${m.home || 'TBD'} vs ${m.away || 'TBD'}`,\n subtitle: m.competition || m.competition_name || m.league,\n date: m.date,\n time: m.time,\n metadata: {\n home: m.home,\n away: m.away,\n home_logo_url: m.home_logo_url,\n away_logo_url: m.away_logo_url,\n venue: m.venue,\n external_match_id: m.match_id || m.id,\n // Pass through result fields when available\n result: (m.result || m.result_text || m.score) || undefined,\n result_home: typeof m.result_home === 'number' ? m.result_home : undefined,\n result_away: typeof m.result_away === 'number' ? m.result_away : undefined,\n },\n score: Math.max(\n scoreMatch(m.home || '', q),\n scoreMatch(m.away || '', q),\n scoreMatch(m.venue || '', q),\n scoreMatch(m.competition || m.competition_name || m.league || '', q)\n ),\n })).sort((a: SearchResult, b: SearchResult) => (b.score || 0) - (a.score || 0));\n\n // Process articles (base by query)\n const articlesData = articlesRes.status === 'fulfilled' ? articlesRes.value?.data || [] : [];\n const baseArticles: SearchResult[] = articlesData\n .filter((a: any) => {\n const titleMatch = scoreMatch(a.title || '', q);\n const excerptMatch = scoreMatch(a.excerpt || '', q);\n const contentMatch = scoreMatch(a.content || '', q);\n const categoryMatch = scoreMatch((a?.category?.name || a?.category_name || '') as string, q);\n return titleMatch > 0 || excerptMatch > 0 || contentMatch > 0 || categoryMatch > 0;\n })\n .map((a: any) => ({\n type: 'article' as const,\n id: a.id,\n title: a.title,\n description: a.excerpt,\n image_url: a.image_url,\n url: `/blog/${a.slug || a.id}`,\n date: a.published_at || a.created_at,\n score: Math.max(\n scoreMatch(a.title || '', q),\n scoreMatch(a.excerpt || '', q) * 0.7,\n scoreMatch(a.content || '', q) * 0.3,\n scoreMatch((a?.category?.name || a?.category_name || '') as string, q) * 0.8\n ),\n }))\n .sort((a: SearchResult, b: SearchResult) => (b.score || 0) - (a.score || 0));\n\n // Enrichment: articles linked to top matched matches\n const collectTopMatchIds = (arr: SearchResult[], limit: number): string[] => {\n const out: string[] = [];\n for (const item of arr) {\n if (out.length >= limit) break;\n const mid = String(item?.metadata?.external_match_id || '').trim();\n if (mid && !out.includes(mid)) out.push(mid);\n }\n return out;\n };\n const topUpcoming = collectTopMatchIds(matches, 3);\n const topPast = collectTopMatchIds(matchesPast, 3);\n const matchIds = Array.from(new Set([...topUpcoming, ...topPast])).slice(0, 5);\n let linkedArticlesData: any[] = [];\n if (matchIds.length > 0) {\n const linkedSettled = await Promise.allSettled(\n matchIds.map((id) => getArticles({ match_id: id, published: true, page: 1, page_size: 10 }))\n );\n for (const r of linkedSettled) {\n if (r.status === 'fulfilled' && r.value && Array.isArray((r.value as any).data)) {\n linkedArticlesData.push(...((r.value as any).data as any[]));\n }\n }\n }\n const mapArticle = (a: any): SearchResult => ({\n type: 'article' as const,\n id: a.id,\n title: a.title,\n description: a.excerpt,\n image_url: a.image_url,\n url: `/blog/${a.slug || a.id}`,\n date: a.published_at || a.created_at,\n score: Math.max(\n scoreMatch(a.title || '', q),\n scoreMatch(a.excerpt || '', q) * 0.7,\n scoreMatch(a.content || '', q) * 0.3,\n scoreMatch((a?.category?.name || a?.category_name || '') as string, q) * 0.8\n ) + 5, // slight boost for match-linked relevance\n });\n const linkedMapped: SearchResult[] = (linkedArticlesData || []).map(mapArticle);\n const seen = new Set<number | string>(baseArticles.map((a) => a.id));\n const linkedUnique = linkedMapped.filter((a) => !seen.has(a.id));\n const articles: SearchResult[] = [...baseArticles, ...linkedUnique].sort((a, b) => (b.score || 0) - (a.score || 0));\n\n // Process players\n const playersData = playersRes.status === 'fulfilled' ? playersRes.value : [];\n const players: SearchResult[] = (Array.isArray(playersData) ? playersData : [])\n .filter((p: any) => {\n const fullName = `${p.first_name || ''} ${p.last_name || ''}`;\n const nameMatch = scoreMatch(fullName, q);\n const positionMatch = scoreMatch(p.position || '', q);\n return nameMatch > 0 || positionMatch > 0;\n })\n .map((p: any) => ({\n type: 'player' as const,\n id: p.id,\n title: `${p.first_name} ${p.last_name}`,\n subtitle: p.position,\n image_url: p.image_url,\n url: `/hraci/${p.id}`,\n metadata: { jersey_number: p.jersey_number },\n score: Math.max(\n scoreMatch(`${p.first_name} ${p.last_name}`, q),\n scoreMatch(p.position || '', q)\n ),\n }))\n .sort((a: any, b: any) => (b.score || 0) - (a.score || 0));\n\n // Process events\n const eventsData = eventsRes.status === 'fulfilled' ? eventsRes.value : [];\n const events: SearchResult[] = (Array.isArray(eventsData) ? eventsData : [])\n .filter((e: any) => {\n const titleMatch = scoreMatch(e.title || '', q);\n const descMatch = scoreMatch(e.description || '', q);\n const locationMatch = scoreMatch(e.location || '', q);\n return titleMatch > 0 || descMatch > 0 || locationMatch > 0;\n })\n .map((e: any) => ({\n type: 'event' as const,\n id: e.id,\n title: e.title,\n description: e.description,\n date: e.event_date,\n time: e.event_time,\n metadata: { location: e.location },\n score: Math.max(\n scoreMatch(e.title || '', q),\n scoreMatch(e.description || '', q) * 0.7,\n scoreMatch(e.location || '', q) * 0.5\n ),\n }))\n .sort((a: any, b: any) => (b.score || 0) - (a.score || 0));\n\n // Process sponsors\n const sponsorsData = sponsorsRes.status === 'fulfilled' ? sponsorsRes.value : [];\n const sponsors: SearchResult[] = (Array.isArray(sponsorsData) ? sponsorsData : [])\n .filter((s: any) => {\n const nameMatch = scoreMatch(s.name || '', q);\n return nameMatch > 0;\n })\n .map((s: any) => ({\n type: 'sponsor' as const,\n id: s.id,\n title: s.name,\n logo_url: s.logo_url,\n url: s.website_url,\n score: scoreMatch(s.name || '', q),\n }))\n .sort((a: any, b: any) => (b.score || 0) - (a.score || 0));\n\n // Process teams\n const teamsData = teamsRes.status === 'fulfilled' ? teamsRes.value : [];\n const teams: SearchResult[] = (Array.isArray(teamsData) ? teamsData : [])\n .filter((t: any) => {\n // Filter out teams with no name or empty name\n const name = String(t.name || '').trim();\n if (!name) return false;\n \n const nameMatch = scoreMatch(t.name || '', q);\n const shortMatch = scoreMatch(t.short_name || '', q);\n return nameMatch > 0 || shortMatch > 0;\n })\n .map((t: any) => ({\n type: 'team' as const,\n id: t.id,\n title: t.name,\n subtitle: t.short_name,\n logo_url: t.logo_url,\n description: t.description,\n score: Math.max(scoreMatch(t.name || '', q), scoreMatch(t.short_name || '', q)),\n }))\n .sort((a: any, b: any) => (b.score || 0) - (a.score || 0));\n\n // Process contacts\n const contactsData = contactsRes.status === 'fulfilled' ? contactsRes.value : [];\n const contacts: SearchResult[] = (Array.isArray(contactsData) ? contactsData : [])\n .filter((c: any) => {\n const nameMatch = scoreMatch(c.name || '', q);\n const positionMatch = scoreMatch(c.position || '', q);\n const emailMatch = scoreMatch(c.email || '', q);\n return nameMatch > 0 || positionMatch > 0 || emailMatch > 0;\n })\n .map((c: any) => ({\n type: 'contact' as const,\n id: c.id,\n title: c.name,\n subtitle: c.position,\n description: c.description,\n image_url: c.image_url,\n metadata: { email: c.email, phone: c.phone },\n score: Math.max(\n scoreMatch(c.name || '', q),\n scoreMatch(c.position || '', q),\n scoreMatch(c.email || '', q) * 0.5\n ),\n }))\n .sort((a: any, b: any) => (b.score || 0) - (a.score || 0));\n\n // Process gallery albums\n const galleryData = galleryRes.status === 'fulfilled' ? galleryRes.value : [];\n const gallery: SearchResult[] = (Array.isArray(galleryData) ? galleryData : [])\n .filter((g: any) => {\n const titleMatch = scoreMatch(g.title || g.name || '', q);\n const descMatch = scoreMatch(g.description || '', q);\n return titleMatch > 0 || descMatch > 0;\n })\n .map((g: any) => ({\n type: 'gallery' as const,\n id: g.id,\n title: g.title || g.name,\n description: g.description,\n image_url: g.cover_url || g.thumbnail_url,\n url: `/galerie/${g.id}`,\n metadata: { photo_count: g.photo_count },\n score: Math.max(\n scoreMatch(g.title || g.name || '', q),\n scoreMatch(g.description || '', q) * 0.7\n ),\n }))\n .sort((a: any, b: any) => (b.score || 0) - (a.score || 0));\n\n // Process categories\n const categoriesList: any[] = categoriesRes && categoriesRes.status === 'fulfilled' ? (categoriesRes.value as any[]) : [];\n const categories: SearchResult[] = (Array.isArray(categoriesList) ? categoriesList : [])\n .filter((c: any) => scoreMatch(c?.name || '', q) > 0)\n .map((c: any) => ({\n type: 'category' as const,\n id: c.id,\n title: c.name,\n description: c.description,\n url: `/blog?category_id=${c.id}`,\n score: scoreMatch(c?.name || '', q),\n }))\n .sort((a: any, b: any) => (b.score || 0) - (a.score || 0));\n\n const total =\n clubs.length +\n matches.length +\n matchesPast.length +\n articles.length +\n players.length +\n events.length +\n sponsors.length +\n teams.length +\n contacts.length +\n gallery.length +\n categories.length;\n\n return {\n clubs,\n matches,\n matchesPast,\n articles,\n players,\n events,\n sponsors,\n teams,\n contacts,\n gallery,\n categories,\n total,\n };\n } catch (error) {\n console.error('Search error:', error);\n return {\n clubs: [],\n matches: [],\n matchesPast: [],\n articles: [],\n players: [],\n events: [],\n sponsors: [],\n teams: [],\n contacts: [],\n gallery: [],\n categories: [],\n total: 0,\n };\n }\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Box,\n Container,\n Heading,\n Input,\n Text,\n VStack,\n InputGroup,\n InputLeftElement,\n Icon,\n Flex,\n Spinner,\n SimpleGrid,\n Badge,\n HStack,\n Image,\n Divider,\n Button,\n Tabs,\n TabList,\n TabPanels,\n Tab,\n TabPanel,\n Link,\n Stack,\n useColorModeValue,\n} from '@chakra-ui/react';\nimport { FaSearch, FaCalendar, FaUsers, FaImage, FaHandshake, FaMapMarkerAlt, FaEnvelope, FaPhone } from 'react-icons/fa';\nimport { useSearchParams, useNavigate, Link as RouterLink } from 'react-router-dom';\nimport MainLayout from '../components/layout/MainLayout';\nimport { searchAll, SearchResults } from '../services/search';\nimport NewsletterCTA from '../components/common/NewsletterCTA';\nimport { assetUrl } from '../utils/url';\nimport { useTranslation } from 'react-i18next';\n\nconst SearchPage: React.FC = () => {\n const { t } = useTranslation();\n const [params, setParams] = useSearchParams();\n const navigate = useNavigate();\n const initial = String(params.get('q') || params.get('s') || '');\n const [q, setQ] = useState(initial);\n const [debounced, setDebounced] = useState(initial);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [results, setResults] = useState<SearchResults>({\n clubs: [],\n matches: [],\n matchesPast: [],\n articles: [],\n players: [],\n events: [],\n sponsors: [],\n teams: [],\n contacts: [],\n gallery: [],\n categories: [],\n total: 0,\n });\n const [activeTab, setActiveTab] = useState<string>('all');\n\n // Display limits\n const [matchLimit, setMatchLimit] = useState<number>(10);\n const [matchPastLimit, setMatchPastLimit] = useState<number>(10);\n const [articleLimit, setArticleLimit] = useState<number>(12);\n const [playerLimit, setPlayerLimit] = useState<number>(12);\n const [eventLimit, setEventLimit] = useState<number>(10);\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const bgColor = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.600');\n\n // Debounce\n useEffect(() => {\n const id = setTimeout(() => setDebounced(q.trim()), 400);\n return () => clearTimeout(id);\n }, [q]);\n\n const doSearch = useCallback(async (query: string) => {\n if (!query) {\n setResults({\n clubs: [],\n matches: [],\n matchesPast: [],\n articles: [],\n players: [],\n events: [],\n sponsors: [],\n teams: [],\n contacts: [],\n gallery: [],\n categories: [],\n total: 0,\n });\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const searchResults = await searchAll(query);\n setResults(searchResults);\n } catch (e: any) {\n setError(e?.message || t('search.search_error'));\n } finally {\n setLoading(false);\n }\n }, []);\n\n // Trigger on load and when debounced query changes\n useEffect(() => {\n const currentQ = String(params.get('q') || '');\n const currentS = String(params.get('s') || '');\n if (debounced !== currentQ || debounced !== currentS) {\n const next = new URLSearchParams(params.toString());\n if (debounced) {\n next.set('q', debounced);\n next.set('s', debounced);\n } else {\n next.delete('q');\n next.delete('s');\n }\n setParams(next, { replace: true });\n }\n setMatchLimit(10);\n setMatchPastLimit(10);\n setArticleLimit(12);\n setPlayerLimit(12);\n setEventLimit(10);\n doSearch(debounced);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [debounced]);\n\n const hasAny = useMemo(() => results.total > 0, [results.total]);\n \n // Filter out clubs with no names\n const validClubs = useMemo(() => \n results.clubs.filter(c => c.title && String(c.title).trim()),\n [results.clubs]\n );\n\n const onSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n const next = q.trim();\n setQ(next);\n setDebounced(next);\n const sp = new URLSearchParams(params.toString());\n if (next) { sp.set('q', next); sp.set('s', next); } else { sp.delete('q'); sp.delete('s'); }\n navigate(`/hledat?${sp.toString()}`);\n };\n\n // Helpers: highlight query occurrences\n const highlight = (text?: string, qy?: string) => {\n const t = String(text || '');\n const q = String(qy || '').trim();\n if (!t || !q) return t;\n try {\n const esc = q.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const re = new RegExp(esc, 'gi');\n const parts = t.split(re);\n const matches = t.match(re) || [];\n const out: any[] = [];\n parts.forEach((p, idx) => {\n out.push(p);\n if (idx < matches.length) out.push(<mark key={idx} style={{ backgroundColor: '#fde68a' }}>{matches[idx]}</mark>);\n });\n return <>{out}</>;\n } catch {\n return t;\n }\n };\n\n return (\n <MainLayout>\n <Container maxW=\"7xl\" py={{ base: 6, md: 10 }}>\n <VStack align=\"stretch\" spacing={8}>\n <Box>\n <Heading as=\"h1\" size={{ base: 'xl', md: '2xl' }} mb={2}>{t('search.title')}</Heading>\n <Text color=\"gray.600\">{t('search.description')}</Text>\n </Box>\n\n <Box as=\"form\" onSubmit={onSubmit}>\n <InputGroup size=\"lg\">\n <InputLeftElement pointerEvents=\"none\">\n <Icon as={FaSearch} color=\"gray.400\" />\n </InputLeftElement>\n <Input\n placeholder={t('search.placeholder')}\n value={q}\n onChange={(e) => { setQ(e.target.value); }}\n bg={bgColor}\n _focus={{ borderColor: 'brand.primary', boxShadow: '0 0 0 1px var(--chakra-colors-brand-primary)' }}\n />\n </InputGroup>\n <Button type=\"submit\" mt={3} colorScheme=\"blue\" size=\"lg\">{t('search.search_button')}</Button>\n </Box>\n\n {/* Quick type filter chips */}\n {!loading && hasAny && (\n <HStack spacing={2} wrap=\"wrap\">\n <Button size=\"sm\" variant={activeTab === 'all' ? 'solid' : 'outline'} colorScheme=\"blue\" leftIcon={<FaSearch />} onClick={() => setActiveTab('all')}>\n {t('search.all')} ({results.total})\n </Button>\n <Button size=\"sm\" variant={activeTab === 'clubs' ? 'solid' : 'outline'} onClick={() => setActiveTab('clubs')}>\n {t('search.clubs')} ({validClubs.length})\n </Button>\n <Button size=\"sm\" variant={activeTab === 'matches' ? 'solid' : 'outline'} onClick={() => setActiveTab('matches')}>\n {t('search.matches')} ({results.matches.length + results.matchesPast.length})\n </Button>\n <Button size=\"sm\" variant={activeTab === 'articles' ? 'solid' : 'outline'} onClick={() => setActiveTab('articles')}>\n {t('search.articles')} ({results.articles.length})\n </Button>\n <Button size=\"sm\" variant={activeTab === 'players' ? 'solid' : 'outline'} leftIcon={<FaUsers />} onClick={() => setActiveTab('players')}>\n {t('search.players')} ({results.players.length})\n </Button>\n <Button size=\"sm\" variant={activeTab === 'events' ? 'solid' : 'outline'} leftIcon={<FaCalendar />} onClick={() => setActiveTab('events')}>\n {t('search.events')} ({results.events.length})\n </Button>\n <Button size=\"sm\" variant={activeTab === 'other' ? 'solid' : 'outline'} onClick={() => setActiveTab('other')}>\n {t('search.others')} ({results.teams.length + results.sponsors.length + results.contacts.length + results.gallery.length + results.categories.length})\n </Button>\n </HStack>\n )}\n\n\n {loading && (\n <Flex justify=\"center\" my={12}>\n <VStack spacing={3}>\n <Spinner size=\"xl\" color=\"brand.primary\" thickness=\"4px\" />\n <Text color=\"gray.500\">{t('search.loading')}</Text>\n </VStack>\n </Flex>\n )}\n\n {error && (\n <Box p={4} bg=\"red.50\" borderRadius=\"md\" borderWidth=\"1px\" borderColor=\"red.200\">\n <Text color=\"red.700\" fontWeight=\"medium\">{t('search.error_title')}</Text>\n <Text color=\"red.600\" fontSize=\"sm\">{error}</Text>\n </Box>\n )}\n\n {!loading && !hasAny && debounced && (\n <Box textAlign=\"center\" py={12}>\n <Icon as={FaSearch} boxSize={16} color=\"gray.300\" mb={4} />\n <Heading size=\"md\" mb={2}>{t('search.no_results')}</Heading>\n <Text color=\"gray.500\">{t('search.no_results_desc', { query: debounced })}</Text>\n <Text color=\"gray.500\" fontSize=\"sm\" mt={2}>{t('search.try_different')}</Text>\n </Box>\n )}\n\n {/* Tabs for filtering */}\n {hasAny && (\n <Tabs\n variant=\"enclosed\"\n colorScheme=\"blue\"\n index={['all', 'clubs', 'matches', 'articles', 'players', 'events', 'other'].indexOf(activeTab)}\n onChange={(i) => setActiveTab(['all', 'clubs', 'matches', 'articles', 'players', 'events', 'other'][i])}\n >\n <TabList flexWrap=\"wrap\">\n <Tab><Icon as={FaSearch} mr={2} />{t('search.all')} ({results.total})</Tab>\n <Tab>{t('search.clubs')} ({validClubs.length})</Tab>\n <Tab>{t('search.matches')} ({results.matches.length + results.matchesPast.length})</Tab>\n <Tab>{t('search.articles')} ({results.articles.length})</Tab>\n <Tab><Icon as={FaUsers} mr={2} />{t('search.players')} ({results.players.length})</Tab>\n <Tab><Icon as={FaCalendar} mr={2} />{t('search.events')} ({results.events.length})</Tab>\n <Tab>{t('search.others')} ({results.teams.length + results.sponsors.length + results.contacts.length + results.gallery.length + results.categories.length})</Tab>\n </TabList>\n\n <TabPanels>\n {/* All Results Tab */}\n <TabPanel px={0}>\n <VStack align=\"stretch\" spacing={8}>\n {/* Clubs */}\n {validClubs.length > 0 && (\n <Box>\n <HStack justify=\"space-between\" mb={4}>\n <Heading size=\"md\">{t('search.clubs')}</Heading>\n <Badge colorScheme=\"blue\" fontSize=\"md\">{validClubs.length}</Badge>\n </HStack>\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={4}>\n {validClubs.slice(0, 6).map((c) => (\n <Flex key={c.id} p={4} bg={bgColor} borderWidth=\"1px\" borderRadius=\"md\" align=\"center\" gap={3}>\n {c.logo_url && <Image src={c.logo_url} alt={c.title} boxSize=\"50px\" objectFit=\"contain\" />}\n <VStack align=\"start\" spacing={1}>\n <Text fontWeight=\"bold\">{highlight(c.title, q)}</Text>\n {c.subtitle && <Text fontSize=\"sm\" color=\"gray.500\">{c.subtitle}</Text>}\n </VStack>\n </Flex>\n ))}\n </SimpleGrid>\n {validClubs.length > 6 && (\n <Button mt={3} size=\"sm\" onClick={() => setActiveTab('clubs')}>\n {t('search.show_all_clubs', { count: validClubs.length })}\n </Button>\n )}\n </Box>\n )}\n\n {/* Categories */}\n {results.categories.length > 0 && (\n <Box>\n <HStack justify=\"space-between\" mb={4}>\n <Heading size=\"md\">{t('search.categories')}</Heading>\n <Badge colorScheme=\"pink\" fontSize=\"md\">{results.categories.length}</Badge>\n </HStack>\n <SimpleGrid columns={{ base: 2, md: 3, lg: 4 }} spacing={4}>\n {results.categories.slice(0, 8).map((c) => (\n <Button\n key={c.id}\n as={RouterLink}\n to={c.url || '#'}\n variant=\"outline\"\n colorScheme=\"pink\"\n justifyContent=\"flex-start\"\n >\n {highlight(c.title, q)}\n </Button>\n ))}\n </SimpleGrid>\n </Box>\n )}\n {/* Players */}\n {results.players.length > 0 && (\n <Box>\n <HStack justify=\"space-between\" mb={4}>\n <Heading size=\"md\"><Icon as={FaUsers} mr={2} />{t('search.players')}</Heading>\n <Badge colorScheme=\"green\" fontSize=\"md\">{results.players.length}</Badge>\n </HStack>\n <SimpleGrid columns={{ base: 2, md: 4, lg: 6 }} spacing={4}>\n {results.players.slice(0, 6).map((p) => (\n <Stack\n key={p.id}\n as={RouterLink}\n to={p.url || '#'}\n borderWidth=\"1px\"\n borderRadius=\"lg\"\n overflow=\"hidden\"\n bg={bgColor}\n _hover={{ boxShadow: 'md', transform: 'translateY(-2px)' }}\n transition=\"all 0.2s\"\n >\n <Image\n src={assetUrl(p.image_url) || '/logo512.png'}\n alt={p.title}\n objectFit=\"cover\"\n w=\"100%\"\n h=\"140px\"\n />\n <VStack p={2} spacing={1} align=\"start\">\n <Text fontWeight=\"bold\" fontSize=\"xs\" noOfLines={1}>{highlight(p.title, q)}</Text>\n {p.subtitle && <Text fontSize=\"xs\" color=\"gray.500\" noOfLines={1}>{p.subtitle}</Text>}\n </VStack>\n </Stack>\n ))}\n </SimpleGrid>\n {results.players.length > 6 && (\n <Button mt={3} size=\"sm\" onClick={() => setActiveTab('players')}>\n {t('search.show_all_players', { count: results.players.length })}\n </Button>\n )}\n </Box>\n )}\n\n {/* Matches */}\n {(results.matches.length + results.matchesPast.length) > 0 && (\n <Box>\n <HStack justify=\"space-between\" mb={4}>\n <Heading size=\"md\">{t('search.matches')}</Heading>\n <Badge colorScheme=\"purple\" fontSize=\"md\">{results.matches.length + results.matchesPast.length}</Badge>\n </HStack>\n <VStack align=\"stretch\" spacing={3}>\n {results.matches.slice(0, 3).map((m) => (\n <Flex key={m.id} p={3} bg={bgColor} borderWidth=\"1px\" borderRadius=\"md\" justify=\"space-between\" flexWrap=\"wrap\" gap={2}>\n <HStack gap={2}>\n {m.metadata?.home_logo_url && <Image src={assetUrl(m.metadata.home_logo_url) || m.metadata.home_logo_url} alt=\"\" boxSize=\"24px\" objectFit=\"contain\" />}\n <Text fontSize=\"sm\" fontWeight=\"medium\">{highlight(m.title, q)}</Text>\n {m.metadata?.away_logo_url && <Image src={assetUrl(m.metadata.away_logo_url) || m.metadata.away_logo_url} alt=\"\" boxSize=\"24px\" objectFit=\"contain\" />}\n </HStack>\n {m.date && <Text fontSize=\"xs\" color=\"gray.500\">{m.date} {m.time}</Text>}\n </Flex>\n ))}\n {results.matches.length < 3 && results.matchesPast.slice(0, 3 - results.matches.length).map((m) => (\n <Flex key={m.id} p={3} bg={bgColor} borderWidth=\"1px\" borderRadius=\"md\" justify=\"space-between\" flexWrap=\"wrap\" gap={2}>\n <HStack gap={2}>\n {m.metadata?.home_logo_url && <Image src={assetUrl(m.metadata.home_logo_url) || m.metadata.home_logo_url} alt=\"\" boxSize=\"24px\" objectFit=\"contain\" />}\n <Text fontSize=\"sm\" fontWeight=\"medium\">{highlight(m.title, q)}</Text>\n {m.metadata?.away_logo_url && <Image src={assetUrl(m.metadata.away_logo_url) || m.metadata.away_logo_url} alt=\"\" boxSize=\"24px\" objectFit=\"contain\" />}\n </HStack>\n <HStack gap={2}>\n {(typeof m.metadata?.result_home === 'number' && typeof m.metadata?.result_away === 'number') ? (\n <Badge colorScheme=\"purple\" fontSize=\"xs\">{m.metadata.result_home}:{m.metadata.result_away}</Badge>\n ) : (m.metadata?.result ? (\n <Badge colorScheme=\"purple\" fontSize=\"xs\">{m.metadata.result}</Badge>\n ) : null)}\n {m.date && <Text fontSize=\"xs\" color=\"gray.500\">{m.date} {m.time}</Text>}\n </HStack>\n </Flex>\n ))}\n </VStack>\n {(results.matches.length + results.matchesPast.length) > 3 && (\n <Button mt={3} size=\"sm\" onClick={() => setActiveTab('matches')}>\n {t('search.show_all_matches')}\n </Button>\n )}\n </Box>\n )}\n\n {/* Articles */}\n {results.articles.length > 0 && (\n <Box>\n <HStack justify=\"space-between\" mb={4}>\n <Heading size=\"md\">{t('search.articles')}</Heading>\n <Badge colorScheme=\"teal\" fontSize=\"md\">{results.articles.length}</Badge>\n </HStack>\n <SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} spacing={4}>\n {results.articles.slice(0, 6).map((a) => (\n <Stack\n key={a.id}\n as={RouterLink}\n to={a.url || '#'}\n borderWidth=\"1px\"\n borderRadius=\"lg\"\n overflow=\"hidden\"\n bg={bgColor}\n _hover={{ boxShadow: 'lg', transform: 'translateY(-2px)' }}\n transition=\"all 0.2s\"\n >\n {a.image_url && (\n <Image src={a.image_url} alt={a.title} objectFit=\"cover\" w=\"100%\" h=\"140px\" />\n )}\n <VStack p={3} spacing={2} align=\"start\">\n <Text fontWeight=\"bold\" fontSize=\"sm\" noOfLines={2}>{highlight(a.title, q)}</Text>\n {a.description && (\n <Text fontSize=\"xs\" color=\"gray.600\" noOfLines={2}>{highlight(a.description, q)}</Text>\n )}\n </VStack>\n </Stack>\n ))}\n </SimpleGrid>\n {results.articles.length > 6 && (\n <Button mt={3} size=\"sm\" onClick={() => setActiveTab('articles')}>\n {t('search.show_all_articles', { count: results.articles.length })}\n </Button>\n )}\n </Box>\n )}\n\n {/* Events */}\n {results.events.length > 0 && (\n <Box>\n <HStack justify=\"space-between\" mb={4}>\n <Heading size=\"md\"><Icon as={FaCalendar} mr={2} />{t('search.events')}</Heading>\n <Badge colorScheme=\"orange\" fontSize=\"md\">{results.events.length}</Badge>\n </HStack>\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={4}>\n {results.events.slice(0, 4).map((e) => (\n <Flex key={e.id} p={3} bg={bgColor} borderWidth=\"1px\" borderRadius=\"md\" gap={2}>\n <Icon as={FaCalendar} boxSize={5} color=\"orange.400\" mt={1} />\n <VStack align=\"start\" spacing={1} flex={1}>\n <Text fontWeight=\"bold\" fontSize=\"sm\">{highlight(e.title, q)}</Text>\n {e.description && (\n <Text fontSize=\"xs\" color=\"gray.600\" noOfLines={2}>{highlight(e.description, q)}</Text>\n )}\n {e.date && <Text fontSize=\"xs\" color=\"gray.500\">{e.date} {e.time}</Text>}\n </VStack>\n </Flex>\n ))}\n </SimpleGrid>\n {results.events.length > 4 && (\n <Button mt={3} size=\"sm\" onClick={() => setActiveTab('events')}>\n {t('search.show_all_events')}\n </Button>\n )}\n </Box>\n )}\n </VStack>\n </TabPanel>\n\n {/* Clubs Tab */}\n <TabPanel px={0}>\n {validClubs.length > 0 ? (\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={4}>\n {validClubs.map((c) => (\n <Flex key={c.id} p={4} bg={bgColor} borderWidth=\"1px\" borderRadius=\"md\" align=\"center\" gap={3}>\n {c.logo_url && <Image src={c.logo_url} alt={c.title} boxSize=\"60px\" objectFit=\"contain\" />}\n <VStack align=\"start\" spacing={1}>\n <Text fontWeight=\"bold\">{highlight(c.title, q)}</Text>\n {c.subtitle && <Text fontSize=\"sm\" color=\"gray.500\">{c.subtitle}</Text>}\n </VStack>\n </Flex>\n ))}\n </SimpleGrid>\n ) : (\n <Text color=\"gray.500\">{t('search.no_clubs_found')}</Text>\n )}\n </TabPanel>\n\n {/* Matches Tab */}\n <TabPanel px={0}>\n <VStack align=\"stretch\" spacing={6}>\n {results.matches.length > 0 && (\n <Box>\n <Heading size=\"sm\" mb={3}>{t('search.upcoming_matches')}</Heading>\n <VStack align=\"stretch\" spacing={3}>\n {results.matches.map((m) => (\n <Flex key={m.id} p={4} bg={bgColor} borderWidth=\"1px\" borderRadius=\"md\" justify=\"space-between\" flexWrap=\"wrap\" gap={3}>\n <HStack gap={2}>\n {m.metadata?.home_logo_url && <Image src={assetUrl(m.metadata.home_logo_url) || m.metadata.home_logo_url} alt=\"\" boxSize=\"32px\" objectFit=\"contain\" />}\n <Text fontWeight=\"medium\">{highlight(m.title, q)}</Text>\n {m.metadata?.away_logo_url && <Image src={assetUrl(m.metadata.away_logo_url) || m.metadata.away_logo_url} alt=\"\" boxSize=\"32px\" objectFit=\"contain\" />}\n </HStack>\n <HStack gap={2}>\n {m.date && <Text fontSize=\"sm\" color=\"gray.500\">{m.date} {m.time}</Text>}\n {m.subtitle && <Badge>{highlight(m.subtitle, q)}</Badge>}\n </HStack>\n </Flex>\n ))}\n </VStack>\n </Box>\n )}\n {results.matchesPast.length > 0 && (\n <Box>\n <Heading size=\"sm\" mb={3}>{t('search.past_matches')}</Heading>\n <VStack align=\"stretch\" spacing={3}>\n {results.matchesPast.map((m) => (\n <Flex key={m.id} p={4} bg={bgColor} borderWidth=\"1px\" borderRadius=\"md\" justify=\"space-between\" flexWrap=\"wrap\" gap={3}>\n <HStack gap={2}>\n {m.metadata?.home_logo_url && <Image src={assetUrl(m.metadata.home_logo_url) || m.metadata.home_logo_url} alt=\"\" boxSize=\"32px\" objectFit=\"contain\" />}\n <Text fontWeight=\"medium\">{highlight(m.title, q)}</Text>\n {m.metadata?.away_logo_url && <Image src={assetUrl(m.metadata.away_logo_url) || m.metadata.away_logo_url} alt=\"\" boxSize=\"32px\" objectFit=\"contain\" />}\n </HStack>\n <HStack gap={2}>\n {(typeof m.metadata?.result_home === 'number' && typeof m.metadata?.result_away === 'number') ? (\n <Badge colorScheme=\"purple\" fontSize=\"sm\">{m.metadata.result_home}:{m.metadata.result_away}</Badge>\n ) : (m.metadata?.result ? (\n <Badge colorScheme=\"purple\" fontSize=\"sm\">{m.metadata.result}</Badge>\n ) : null)}\n {m.date && <Text fontSize=\"sm\" color=\"gray.500\">{m.date} {m.time}</Text>}\n {m.subtitle && <Badge>{highlight(m.subtitle, q)}</Badge>}\n </HStack>\n </Flex>\n ))}\n </VStack>\n </Box>\n )}\n {results.matches.length === 0 && results.matchesPast.length === 0 && (\n <Text color=\"gray.500\">{t('search.no_matches_found')}</Text>\n )}\n </VStack>\n </TabPanel>\n\n {/* Articles Tab */}\n <TabPanel px={0}>\n {results.articles.length > 0 ? (\n <SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} spacing={4}>\n {results.articles.map((a) => (\n <Stack\n key={a.id}\n as={RouterLink}\n to={a.url || '#'}\n borderWidth=\"1px\"\n borderRadius=\"lg\"\n overflow=\"hidden\"\n bg={bgColor}\n _hover={{ boxShadow: 'lg', transform: 'translateY(-2px)' }}\n transition=\"all 0.2s\"\n >\n {a.image_url && (\n <Image src={a.image_url} alt={a.title} objectFit=\"cover\" w=\"100%\" h=\"160px\" />\n )}\n <VStack p={4} spacing={2} align=\"start\">\n <Text fontWeight=\"bold\" noOfLines={2}>{highlight(a.title, q)}</Text>\n {a.description && (\n <Text fontSize=\"sm\" color=\"gray.600\" noOfLines={3}>{highlight(a.description, q)}</Text>\n )}\n </VStack>\n </Stack>\n ))}\n </SimpleGrid>\n ) : (\n <Text color=\"gray.500\">{t('search.no_articles_found')}</Text>\n )}\n </TabPanel>\n\n {/* Players Tab */}\n <TabPanel px={0}>\n {results.players.length > 0 ? (\n <SimpleGrid columns={{ base: 2, md: 3, lg: 4 }} spacing={4}>\n {results.players.map((p) => (\n <Stack\n key={p.id}\n as={RouterLink}\n to={p.url || '#'}\n borderWidth=\"1px\"\n borderRadius=\"lg\"\n overflow=\"hidden\"\n bg={bgColor}\n _hover={{ boxShadow: 'md', transform: 'translateY(-2px)' }}\n transition=\"all 0.2s\"\n >\n <Image\n src={assetUrl(p.image_url) || '/logo512.png'}\n alt={p.title}\n objectFit=\"cover\"\n w=\"100%\"\n h=\"200px\"\n />\n <VStack p={3} spacing={1} align=\"start\">\n <Text fontWeight=\"bold\" fontSize=\"sm\">{highlight(p.title, q)}</Text>\n {p.subtitle && <Text fontSize=\"xs\" color=\"gray.500\">{p.subtitle}</Text>}\n {p.metadata?.jersey_number && (\n <Badge colorScheme=\"blue\">#{p.metadata.jersey_number}</Badge>\n )}\n </VStack>\n </Stack>\n ))}\n </SimpleGrid>\n ) : (\n <Text color=\"gray.500\">{t('search.no_players_found')}</Text>\n )}\n </TabPanel>\n\n {/* Events Tab */}\n <TabPanel px={0}>\n {results.events.length > 0 ? (\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={4}>\n {results.events.map((e) => (\n <Flex key={e.id} p={4} bg={bgColor} borderWidth=\"1px\" borderRadius=\"md\" gap={3}>\n <Icon as={FaCalendar} boxSize={8} color=\"orange.400\" />\n <VStack align=\"start\" spacing={1} flex={1}>\n <Text fontWeight=\"bold\">{highlight(e.title, q)}</Text>\n {e.description && (\n <Text fontSize=\"sm\" color=\"gray.600\" noOfLines={2}>{highlight(e.description, q)}</Text>\n )}\n <HStack fontSize=\"sm\" color=\"gray.500\" spacing={3}>\n {e.date && <Text>{e.date} {e.time}</Text>}\n {e.metadata?.location && (\n <HStack spacing={1}>\n <Icon as={FaMapMarkerAlt} />\n <Text>{e.metadata.location}</Text>\n </HStack>\n )}\n </HStack>\n </VStack>\n </Flex>\n ))}\n </SimpleGrid>\n ) : (\n <Text color=\"gray.500\">{t('search.no_events_found')}</Text>\n )}\n </TabPanel>\n\n {/* Other Tab - Teams, Sponsors, Contacts, Gallery */}\n <TabPanel px={0}>\n <VStack align=\"stretch\" spacing={8}>\n {results.categories.length > 0 && (\n <Box>\n <Heading size=\"sm\" mb={3}>{t('search.categories')}</Heading>\n <SimpleGrid columns={{ base: 2, md: 3, lg: 4 }} spacing={3}>\n {results.categories.map((c) => (\n <Button\n key={c.id}\n as={RouterLink}\n to={c.url || '#'}\n variant=\"outline\"\n size=\"sm\"\n colorScheme=\"pink\"\n justifyContent=\"flex-start\"\n >\n {highlight(c.title, q)}\n </Button>\n ))}\n </SimpleGrid>\n </Box>\n )}\n {results.teams.length > 0 && (\n <Box>\n <Heading size=\"sm\" mb={3}>{t('search.teams')}</Heading>\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={4}>\n {results.teams.map((t) => (\n <Flex key={t.id} p={4} bg={bgColor} borderWidth=\"1px\" borderRadius=\"md\" gap={3}>\n {t.logo_url && <Image src={t.logo_url} alt={t.title} boxSize=\"48px\" objectFit=\"contain\" />}\n <VStack align=\"start\" spacing={1}>\n <Text fontWeight=\"bold\">{highlight(t.title, q)}</Text>\n {t.subtitle && <Text fontSize=\"sm\" color=\"gray.500\">{t.subtitle}</Text>}\n </VStack>\n </Flex>\n ))}\n </SimpleGrid>\n </Box>\n )}\n\n {results.sponsors.length > 0 && (\n <Box>\n <Heading size=\"sm\" mb={3}><Icon as={FaHandshake} mr={2} />{t('search.sponsors')}</Heading>\n <SimpleGrid columns={{ base: 2, md: 4 }} spacing={4}>\n {results.sponsors.map((s) => (\n <Flex\n key={s.id}\n as={s.url ? Link : undefined}\n href={s.url}\n isExternal={!!s.url}\n p={4}\n bg={bgColor}\n borderWidth=\"1px\"\n borderRadius=\"md\"\n align=\"center\"\n justify=\"center\"\n >\n {s.logo_url ? (\n <Image src={s.logo_url} alt={s.title} maxH=\"60px\" maxW=\"100%\" objectFit=\"contain\" />\n ) : (\n <Text fontWeight=\"medium\">{highlight(s.title, q)}</Text>\n )}\n </Flex>\n ))}\n </SimpleGrid>\n </Box>\n )}\n\n {results.contacts.length > 0 && (\n <Box>\n <Heading size=\"sm\" mb={3}><Icon as={FaEnvelope} mr={2} />{t('search.contacts')}</Heading>\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={4}>\n {results.contacts.map((c) => (\n <Flex key={c.id} p={4} bg={bgColor} borderWidth=\"1px\" borderRadius=\"md\" gap={3}>\n {c.image_url ? (\n <Image src={c.image_url} alt={c.title} boxSize=\"50px\" borderRadius=\"full\" objectFit=\"cover\" />\n ) : (\n <Icon as={FaUsers} boxSize={10} color=\"gray.400\" />\n )}\n <VStack align=\"start\" spacing={1} flex={1}>\n <Text fontWeight=\"bold\">{highlight(c.title, q)}</Text>\n {c.subtitle && <Text fontSize=\"sm\" color=\"gray.600\">{c.subtitle}</Text>}\n {c.metadata?.email && (\n <HStack fontSize=\"xs\" color=\"gray.500\">\n <Icon as={FaEnvelope} />\n <Text>{c.metadata.email}</Text>\n </HStack>\n )}\n {c.metadata?.phone && (\n <HStack fontSize=\"xs\" color=\"gray.500\">\n <Icon as={FaPhone} />\n <Text>{c.metadata.phone}</Text>\n </HStack>\n )}\n </VStack>\n </Flex>\n ))}\n </SimpleGrid>\n </Box>\n )}\n\n {results.gallery.length > 0 && (\n <Box>\n <Heading size=\"sm\" mb={3}><Icon as={FaImage} mr={2} />{t('search.gallery')}</Heading>\n <SimpleGrid columns={{ base: 2, md: 3, lg: 4 }} spacing={4}>\n {results.gallery.map((g) => (\n <Stack\n key={g.id}\n as={RouterLink}\n to={g.url || '#'}\n borderWidth=\"1px\"\n borderRadius=\"lg\"\n overflow=\"hidden\"\n bg={bgColor}\n _hover={{ boxShadow: 'md', transform: 'translateY(-2px)' }}\n transition=\"all 0.2s\"\n >\n {g.image_url && (\n <Image src={g.image_url} alt={g.title} objectFit=\"cover\" w=\"100%\" h=\"120px\" />\n )}\n <VStack p={3} spacing={1} align=\"start\">\n <Text fontWeight=\"bold\" fontSize=\"sm\" noOfLines={1}>{highlight(g.title, q)}</Text>\n {g.metadata?.photo_count && (\n <Text fontSize=\"xs\" color=\"gray.500\">{g.metadata.photo_count} {t('search.photos', { count: g.metadata.photo_count })}</Text>\n )}\n </VStack>\n </Stack>\n ))}\n </SimpleGrid>\n </Box>\n )}\n\n {results.categories.length === 0 && results.teams.length === 0 && results.sponsors.length === 0 && results.contacts.length === 0 && results.gallery.length === 0 && (\n <Text color=\"gray.500\">{t('search.no_other_results')}</Text>\n )}\n </VStack>\n </TabPanel>\n </TabPanels>\n </Tabs>\n )}\n </VStack>\n\n {/* Newsletter CTA */}\n <NewsletterCTA />\n </Container>\n </MainLayout>\n );\n};\n\nexport default SearchPage;\n","import { Box, Container, HStack, Link, Text, Stack, Wrap, WrapItem, Button, Image, VStack, IconButton, SimpleGrid, Heading } from '@chakra-ui/react';\nimport React, { useEffect, useState } from 'react';\nimport { FiArrowUpRight, FiMail } from 'react-icons/fi';\nimport { FaFacebook, FaInstagram, FaYoutube } from 'react-icons/fa';\nimport { trackNavigation } from '../../utils/umami';\nimport { useClubTheme } from '../../contexts/ClubThemeContext';\nimport { usePublicSettings } from '../../hooks/usePublicSettings';\nimport { assetUrl } from '../../utils/url';\nimport { API_URL } from '../../services/api';\nimport { useTranslation } from 'react-i18next';\n\nconst resolveBackendUrl = (path: string) => {\n try {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (path.startsWith('/cache') || path.startsWith('/uploads')) {\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n return new URL(path, origin).toString();\n }\n return path;\n } catch {\n return path;\n }\n};\n\ninterface Sponsor {\n id: number | string;\n name: string;\n logo_url?: string;\n website_url?: string;\n is_active?: boolean;\n tier?: string;\n display_order?: number;\n}\n\nconst Footer: React.FC = () => {\n const { t, i18n } = useTranslation();\n const currentYear = new Date().getFullYear();\n const [clubName, setClubName] = useState<string>('Fotbal Club');\n const [shopUrl, setShopUrl] = useState<string | null>(null);\n const [sponsors, setSponsors] = useState<Sponsor[]>([]);\n const theme = useClubTheme();\n const { data: settings } = usePublicSettings();\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const res = await fetch(resolveBackendUrl('/cache/prefetch/facr_club_info.json'), { cache: 'no-cache' });\n if (!res.ok) return;\n const json = await res.json();\n if (cancelled) return;\n if (json?.name) setClubName(String(json.name));\n } catch {}\n try {\n const res = await fetch(resolveBackendUrl('/cache/prefetch/settings.json'), { cache: 'no-cache' });\n if (res?.ok) {\n const s = await res.json();\n if (!cancelled && s) {\n setShopUrl(s?.shop_url || s?.eshop_url || null);\n }\n }\n } catch {}\n // Fetch sponsors\n try {\n const sponsorsRes = await fetch(`${API_URL}/sponsors`);\n if (sponsorsRes.ok) {\n const data = await sponsorsRes.json();\n if (!cancelled && Array.isArray(data)) {\n // Filter active sponsors only\n const activeSponsors = data.filter((s: Sponsor) => s.is_active !== false);\n setSponsors(activeSponsors);\n }\n }\n } catch {}\n })();\n return () => { cancelled = true; };\n }, []);\n\n return (\n <>\n {/* Navigation Footer */}\n <Box bg=\"gray.800\" color=\"white\" mt={12} py={8} borderTop=\"1px\" borderColor=\"whiteAlpha.200\">\n <Container maxW=\"container.xl\">\n <Stack direction={{ base: 'column', lg: 'row' }} spacing={6} justify=\"space-between\" align={{ base: 'flex-start', lg: 'center' }} w=\"100%\">\n {/* Brand */}\n <HStack spacing={3} align=\"center\">\n <Text fontWeight=\"700\" fontSize=\"lg\">{clubName}</Text>\n </HStack>\n\n {/* Navigation links */}\n <Wrap spacing={4} shouldWrapChildren>\n <WrapItem><Link href=\"/blog\" color=\"whiteAlpha.900\" fontWeight=\"600\" _hover={{ color: 'white', textDecoration: 'underline' }}>{t('footer.articles')}</Link></WrapItem>\n <WrapItem><Link href=\"/kalendar\" color=\"whiteAlpha.800\" _hover={{ color: 'white', textDecoration: 'underline' }}>{t('footer.matches')}</Link></WrapItem>\n <WrapItem><Link href=\"/tabulky\" color=\"whiteAlpha.800\" _hover={{ color: 'white', textDecoration: 'underline' }}>{t('footer.table')}</Link></WrapItem>\n <WrapItem><Link href=\"/sponzori\" color=\"whiteAlpha.800\" _hover={{ color: 'white', textDecoration: 'underline' }}>{t('footer.sponsors')}</Link></WrapItem>\n <WrapItem><Link href=\"/kontakt\" color=\"whiteAlpha.800\" _hover={{ color: 'white', textDecoration: 'underline' }}>{t('footer.contact')}</Link></WrapItem>\n <WrapItem><Link href=\"/pravidla-cookies\" color=\"whiteAlpha.800\" _hover={{ color: 'white', textDecoration: 'underline' }}>{t('footer.cookies')}</Link></WrapItem>\n <WrapItem><Link href=\"/obchodni-podminky\" color=\"whiteAlpha.800\" _hover={{ color: 'white', textDecoration: 'underline' }}>{t('footer.terms')}</Link></WrapItem>\n <WrapItem><Link href=\"/zasady-ochrany-osobnich-udaju\" color=\"whiteAlpha.800\" _hover={{ color: 'white', textDecoration: 'underline' }}>{t('footer.privacy')}</Link></WrapItem>\n {shopUrl && (\n <WrapItem><Link href={shopUrl} color=\"whiteAlpha.800\" _hover={{ color: 'white', textDecoration: 'underline' }} isExternal display=\"inline-flex\" alignItems=\"center\" gap={1}>{t('footer.eshop')} <FiArrowUpRight /></Link></WrapItem>\n )}\n </Wrap>\n </Stack>\n </Container>\n </Box>\n\n {/* Sponsors Section */}\n {sponsors.length > 0 && (\n <Box bg=\"gray.700\" color=\"white\" py={8} borderTop=\"1px\" borderColor=\"whiteAlpha.200\">\n <Container maxW=\"container.xl\">\n <VStack spacing={6}>\n <Heading size=\"md\" color=\"whiteAlpha.900\">\n {t('footer.partners')}\n </Heading>\n <SimpleGrid \n columns={{ base: 2, sm: 3, md: 4, lg: 6 }} \n spacing={6}\n w=\"full\"\n >\n {[...sponsors]\n .sort((a: any, b: any) => {\n const at = a?.tier === 'general' ? 0 : 1;\n const bt = b?.tier === 'general' ? 0 : 1;\n if (at !== bt) return at - bt;\n const ao = (a as any)?.display_order ?? 9999;\n const bo = (b as any)?.display_order ?? 9999;\n if (ao !== bo) return ao - bo;\n return String(a?.name || '').localeCompare(String(b?.name || ''));\n })\n .map((sponsor) => (\n <Link\n key={sponsor.id}\n href={sponsor.website_url || '#'}\n isExternal={!!sponsor.website_url}\n target={sponsor.website_url ? '_blank' : undefined}\n rel={sponsor.website_url ? 'noopener noreferrer' : undefined}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n p={3}\n bg=\"whiteAlpha.100\"\n borderRadius=\"md\"\n _hover={{ bg: 'whiteAlpha.200', transform: 'translateY(-2px)' }}\n transition=\"all 0.2s\"\n onClick={() => trackNavigation('footer', `sponsor_${sponsor.name}`)}\n >\n <Image\n src={assetUrl(sponsor.logo_url) || '/sponsor-placeholder.svg'}\n alt={sponsor.name}\n maxH=\"60px\"\n maxW=\"full\"\n objectFit=\"contain\"\n opacity={0.9}\n _hover={{ opacity: 1 }}\n />\n </Link>\n ))}\n </SimpleGrid>\n </VStack>\n </Container>\n </Box>\n )}\n\n {/* Social Media Section */}\n {(settings?.facebook_url || settings?.instagram_url || settings?.youtube_url) && (\n <Box bg=\"gray.600\" color=\"white\" py={6} borderTop=\"1px\" borderColor=\"whiteAlpha.200\">\n <Container maxW=\"container.xl\">\n <VStack spacing={4}>\n <Text fontSize=\"lg\" fontWeight=\"600\" color=\"whiteAlpha.900\">\n {t('footer.follow_us')}\n </Text>\n <HStack spacing={4}>\n {settings?.facebook_url && (\n <IconButton\n as=\"a\"\n href={settings.facebook_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label=\"Facebook\"\n icon={<FaFacebook />}\n size=\"lg\"\n colorScheme=\"facebook\"\n variant=\"ghost\"\n color=\"white\"\n _hover={{ \n bg: 'whiteAlpha.200', \n transform: 'translateY(-2px)',\n color: '#1877F2'\n }}\n transition=\"all 0.2s\"\n onClick={() => trackNavigation('footer', 'social_facebook')}\n />\n )}\n {settings?.instagram_url && (\n <IconButton\n as=\"a\"\n href={settings.instagram_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label=\"Instagram\"\n icon={<FaInstagram />}\n size=\"lg\"\n variant=\"ghost\"\n color=\"white\"\n _hover={{ \n bg: 'whiteAlpha.200', \n transform: 'translateY(-2px)',\n color: '#E4405F'\n }}\n transition=\"all 0.2s\"\n onClick={() => trackNavigation('footer', 'social_instagram')}\n />\n )}\n {settings?.youtube_url && (\n <IconButton\n as=\"a\"\n href={settings.youtube_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label=\"YouTube\"\n icon={<FaYoutube />}\n size=\"lg\"\n variant=\"ghost\"\n color=\"white\"\n _hover={{ \n bg: 'whiteAlpha.200', \n transform: 'translateY(-2px)',\n color: '#FF0000'\n }}\n transition=\"all 0.2s\"\n onClick={() => trackNavigation('footer', 'social_youtube')}\n />\n )}\n </HStack>\n </VStack>\n </Container>\n </Box>\n )}\n\n {/* Copyright Bar */}\n <Box bg=\"gray.900\" color=\"whiteAlpha.900\" py={4}>\n <Container maxW=\"container.xl\">\n <Text fontSize=\"sm\" textAlign=\"center\">\n © {currentYear} {clubName}. {i18n.language === 'en' ? 'All rights reserved.' : 'Všechna práva vyhrazena.'}\n </Text>\n </Container>\n </Box>\n\n {/* MyClub Watermark - Clean White Branding */}\n <Box bg=\"white\" borderTop=\"1px\" borderColor=\"gray.200\" py={6} data-watermark=\"myclub\">\n <Container maxW=\"container.xl\">\n <Stack \n direction={{ base: 'column', md: 'row' }} \n spacing={6} \n justify=\"space-between\" \n align=\"center\"\n >\n {/* Left: MyClub Logo & Text */}\n <HStack spacing={4} align=\"center\">\n <Image \n src=\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 50'%3E%3Crect width='200' height='50' fill='%23007bff'/%3E%3Ctext x='10' y='35' font-family='Arial' font-size='24' font-weight='bold' fill='%23fff'%3EMyClub%3C/text%3E%3C/svg%3E\"\n alt=\"MyClub\"\n h={{ base: '32px', md: '40px' }}\n w=\"auto\"\n loading=\"lazy\"\n fallbackSrc=\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 50'%3E%3Ctext x='10' y='35' font-family='Arial' font-size='24' font-weight='bold' fill='%23000'%3EMyClub%3C/text%3E%3C/svg%3E\"\n />\n <VStack align=\"start\" spacing={0}>\n <Text fontSize={{ base: 'sm', md: 'md' }} fontWeight=\"600\" color=\"gray.800\">\n {t('footer.powered_by')}\n </Text>\n <Text fontSize={{ base: 'xs', md: 'sm' }} color=\"gray.600\">\n {t('footer.powered_by_desc')}\n </Text>\n </VStack>\n </HStack>\n\n {/* Right: CTA Buttons */}\n <HStack spacing={3}>\n <Button\n as=\"a\"\n href=\"https://myclub.sportcreative.eu/kontakt\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n size={{ base: 'sm', md: 'md' }}\n colorScheme=\"blue\"\n variant=\"solid\"\n leftIcon={<FiMail />}\n _hover={{ transform: 'translateY(-2px)', boxShadow: 'lg' }}\n transition=\"all 0.2s\"\n >\n {t('footer.order_now')}\n </Button>\n <Button\n as=\"a\"\n href=\"https://myclub.sportcreative.eu\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n size={{ base: 'sm', md: 'md' }}\n variant=\"outline\"\n colorScheme=\"gray\"\n rightIcon={<FiArrowUpRight />}\n _hover={{ bg: 'gray.50' }}\n >\n {t('footer.learn_more')}\n </Button>\n </HStack>\n </Stack>\n </Container>\n </Box>\n </>\n );\n};\n\nexport default Footer;\n","import { api } from './api';\n\nexport interface AIUsageStatus {\n [modelId: string]: {\n used: number;\n limit: number;\n remaining: number;\n unlimited: boolean;\n };\n}\n\nexport interface AIUsageResponse {\n status: AIUsageStatus;\n}\n\n// Get AI usage status for all models\nexport async function getAIUsageStatus(): Promise<AIUsageStatus> {\n const response = await api.get<AIUsageResponse>('/ai/usage/status');\n return response.data.status;\n}\n\n// Get remaining requests for a specific model\nexport async function getRemainingRequests(modelId: string): Promise<number> {\n try {\n const status = await getAIUsageStatus();\n const modelStatus = status[modelId];\n if (!modelStatus) {\n return 10; // Default fallback\n }\n return modelStatus.unlimited ? -1 : modelStatus.remaining;\n } catch (error) {\n console.error('Failed to get AI usage status:', error);\n return 10; // Default fallback on error\n }\n}\n\n// Check if a model has unlimited usage\nexport function isUnlimitedModel(status: AIUsageStatus, modelId: string): boolean {\n const modelStatus = status[modelId];\n return modelStatus?.unlimited || false;\n}\n\n// Format usage display text\nexport function formatUsageText(status: AIUsageStatus, modelId: string): string {\n const modelStatus = status[modelId];\n if (!modelStatus) {\n return '10/10'; // Default fallback\n }\n \n if (modelStatus.unlimited) {\n return '∞';\n }\n \n return `${modelStatus.remaining}/${modelStatus.limit}`;\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Box,\n Flex,\n HStack,\n IconButton,\n Menu,\n MenuButton,\n MenuItem,\n MenuList,\n Text,\n Textarea,\n Tooltip,\n useColorModeValue,\n useDisclosure,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalBody,\n ModalFooter,\n ModalCloseButton,\n Button,\n Spinner,\n useToast,\n} from '@chakra-ui/react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { FiChevronDown, FiCheck, FiSend, FiPaperclip, FiMic } from 'react-icons/fi';\nimport { Brain, Sparkles, Globe2 } from 'lucide-react';\nimport {\n AITextModelId,\n AITextModelOption,\n getDefaultTextModelId,\n getEnabledTextModels,\n findTextModel,\n} from '../../utils/aiModels';\nimport { getAIUsageStatus, formatUsageText, AIUsageStatus } from '../../services/aiUsage';\nimport UploadPanel, { UploadPanelFile } from './UploadPanel';\nimport { processOcrAI, transcribeAudioAI } from '../../services/ai';\nimport { uploadFile as uploadArticleFile } from '../../services/articles';\n\nexport interface AIPromptInputProps {\n value: string;\n onChange: (value: string) => void;\n onSubmit: (value: string, modelId: AITextModelId) => void | Promise<unknown>;\n isSubmitting?: boolean;\n placeholder?: string;\n helperText?: string;\n initialModelId?: AITextModelId;\n onModelChange?: (id: AITextModelId) => void;\n onAttachClick?: () => void;\n onVoiceClick?: () => void;\n}\n\nconst DAILY_LIMIT = 10;\nconst DAILY_LIMIT_REASONING = 5;\nconst DAILY_LIMIT_DEEPSEEK = Infinity; // Unlimited for DeepSeek\n\nconst MotionBox = motion(Box);\n\nconst getModelIcon = (model?: AITextModelOption, size = 14) => {\n if (!model) return null;\n const iconSize = size === 16 ? 20 : size; // Slightly larger for better visibility\n \n if (model.provider === 'deepseek') {\n return <img src=\"/deepseek.svg\" alt=\"DeepSeek\" width={iconSize} height={iconSize} />;\n }\n if (model.provider === 'mistral') {\n if (model.id === 'mistral-small-latest') {\n return <img src=\"/mistral_small.png\" alt=\"Mistral\" width={iconSize} height={iconSize} />;\n }\n return <img src=\"/ministral.png\" alt=\"Ministral\" width={iconSize} height={iconSize} />;\n }\n if (model.provider === 'openrouter') {\n return <Globe2 size={size} />; // Keep Lucide icon for OpenRouter\n }\n if (model.provider === 'grok') {\n return <img src=\"/grok.svg\" alt=\"Grok\" width={iconSize} height={iconSize} />;\n }\n return null;\n};\n\nconst isReasoningModel = (modelId: AITextModelId): boolean => {\n return modelId.includes('reasoning') || modelId.includes('reasoner');\n};\n\nconst AIPromptInput: React.FC<AIPromptInputProps> = ({\n value,\n onChange,\n onSubmit,\n isSubmitting,\n placeholder,\n helperText,\n initialModelId,\n onModelChange,\n onAttachClick,\n onVoiceClick,\n}) => {\n const models = useMemo<AITextModelOption[]>(() => getEnabledTextModels(), []);\n const defaultId = useMemo<AITextModelId>(() => initialModelId || getDefaultTextModelId(), [initialModelId]);\n const [selectedModel, setSelectedModel] = useState<AITextModelId>(defaultId);\n const [usageStatus, setUsageStatus] = useState<AIUsageStatus>({});\n const [isLoadingUsage, setIsLoadingUsage] = useState(false);\n\n // Define getRemainingToday before using it in useState\n const getRemainingToday = useCallback((modelId: AITextModelId): number => {\n const modelStatus = usageStatus[modelId];\n if (!modelStatus) return 10; // Default fallback\n return modelStatus.unlimited ? -1 : modelStatus.remaining;\n }, [usageStatus]);\n\n const [remaining, setRemaining] = useState<number>(() => getRemainingToday(defaultId));\n\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n const minHeight = 96;\n const maxHeight = 260;\n\n // Clean white styling for AI input\n const bg = useColorModeValue('white', 'gray.800');\n const innerBg = useColorModeValue('gray.50', 'gray.700');\n const border = useColorModeValue('gray.200', 'gray.600');\n const placeholderColor = useColorModeValue('gray.500', 'gray.400');\n const hoverBg = useColorModeValue('gray.100', 'gray.600');\n\n const toast = useToast();\n\n const {\n isOpen: isAttachOpen,\n onOpen: onAttachOpen,\n onClose: onAttachClose,\n } = useDisclosure();\n\n const {\n isOpen: isVoiceOpen,\n onOpen: onVoiceOpen,\n onClose: onVoiceClose,\n } = useDisclosure();\n\n const [ocrFiles, setOcrFiles] = useState<UploadPanelFile[]>([]);\n const [ocrText, setOcrText] = useState('');\n const [isOcrProcessing, setIsOcrProcessing] = useState(false);\n\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const mediaStreamRef = useRef<MediaStream | null>(null);\n const audioChunksRef = useRef<Blob[]>([]);\n const audioContextRef = useRef<AudioContext | null>(null);\n const analyserRef = useRef<AnalyserNode | null>(null);\n const animationFrameRef = useRef<number | null>(null);\n const recordingTimerRef = useRef<number | null>(null);\n const [isRecording, setIsRecording] = useState(false);\n const [isVoiceProcessing, setIsVoiceProcessing] = useState(false);\n const [hasRecording, setHasRecording] = useState(false);\n const [recordingSeconds, setRecordingSeconds] = useState(0);\n const [waveform, setWaveform] = useState<number[]>(() => new Array(32).fill(0));\n\n const adjustHeight = useCallback((reset?: boolean) => {\n const el = textareaRef.current;\n if (!el) return;\n if (reset) {\n el.style.height = `${minHeight}px`;\n return;\n }\n el.style.height = 'auto';\n const next = Math.max(minHeight, Math.min(el.scrollHeight, maxHeight));\n el.style.height = `${next}px`;\n }, []);\n\n useEffect(() => {\n adjustHeight();\n }, [value, adjustHeight]);\n\n useEffect(() => {\n const handleResize = () => adjustHeight();\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [adjustHeight]);\n\n // Fetch usage status on mount and when model changes\n useEffect(() => {\n const fetchUsageStatus = async () => {\n setIsLoadingUsage(true);\n try {\n const status = await getAIUsageStatus();\n setUsageStatus(status);\n } catch (error) {\n console.error('Failed to fetch AI usage status:', error);\n } finally {\n setIsLoadingUsage(false);\n }\n };\n\n fetchUsageStatus();\n }, []);\n\n // Update remaining when usage status or selected model changes\n useEffect(() => {\n setRemaining(getRemainingToday(selectedModel));\n }, [getRemainingToday, selectedModel]);\n\n const getDailyLimit = (modelId: AITextModelId): number => {\n const modelStatus = usageStatus[modelId];\n if (!modelStatus) return 10; // Default fallback\n return modelStatus.limit;\n };\n\n const handleModelChange = (id: AITextModelId) => {\n setSelectedModel(id);\n if (onModelChange) onModelChange(id);\n };\n\n const handleSubmit = async () => {\n const trimmed = value.trim();\n if (!trimmed) return;\n \n // Check remaining requests before submitting\n const modelStatus = usageStatus[selectedModel];\n if (modelStatus && !modelStatus.unlimited && modelStatus.remaining <= 0) {\n toast({\n title: 'Denní limit vyčerpán',\n description: 'Denní limit pro tento AI model byl vyčerpán. Zkuste to znovu zítra.',\n status: 'warning',\n duration: 5000,\n isClosable: true,\n });\n return;\n }\n \n try {\n const maybePromise = onSubmit(trimmed, selectedModel);\n if (maybePromise && typeof (maybePromise as any).then === 'function') {\n await (maybePromise as Promise<unknown>);\n }\n // Refresh usage status after successful submission\n const status = await getAIUsageStatus();\n setUsageStatus(status);\n } catch {\n // Do not decrement usage on error; parent is responsible for showing errors\n }\n };\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (!isSubmitting) {\n handleSubmit();\n }\n }\n };\n\n const selected = findTextModel(selectedModel);\n\n const isDisabled = isSubmitting || !value.trim() || remaining <= 0;\n\n const handleInsertText = (text: string) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n const next = value ? `${value}\\n\\n${trimmed}` : trimmed;\n onChange(next);\n };\n\n const handleOcrUploadFinished = async (uploaded: UploadPanelFile[]) => {\n if (!uploaded || uploaded.length === 0) return;\n const last = uploaded[uploaded.length - 1];\n if (!last?.url) return;\n setIsOcrProcessing(true);\n try {\n const isImage = (last.type || '').startsWith('image/');\n const resp = await processOcrAI({\n document_url: isImage ? '' : last.url,\n image_url: isImage ? last.url : '',\n model: 'mistral-ocr-latest',\n });\n setOcrText(resp.text || '');\n if ((resp.text || '').trim()) {\n handleInsertText(resp.text || '');\n toast({\n title: 'Text z dokumentu byl vložen do AI promptu',\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n } else {\n toast({\n title: 'OCR nenašlo čitelný text',\n status: 'info',\n duration: 3000,\n isClosable: true,\n });\n }\n } catch (err: any) {\n toast({\n title: 'OCR selhalo',\n description: err?.message || 'Zkuste to prosím znovu.',\n status: 'error',\n duration: 4000,\n isClosable: true,\n });\n } finally {\n setIsOcrProcessing(false);\n }\n };\n\n const stopMediaStream = () => {\n if (mediaStreamRef.current) {\n mediaStreamRef.current.getTracks().forEach((t) => t.stop());\n mediaStreamRef.current = null;\n }\n if (animationFrameRef.current !== null) {\n cancelAnimationFrame(animationFrameRef.current);\n animationFrameRef.current = null;\n }\n if (recordingTimerRef.current !== null) {\n window.clearInterval(recordingTimerRef.current);\n recordingTimerRef.current = null;\n }\n if (audioContextRef.current) {\n try {\n audioContextRef.current.close();\n } catch {\n // ignore\n }\n audioContextRef.current = null;\n analyserRef.current = null;\n }\n };\n\n const startRecording = async () => {\n if (isRecording) return;\n if (typeof navigator === 'undefined' || !navigator.mediaDevices?.getUserMedia) {\n toast({\n title: 'Prohlížeč nepodporuje nahrávání zvuku',\n status: 'error',\n duration: 4000,\n isClosable: true,\n });\n return;\n }\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n mediaStreamRef.current = stream;\n audioChunksRef.current = [];\n setRecordingSeconds(0);\n\n try {\n const AudioCtx =\n typeof window !== 'undefined'\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ((window as any).AudioContext || (window as any).webkitAudioContext)\n : null;\n if (AudioCtx) {\n const ctx: AudioContext = audioContextRef.current || new AudioCtx();\n audioContextRef.current = ctx;\n const source = ctx.createMediaStreamSource(stream);\n const analyser = ctx.createAnalyser();\n analyser.fftSize = 256;\n analyserRef.current = analyser;\n source.connect(analyser);\n\n const bufferLength = analyser.frequencyBinCount;\n const dataArray = new Uint8Array(bufferLength);\n\n const tick = () => {\n if (!analyserRef.current) return;\n analyserRef.current.getByteTimeDomainData(dataArray);\n let sum = 0;\n for (let i = 0; i < bufferLength; i += 1) {\n const v = (dataArray[i] - 128) / 128;\n sum += v * v;\n }\n const rms = Math.sqrt(sum / bufferLength);\n const level = Math.max(0, Math.min(1, rms * 4));\n setWaveform((prev) =>\n prev.map((_, idx) => {\n const jitter = 0.2 * Math.sin(Date.now() / 120 + idx);\n const value = level + jitter;\n return Math.max(0.1, Math.min(1, value));\n }),\n );\n animationFrameRef.current = requestAnimationFrame(tick);\n };\n\n if (animationFrameRef.current !== null) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n animationFrameRef.current = requestAnimationFrame(tick);\n }\n } catch {\n // Vizualizace je best-effort, případné chyby ignorujeme\n }\n const recorder = new MediaRecorder(stream);\n mediaRecorderRef.current = recorder;\n\n recorder.ondataavailable = (e) => {\n if (e.data && e.data.size > 0) {\n audioChunksRef.current.push(e.data);\n }\n };\n\n recorder.onstop = () => {\n stopMediaStream();\n setIsRecording(false);\n setHasRecording(audioChunksRef.current.length > 0);\n };\n\n recorder.start();\n setIsRecording(true);\n setHasRecording(false);\n if (recordingTimerRef.current !== null) {\n window.clearInterval(recordingTimerRef.current);\n }\n recordingTimerRef.current = window.setInterval(() => {\n setRecordingSeconds((prev) => prev + 1);\n }, 1000);\n } catch (err: any) {\n toast({\n title: 'Nelze získat přístup k mikrofonu',\n description: err?.message || 'Zkontrolujte oprávnění prohlížeče.',\n status: 'error',\n duration: 4000,\n isClosable: true,\n });\n }\n };\n\n const stopRecording = () => {\n if (!isRecording) return;\n try {\n mediaRecorderRef.current?.stop();\n } catch {\n stopMediaStream();\n setIsRecording(false);\n }\n };\n\n const handleTranscribe = async () => {\n if (!audioChunksRef.current.length) {\n toast({\n title: 'Nejprve nahrajte hlasovou zprávu',\n status: 'info',\n duration: 3000,\n isClosable: true,\n });\n return;\n }\n const blob = new Blob(audioChunksRef.current, { type: 'audio/webm' });\n const file = new File([blob], 'voice-message.webm', { type: 'audio/webm' });\n setIsVoiceProcessing(true);\n try {\n const uploaded = await uploadArticleFile(file as any);\n const resp = await transcribeAudioAI({\n file_url: uploaded.url,\n model: 'voxtral-mini-latest',\n language: 'cs',\n });\n if ((resp.text || '').trim()) {\n handleInsertText(resp.text || '');\n toast({\n title: 'Přepis hlasu vložen do AI promptu',\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n onVoiceClose();\n } else {\n toast({\n title: 'Přepis neobsahuje text',\n status: 'info',\n duration: 3000,\n isClosable: true,\n });\n }\n } catch (err: any) {\n toast({\n title: 'Přepis hlasu selhal',\n description: err?.message || 'Zkuste to prosím znovu.',\n status: 'error',\n duration: 4000,\n isClosable: true,\n });\n } finally {\n setIsVoiceProcessing(false);\n }\n };\n\n return (\n <Box w=\"100%\" py={2}>\n <Box\n bg={bg}\n borderRadius=\"2xl\"\n p={3}\n borderWidth=\"1px\"\n borderColor={border}\n boxShadow={useColorModeValue('sm', 'dark-lg')}\n _hover={{ borderColor: useColorModeValue('gray.300', 'gray.500') }}\n transition=\"all 0.2s ease\"\n >\n <Box position=\"relative\">\n <Flex direction=\"column\">\n <Box overflowY=\"auto\" maxH=\"360px\">\n <Textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={placeholder || 'Napište, s čím má AI pomoci...'}\n resize=\"none\"\n border=\"none\"\n bg={innerBg}\n borderRadius=\"xl\"\n px={4}\n py={3}\n minH={`${minHeight}px`}\n _focusVisible={{ boxShadow: 'none', bg: useColorModeValue('white', 'gray.700') }}\n _placeholder={{ color: placeholderColor }}\n fontSize=\"sm\"\n />\n </Box>\n\n <Box\n h=\"60px\"\n bg={innerBg}\n borderBottomRadius=\"xl\"\n borderTop=\"1px solid\"\n borderColor={border}\n mt={-1}\n _hover={{ bg: hoverBg }}\n transition=\"all 0.2s ease\"\n >\n <Flex\n position=\"absolute\"\n left={3}\n right={3}\n bottom={2}\n align=\"center\"\n justify=\"space-between\"\n >\n <HStack spacing={2} align=\"center\">\n <Menu>\n <MenuButton\n as={IconButton}\n size=\"sm\"\n variant=\"ghost\"\n colorScheme=\"gray\"\n aria-label=\"Vybrat AI model\"\n px={2}\n _hover={{ bg: hoverBg }}\n >\n <AnimatePresence mode=\"wait\">\n <MotionBox\n key={selectedModel}\n display=\"flex\"\n alignItems=\"center\"\n gap={2}\n initial={{ opacity: 0, y: -4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 4 }}\n transition={{ duration: 0.15 }}\n >\n <Box bg=\"blue.50\" p={1} borderRadius=\"md\">\n {getModelIcon(selected, 14)}\n </Box>\n <Text fontSize=\"xs\" fontWeight=\"600\" color=\"gray.700\">\n {selected?.label || 'Model'}\n </Text>\n <FiChevronDown size={12} color=\"gray.500\" />\n </MotionBox>\n </AnimatePresence>\n </MenuButton>\n <MenuList fontSize=\"sm\" zIndex={1500}>\n {models.map((model) => {\n const rem = getRemainingToday(model.id as AITextModelId);\n return (\n <MenuItem\n key={model.id}\n onClick={() => handleModelChange(model.id)}\n >\n <HStack justify=\"space-between\" w=\"100%\" spacing={3}>\n <Box>\n <HStack spacing={2} align=\"center\">\n <Box bg=\"gray.50\" p={1} borderRadius=\"md\">\n {getModelIcon(model, 16)}\n </Box>\n <Text fontWeight=\"600\" color=\"gray.800\">{model.label}</Text>\n </HStack>\n {model.description && (\n <Text fontSize=\"xs\" color=\"gray.600\" mt={1}>\n {model.description}\n </Text>\n )}\n {isReasoningModel(model.id) && (\n <Text fontSize=\"xs\" color=\"blue.600\" mt={1} fontWeight=\"medium\">\n Reasoning model - přemýšlí před odpovědí\n </Text>\n )}\n </Box>\n <HStack spacing={2} align=\"center\">\n {isLoadingUsage ? (\n <Spinner size=\"xs\" color=\"gray.500\" />\n ) : (\n <Text fontSize=\"xs\" color=\"gray.600\" fontWeight=\"500\">\n {model.provider === 'deepseek' ? '∞' : `${Math.max(0, rem)}/${getDailyLimit(model.id)}`}\n </Text>\n )}\n {selectedModel === model.id && (\n <Box bg=\"green.100\" p={1} borderRadius=\"full\">\n <FiCheck size={12} color=\"green.600\" />\n </Box>\n )}\n </HStack>\n </HStack>\n </MenuItem>\n );\n })}\n </MenuList>\n </Menu>\n\n <Box h=\"4\" w=\"1px\" bg={border} mx={1} />\n\n {/* Reasoning model warning */}\n {isReasoningModel(selectedModel) && (\n <Tooltip label=\"Reasoning modely přemýšlí nad odpovědí - poskytují hlubší analýzu, ale mohou trvat déle\">\n <Text fontSize=\"xs\" color=\"blue.600\" px={2} py={1} bg=\"blue.50\" borderRadius=\"md\" fontWeight=\"medium\">\n Reasoning\n </Text>\n </Tooltip>\n )}\n\n <Tooltip label=\"Přiložit soubor (obrázek / PDF)\">\n <IconButton\n aria-label=\"Přiložit soubor\"\n icon={<FiPaperclip />}\n size=\"sm\"\n variant=\"ghost\"\n colorScheme=\"gray\"\n _hover={{ bg: hoverBg }}\n onClick={() => {\n if (onAttachClick) {\n onAttachClick();\n } else {\n setOcrFiles([]);\n setOcrText('');\n onAttachOpen();\n }\n }}\n />\n </Tooltip>\n\n <Tooltip label=\"Nahrát hlas pro přepis\">\n <IconButton\n aria-label=\"Nahrát hlas\"\n icon={<FiMic />}\n size=\"sm\"\n variant=\"ghost\"\n colorScheme=\"gray\"\n _hover={{ bg: hoverBg }}\n onClick={() => {\n if (onVoiceClick) {\n onVoiceClick();\n } else {\n audioChunksRef.current = [];\n setHasRecording(false);\n setIsVoiceProcessing(false);\n onVoiceOpen();\n }\n }}\n />\n </Tooltip>\n\n {helperText && (\n <Text fontSize=\"xs\" color=\"gray.500\" ml={2} noOfLines={1}>\n {helperText}\n </Text>\n )}\n </HStack>\n\n <HStack spacing={3} align=\"center\">\n {isLoadingUsage ? (\n <Spinner size=\"xs\" color=\"gray.500\" />\n ) : (\n <Text fontSize=\"xs\" color=\"gray.600\" fontWeight=\"500\">\n {selected?.provider === 'deepseek' ? '∞' : `Zbývá ${getDailyLimit(selectedModel) === Infinity ? '∞' : `${remaining}/${getDailyLimit(selectedModel)}`}`}\n </Text>\n )}\n <Tooltip\n label={\n remaining <= 0\n ? 'Denní limit pro tento model byl vyčerpán.'\n : 'Odeslat (Enter). Shift+Enter vloží nový řádek.'\n }\n >\n <span>\n <IconButton\n aria-label=\"Odeslat AI požadavek\"\n icon={<FiSend />}\n size=\"sm\"\n variant=\"ghost\"\n colorScheme=\"blue\"\n _hover={{ bg: 'blue.50' }}\n isLoading={isSubmitting && !isLoadingUsage}\n isDisabled={isDisabled}\n onClick={handleSubmit}\n />\n </span>\n </Tooltip>\n </HStack>\n </Flex>\n </Box>\n </Flex>\n </Box>\n </Box>\n\n <Modal isOpen={isAttachOpen} onClose={onAttachClose} isCentered size=\"lg\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Přiložit soubor pro OCR</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <UploadPanel\n label=\"Soubor pro AI (PDF / obrázek)\"\n description=\"Nahrajte dokument nebo obrázek, ze kterého má AI přečíst text.\"\n value={ocrFiles}\n onChange={setOcrFiles}\n accept=\"application/pdf,image/*\"\n maxFiles={1}\n onUploadFinished={handleOcrUploadFinished}\n />\n {isOcrProcessing && (\n <HStack mt={4} spacing={2} align=\"center\">\n <Spinner size=\"sm\" />\n <Text fontSize=\"sm\">Probíhá zpracování textu…</Text>\n </HStack>\n )}\n {!!ocrText && !isOcrProcessing && (\n <Box mt={4}>\n <Text fontSize=\"sm\" fontWeight=\"semibold\" mb={2}>\n Rozpoznaný text\n </Text>\n <Box\n borderWidth=\"1px\"\n borderRadius=\"md\"\n borderColor={border}\n bg={innerBg}\n p={3}\n maxH=\"200px\"\n overflowY=\"auto\"\n fontSize=\"sm\"\n whiteSpace=\"pre-wrap\"\n >\n {ocrText}\n </Box>\n </Box>\n )}\n </ModalBody>\n <ModalFooter>\n <HStack spacing={3}>\n <Button variant=\"ghost\" onClick={onAttachClose}>\n Zavřít\n </Button>\n </HStack>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n <Modal isOpen={isVoiceOpen} onClose={() => {\n if (isRecording) {\n stopRecording();\n }\n onVoiceClose();\n }} isCentered size=\"md\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Hlasový vstup pro AI</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <Text fontSize=\"sm\" mb={3}>\n Nahrajte krátkou hlasovou zprávu, kterou AI přepíše do textu a vloží do promptu.\n </Text>\n <HStack spacing={4} align=\"center\">\n <Button\n onClick={isRecording ? stopRecording : startRecording}\n isDisabled={isVoiceProcessing}\n bg={isRecording ? 'red.500' : 'blackAlpha.700'}\n color=\"white\"\n _hover={{\n bg: isRecording ? 'red.600' : 'blackAlpha.800',\n }}\n _active={{\n bg: isRecording ? 'red.700' : 'blackAlpha.900',\n }}\n >\n {isRecording ? 'Zastavit nahrávání' : 'Začít nahrávat'}\n </Button>\n {hasRecording && !isRecording && (\n <Text fontSize=\"sm\" color=\"green.500\">\n Nahrávka je připravena k přepisu.\n </Text>\n )}\n </HStack>\n {isRecording && (\n <Box mt={4}>\n <HStack justify=\"space-between\" mb={1}>\n <Text fontSize=\"xs\" color=\"gray.500\">\n Nahrávání…\n </Text>\n <Text fontSize=\"xs\" fontFamily=\"mono\" color=\"gray.600\">\n {`${String(Math.floor(recordingSeconds / 60)).padStart(2, '0')}:${String(\n recordingSeconds % 60,\n ).padStart(2, '0')}`}\n </Text>\n </HStack>\n <HStack spacing={1} align=\"flex-end\" h=\"40px\">\n {waveform.map((value, idx) => (\n <Box\n key={idx}\n w=\"2px\"\n borderRadius=\"full\"\n bg=\"green.400\"\n h={`${Math.max(8, value * 100)}%`}\n />\n ))}\n </HStack>\n </Box>\n )}\n {isVoiceProcessing && (\n <HStack mt={4} spacing={2} align=\"center\">\n <Spinner size=\"sm\" />\n <Text fontSize=\"sm\">Probíhá přepis hlasu…</Text>\n </HStack>\n )}\n </ModalBody>\n <ModalFooter>\n <HStack spacing={3}>\n <Button\n onClick={handleTranscribe}\n isDisabled={!hasRecording || isRecording || isVoiceProcessing}\n isLoading={isVoiceProcessing}\n bg=\"blackAlpha.800\"\n color=\"white\"\n _hover={{ bg: 'blackAlpha.900' }}\n _active={{ bg: 'blackAlpha.900' }}\n >\n Přepsat a vložit do promptu\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => {\n if (isRecording) {\n stopRecording();\n }\n onVoiceClose();\n }}\n >\n Zavřít\n </Button>\n </HStack>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </Box>\n );\n};\n\nexport default AIPromptInput;\n","import { useState, useEffect } from 'react';\nimport {\n Box,\n Table,\n Thead,\n Tbody,\n Tr,\n Th,\n Td,\n Button,\n useDisclosure,\n useToast,\n Badge,\n IconButton,\n Menu,\n MenuButton,\n MenuList,\n MenuItem,\n useColorModeValue,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalFooter,\n ModalBody,\n ModalCloseButton,\n FormControl,\n FormLabel,\n Input,\n Select,\n VStack,\n HStack,\n Text,\n Switch,\n Checkbox,\n FormHelperText,\n Heading,\n Spinner,\n Alert,\n AlertIcon,\n AlertTitle,\n AlertDescription,\n} from '@chakra-ui/react';\nimport { AddIcon, DeleteIcon, EditIcon, HamburgerIcon } from '@chakra-ui/icons';\nimport { useAuth } from '../../contexts/AuthContext';\nimport { useConfirmDialog } from '../../contexts/ConfirmDialogContext';\nimport api from '../../services/api';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport { getAllNavigationItems, NavigationItem as AdminNavItem, updateNavigationItem } from '../../services/navigation';\nimport { PasswordHelpTooltip, HelpTooltipCard } from '../../components/common/HelpTooltipCard';\n\ninterface User {\n id: string;\n email: string;\n name: string;\n role: 'admin' | 'editor' | 'fan';\n isActive: boolean;\n createdAt: string;\n}\n\nconst UsersAdminPage = () => {\n const [users, setUsers] = useState<User[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const { isOpen, onOpen, onClose } = useDisclosure();\n const [selectedUser, setSelectedUser] = useState<User | null>(null);\n const [formData, setFormData] = useState({\n name: '',\n email: '',\n password: '',\n currentPassword: '',\n role: 'editor' as 'admin' | 'editor' | 'fan',\n isActive: true,\n });\n const toast = useToast();\n const bgColor = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const { user: authUser } = useAuth();\n const { confirm } = useConfirmDialog();\n const [editorPages, setEditorPages] = useState<AdminNavItem[]>([]);\n const [loadingEditorPages, setLoadingEditorPages] = useState<boolean>(false);\n const [savingEditorPageId, setSavingEditorPageId] = useState<number | null>(null);\n\n const fetchUsers = async () => {\n try {\n const response = await api.get('/admin/users');\n setUsers(response.data);\n } catch (error) {\n console.error('Error fetching users:', error);\n toast({\n title: 'Chyba',\n description: 'Nepodařilo se načíst uživatele',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n } finally {\n setIsLoading(false);\n }\n };\n\n const loadEditorPages = async () => {\n try {\n setLoadingEditorPages(true);\n const nav = await getAllNavigationItems();\n\n // Všechny admin položky (včetně dropdown kategorií)\n const adminRoots = (nav || []).filter(item => item.requires_admin);\n\n // Zploštěný seznam admin stránek: všechny ne-dropdown položky (kořenové i děti)\n const flattened: AdminNavItem[] = [];\n for (const root of adminRoots) {\n if (root.type !== 'dropdown') {\n flattened.push(root);\n }\n if (Array.isArray(root.children)) {\n for (const ch of root.children) {\n if (ch.requires_admin && ch.type !== 'dropdown') {\n flattened.push(ch);\n }\n }\n }\n }\n\n setEditorPages(flattened);\n } catch (error: any) {\n console.error('Error fetching editor pages:', error);\n toast({\n title: 'Chyba',\n description: 'Nepodařilo se načíst seznam stránek pro editory',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n } finally {\n setLoadingEditorPages(false);\n }\n };\n\n useEffect(() => {\n fetchUsers();\n loadEditorPages();\n }, []);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>) => {\n const { name, value } = e.target;\n setFormData(prev => ({\n ...prev,\n [name]: name === 'isActive' ? (e.target as HTMLInputElement).checked : value\n }));\n };\n\n const handleToggleEditorPage = async (item: AdminNavItem) => {\n if (!item.id) return;\n const newValue = !item.allow_editor;\n setSavingEditorPageId(item.id);\n try {\n await updateNavigationItem(item.id, { allow_editor: newValue });\n setEditorPages(prev =>\n prev.map(it => (it.id === item.id ? { ...it, allow_editor: newValue } : it))\n );\n toast({\n title: 'Uloženo',\n description: newValue\n ? 'Stránka byla povolena editorům.'\n : 'Stránka byla editorům zakázána.',\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n } catch (error: any) {\n console.error('Error updating editor page access:', error);\n toast({\n title: 'Chyba',\n description:\n error?.response?.data?.error ||\n error?.response?.data?.message ||\n 'Nepodařilo se uložit nastavení přístupu editorů',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n } finally {\n setSavingEditorPageId(null);\n }\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setIsSubmitting(true);\n\n try {\n if (selectedUser) {\n // Update existing user\n // If editing an admin account, require current password confirmation\n const payload: any = {\n name: formData.name,\n email: formData.email,\n role: formData.role,\n isActive: formData.isActive,\n };\n if (selectedUser.role === 'admin') {\n if (!formData.currentPassword) {\n throw new Error('Pro úpravu administrátorského účtu zadejte prosím současné heslo.');\n }\n payload.current_password = formData.currentPassword;\n }\n await api.put(`/admin/users/${selectedUser.id}`, payload);\n toast({\n title: 'Hotovo',\n description: 'Uživatel aktualizován',\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n } else {\n // Create new user\n await api.post('/admin/users', formData);\n toast({\n title: 'Hotovo',\n description: 'Uživatel vytvořen',\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n }\n onClose();\n fetchUsers();\n resetForm();\n } catch (error: any) {\n console.error('Error saving user:', error);\n toast({\n title: 'Chyba',\n description: error.response?.data?.error || error.response?.data?.message || 'Nepodařilo se uložit uživatele',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleDelete = async (userId: string) => {\n const u = users.find(x => x.id === userId);\n if (u?.role === 'admin') {\n toast({ title: 'Zakázáno', description: 'Admin uživatele nelze smazat.', status: 'warning' });\n return;\n }\n if (authUser && String(authUser.id) === String(userId)) {\n toast({ title: 'Zakázáno', description: 'Nemůžete smazat sám sebe.', status: 'warning' });\n return;\n }\n const ok = await confirm({\n title: 'Smazat uživatele',\n message: 'Opravdu smazat tohoto uživatele?',\n confirmText: 'Smazat',\n cancelText: 'Zrušit',\n isDanger: true,\n });\n if (!ok) return;\n try {\n await api.delete(`/admin/users/${userId}`);\n toast({\n title: 'Hotovo',\n description: 'Uživatel smazán',\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n fetchUsers();\n } catch (error: any) {\n console.error('Error deleting user:', error);\n toast({\n title: 'Chyba',\n description: error.response?.data?.error || error.response?.data?.message || 'Nepodařilo se smazat uživatele',\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n }\n };\n\n const resetForm = () => {\n setFormData({\n name: '',\n email: '',\n password: '',\n currentPassword: '',\n role: 'editor',\n isActive: true,\n });\n setSelectedUser(null);\n };\n\n const openEditModal = (user: User) => {\n setSelectedUser(user);\n setFormData({\n name: user.name,\n email: user.email,\n password: '',\n currentPassword: '',\n role: user.role,\n isActive: user.isActive,\n });\n onOpen();\n };\n\n const openCreateModal = () => {\n resetForm();\n onOpen();\n };\n\n return (\n <AdminLayout>\n <Box>\n <HStack justify=\"space-between\" mb={4}>\n <Heading size=\"lg\">Správa uživatelů</Heading>\n <Button leftIcon={<AddIcon />} colorScheme=\"blue\" onClick={openCreateModal}>\n Přidat uživatele\n </Button>\n </HStack>\n <Text color=\"gray.500\" mb={6}>\n Správa uživatelských účtů a jejich oprávnění. <strong>Editor</strong> může vytvářet a upravovat články a aktivity. <strong>Admin</strong> má přístup ke všem funkcím.\n </Text>\n\n <Heading size=\"md\" mb={2}>Admini a editoři</Heading>\n <Box bg={bgColor} borderRadius=\"md\" boxShadow=\"sm\" overflowX=\"auto\" mb={8}>\n <Table variant=\"simple\">\n <Thead>\n <Tr>\n <Th>Jméno</Th>\n <Th>Email</Th>\n <Th>Role</Th>\n <Th>Stav</Th>\n <Th>Vytvořeno</Th>\n <Th>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {users.filter(u => u.role !== 'fan').map((user) => (\n <Tr key={user.id}>\n <Td>{user.name}</Td>\n <Td>{user.email}</Td>\n <Td>\n <Badge colorScheme={user.role === 'admin' ? 'purple' : 'blue'}>\n {user.role === 'admin' ? 'Admin' : 'Editor'}\n </Badge>\n </Td>\n <Td>\n <Badge colorScheme={user.isActive ? 'green' : 'red'}>\n {user.isActive ? 'Aktivní' : 'Neaktivní'}\n </Badge>\n </Td>\n <Td>{new Date(user.createdAt).toLocaleDateString()}</Td>\n <Td>\n <Menu>\n <MenuButton\n as={IconButton}\n aria-label=\"Options\"\n icon={<HamburgerIcon />}\n size=\"sm\"\n variant=\"ghost\"\n />\n <MenuList>\n <MenuItem icon={<EditIcon />} onClick={() => openEditModal(user)}>\n Upravit\n </MenuItem>\n <MenuItem onClick={async () => {\n try {\n await api.post(`/admin/users/${user.id}/reset-password`);\n toast({ title: 'Hotovo', description: 'Instrukce pro obnovení hesla byly odeslány.', status: 'success' });\n } catch (e: any) {\n const errorMsg = e?.response?.data?.message || e?.response?.data?.error || e?.message || 'Nelze odeslat reset hesla';\n const errorDetails = e?.response?.data?.details;\n toast({ title: 'Chyba při odesílání resetu hesla', description: errorDetails ? `${errorMsg}\\n\\n${errorDetails}` : errorMsg, status: 'error', duration: 10000, isClosable: true });\n }\n }}>\n Odeslat reset hesla\n </MenuItem>\n {user.role !== 'admin' && String(authUser?.id) !== String(user.id) && (\n <MenuItem icon={<DeleteIcon />} color=\"red.500\" onClick={() => handleDelete(user.id)}>\n Smazat\n </MenuItem>\n )}\n </MenuList>\n </Menu>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n\n <Heading size=\"md\" mb={2}>Fanoušci</Heading>\n <Box bg={bgColor} borderRadius=\"md\" boxShadow=\"sm\" overflowX=\"auto\">\n <Table variant=\"simple\">\n <Thead>\n <Tr>\n <Th>Jméno</Th>\n <Th>Email</Th>\n <Th>Role</Th>\n <Th>Stav</Th>\n <Th>Vytvořeno</Th>\n <Th>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {users.filter(u => u.role === 'fan').map((user) => (\n <Tr key={user.id}>\n <Td>{user.name}</Td>\n <Td>{user.email}</Td>\n <Td>\n <Badge colorScheme={'gray'}>\n Fanoušek\n </Badge>\n </Td>\n <Td>\n <Badge colorScheme={user.isActive ? 'green' : 'red'}>\n {user.isActive ? 'Aktivní' : 'Neaktivní'}\n </Badge>\n </Td>\n <Td>{new Date(user.createdAt).toLocaleDateString()}</Td>\n <Td>\n <Menu>\n <MenuButton\n as={IconButton}\n aria-label=\"Options\"\n icon={<HamburgerIcon />}\n size=\"sm\"\n variant=\"ghost\"\n />\n <MenuList>\n <MenuItem icon={<EditIcon />} onClick={() => openEditModal(user)}>\n Upravit\n </MenuItem>\n {String(authUser?.id) !== String(user.id) && (\n <MenuItem icon={<DeleteIcon />} color=\"red.500\" onClick={() => handleDelete(user.id)}>\n Smazat\n </MenuItem>\n )}\n </MenuList>\n </Menu>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n\n <Modal isOpen={isOpen} onClose={onClose} size=\"lg\">\n <ModalOverlay />\n <ModalContent as=\"form\" onSubmit={handleSubmit}>\n <ModalHeader>\n {selectedUser ? 'Upravit uživatele' : 'Přidat uživatele'}\n </ModalHeader>\n <ModalCloseButton />\n <ModalBody pb={6}>\n <VStack spacing={4}>\n <FormControl isRequired>\n <FormLabel>Jméno a příjmení</FormLabel>\n <Input\n name=\"name\"\n value={formData.name}\n onChange={handleInputChange}\n placeholder=\"Zadejte jméno a příjmení\"\n />\n </FormControl>\n\n <FormControl isRequired>\n <FormLabel>Email</FormLabel>\n <Input\n type=\"email\"\n name=\"email\"\n value={formData.email}\n onChange={handleInputChange}\n placeholder=\"Zadejte email\"\n />\n </FormControl>\n\n {!selectedUser && (\n <FormControl isRequired={!selectedUser}>\n <FormLabel display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n <Box>Heslo</Box>\n <PasswordHelpTooltip />\n </FormLabel>\n <Input\n type=\"password\"\n name=\"password\"\n value={formData.password}\n onChange={handleInputChange}\n placeholder=\"Zadejte heslo\"\n minLength={8}\n />\n <FormHelperText>\n Heslo musí mít alespoň 8 znaků\n </FormHelperText>\n </FormControl>\n )}\n\n {selectedUser && selectedUser.role === 'admin' && (\n <FormControl>\n <FormLabel>Současné heslo (potvrzení)</FormLabel>\n <Input\n type=\"password\"\n name=\"currentPassword\"\n value={formData.currentPassword}\n onChange={handleInputChange}\n placeholder=\"Zadejte současné heslo administrátora\"\n />\n <FormHelperText>Pro úpravu administrátorského účtu je nutné zadat současné heslo.</FormHelperText>\n </FormControl>\n )}\n\n <FormControl>\n <FormLabel>Role</FormLabel>\n <Select\n name=\"role\"\n value={formData.role}\n onChange={handleInputChange}\n >\n <option value=\"fan\">Fanoušek</option>\n <option value=\"editor\" disabled={!!selectedUser && selectedUser.role === 'admin'}>Editor</option>\n <option value=\"admin\">Admin</option>\n </Select>\n {selectedUser?.role === 'admin' && (\n <FormHelperText>Administrátorský účet nelze degradovat na editora přes tuto obrazovku.</FormHelperText>\n )}\n </FormControl>\n\n {formData.role === 'editor' && (\n <Box w=\"100%\" borderWidth=\"1px\" borderRadius=\"md\" borderColor={borderColor} p={3} mt={2}>\n <HStack justify=\"space-between\" align=\"center\" mb={1}>\n <Text fontSize=\"sm\" fontWeight=\"semibold\">\n Přístup editorů k administraci\n </Text>\n <HelpTooltipCard\n label=\"Jak funguje přístup\"\n title=\"Přístup editorů k administraci\"\n items={[\n 'Nastavení platí pro všechny uživatele s rolí editor ne pro jednotlivce.',\n 'Editor uvidí pouze ty admin stránky, které jsou v seznamu níže povolené.',\n 'Citlivé sekce (např. Nastavení, Uživatelé) ponechte typicky pouze pro administrátory.',\n ]}\n />\n </HStack>\n <Text fontSize=\"xs\" color=\"gray.500\" mb={2}>\n Toto nastavení platí pro všechny uživatele s rolí <strong>editor</strong>. Zvolte, které stránky v administraci mají být editorům dostupné.\n </Text>\n {loadingEditorPages ? (\n <HStack spacing={2}>\n <Spinner size=\"xs\" />\n <Text fontSize=\"xs\" color=\"gray.500\">\n Načítání seznamu stránek…\n </Text>\n </HStack>\n ) : editorPages.length === 0 ? (\n <Text fontSize=\"xs\" color=\"gray.500\">\n Nebyly nalezeny žádné admin stránky v navigaci. Nastavte je prosím v sekci <strong>Navigace</strong>.\n </Text>\n ) : (\n <VStack align=\"stretch\" maxH=\"200px\" overflowY=\"auto\" spacing={1} mt={1}>\n {editorPages\n .slice()\n .sort((a, b) => (a.display_order ?? 0) - (b.display_order ?? 0))\n .map((item) => (\n <Checkbox\n key={item.id}\n isChecked={!!item.allow_editor}\n onChange={() => handleToggleEditorPage(item)}\n isDisabled={savingEditorPageId === item.id}\n size=\"sm\"\n >\n <HStack spacing={2} align=\"center\">\n <Text fontSize=\"sm\">{item.label}</Text>\n {item.page_type && (\n <Badge colorScheme=\"purple\" fontSize=\"0.6rem\">\n {item.page_type}\n </Badge>\n )}\n <Text fontSize=\"xs\" color=\"gray.500\">\n {item.url || '—'}\n </Text>\n </HStack>\n </Checkbox>\n ))}\n </VStack>\n )}\n </Box>\n )}\n\n <FormControl display=\"flex\" alignItems=\"center\">\n <FormLabel mb=\"0\" mr={2}>\n Aktivní\n </FormLabel>\n <Switch\n name=\"isActive\"\n isChecked={formData.isActive}\n onChange={handleInputChange}\n colorScheme=\"blue\"\n />\n </FormControl>\n </VStack>\n </ModalBody>\n\n <ModalFooter>\n <Button variant=\"ghost\" mr={3} onClick={onClose}>\n Zrušit\n </Button>\n <Button\n colorScheme=\"blue\"\n type=\"submit\"\n isLoading={isSubmitting}\n loadingText=\"Ukládám...\"\n >\n {selectedUser ? 'Uložit' : 'Vytvořit'}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n </Box>\n </AdminLayout>\n );\n};\n\n// ... (rest of the code remains the same)\n\nexport default UsersAdminPage;\n","/**\n * Enhanced logo management system with local caching and logoapi integration\n */\n\n// IndexedDB setup for logo caching\nconst DB_NAME = 'LogoCache';\nconst DB_VERSION = 1;\nconst STORE_NAME = 'logos';\nconst CACHE_DURATION = 7 * 24 * 60 * 60 * 1000; // 7 days\n\ninterface CachedLogo {\n id: string;\n url: string;\n blob?: Blob;\n timestamp: number;\n source: 'logoapi' | 'facr' | 'upload';\n lastUsed: number;\n}\n\nlet dbPromise: Promise<IDBDatabase> | null = null;\n\nconst initDB = (): Promise<IDBDatabase> => {\n if (dbPromise) return dbPromise;\n \n dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n \n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve(request.result);\n \n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const store = db.createObjectStore(STORE_NAME, { keyPath: 'id' });\n store.createIndex('lastUsed', 'lastUsed', { unique: false });\n store.createIndex('source', 'source', { unique: false });\n }\n };\n });\n \n return dbPromise;\n};\n\n/**\n * Get logo from cache\n */\nconst getCachedLogo = async (id: string): Promise<CachedLogo | null> => {\n try {\n const db = await initDB();\n const tx = db.transaction(STORE_NAME, 'readonly');\n const store = tx.objectStore(STORE_NAME);\n \n return new Promise((resolve) => {\n const request = store.get(id);\n request.onsuccess = () => {\n const logo = request.result as CachedLogo | undefined;\n if (!logo) {\n resolve(null);\n return;\n }\n \n // Check if cache is still valid\n const now = Date.now();\n if (now - logo.timestamp > CACHE_DURATION) {\n resolve(null);\n return;\n }\n \n resolve(logo);\n };\n request.onerror = () => resolve(null);\n });\n } catch {\n return null;\n }\n};\n\n/**\n * Save logo to cache\n */\nconst saveCachedLogo = async (logo: CachedLogo): Promise<void> => {\n try {\n const db = await initDB();\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n store.put(logo);\n await new Promise<void>((resolve, reject) => {\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n } catch (e) {\n console.warn('Failed to cache logo:', e);\n }\n};\n\n/**\n * Update last used timestamp\n */\nconst updateLastUsed = async (id: string): Promise<void> => {\n try {\n const cached = await getCachedLogo(id);\n if (cached) {\n cached.lastUsed = Date.now();\n await saveCachedLogo(cached);\n }\n } catch {}\n};\n\n/**\n * Clean up unused logos from cache\n */\nexport const cleanupUnusedLogos = async (): Promise<void> => {\n try {\n const db = await initDB();\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const index = store.index('lastUsed');\n \n const now = Date.now();\n const threshold = now - (30 * 24 * 60 * 60 * 1000); // 30 days\n \n const request = index.openCursor();\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest).result;\n if (cursor) {\n const logo = cursor.value as CachedLogo;\n if (logo.lastUsed < threshold) {\n cursor.delete();\n }\n cursor.continue();\n }\n };\n } catch (e) {\n console.warn('Failed to cleanup logos:', e);\n }\n};\n\n/**\n * Optimize SVG by removing whitespace and fixing viewBox\n * This aggressively removes padding/empty space around logos\n */\nconst optimizeSVG = async (svgUrl: string): Promise<string> => {\n try {\n const response = await fetch(svgUrl);\n if (!response.ok) return svgUrl;\n \n let svgText = await response.text();\n \n // Parse SVG to manipulate it\n const parser = new DOMParser();\n const doc = parser.parseFromString(svgText, 'image/svg+xml');\n const svg = doc.documentElement as unknown as SVGSVGElement;\n \n // Remove XML declarations and comments\n svgText = svgText.replace(/<\\?xml[^?]*\\?>/g, '');\n svgText = svgText.replace(/<!--[\\s\\S]*?-->/g, '');\n \n // Create a temporary SVG in the DOM to get proper bounding box\n if (typeof document !== 'undefined') {\n const tempSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n tempSvg.innerHTML = svg.innerHTML;\n tempSvg.style.position = 'absolute';\n tempSvg.style.visibility = 'hidden';\n tempSvg.style.width = '1000px';\n tempSvg.style.height = '1000px';\n document.body.appendChild(tempSvg);\n \n try {\n // Get bounding box of all content\n const bbox = tempSvg.getBBox();\n if (bbox && bbox.width > 0 && bbox.height > 0) {\n // Add minimal padding (2% of size) for visual comfort\n const padding = Math.max(bbox.width, bbox.height) * 0.02;\n const x = bbox.x - padding;\n const y = bbox.y - padding;\n const width = bbox.width + (padding * 2);\n const height = bbox.height + (padding * 2);\n \n // Set viewBox to the actual content bounds (removes empty space)\n svg.setAttribute('viewBox', `${x} ${y} ${width} ${height}`);\n svg.removeAttribute('width');\n svg.removeAttribute('height');\n \n // Ensure preserveAspectRatio is set correctly\n svg.setAttribute('preserveAspectRatio', 'xMidYMid meet');\n }\n } catch (e) {\n // getBBox can fail in some cases, try alternative approach\n console.warn('getBBox failed, using fallback optimization:', e);\n // Fallback: just ensure preserveAspectRatio is correct\n svg.setAttribute('preserveAspectRatio', 'xMidYMid meet');\n svg.removeAttribute('width');\n svg.removeAttribute('height');\n } finally {\n document.body.removeChild(tempSvg);\n }\n \n // Serialize back to string\n const serializer = new XMLSerializer();\n svgText = serializer.serializeToString(svg);\n }\n \n // Create a data URL from the optimized SVG\n const blob = new Blob([svgText], { type: 'image/svg+xml' });\n return URL.createObjectURL(blob);\n } catch (e) {\n console.warn('Failed to optimize SVG:', e);\n return svgUrl;\n }\n};\n\n// Circuit breaker state for logo API requests\nlet circuitBreakerState = {\n failures: 0,\n lastFailureTime: 0,\n isOpen: false,\n maxFailures: 5,\n resetTimeout: 60000, // 1 minute\n};\n\n/**\n * Check if circuit breaker is open\n */\nconst isCircuitBreakerOpen = (): boolean => {\n const now = Date.now();\n if (circuitBreakerState.isOpen && now - circuitBreakerState.lastFailureTime > circuitBreakerState.resetTimeout) {\n // Reset circuit breaker\n circuitBreakerState.isOpen = false;\n circuitBreakerState.failures = 0;\n return false;\n }\n return circuitBreakerState.isOpen;\n};\n\n/**\n * Record circuit breaker failure\n */\nconst recordCircuitBreakerFailure = (): void => {\n circuitBreakerState.failures++;\n circuitBreakerState.lastFailureTime = Date.now();\n if (circuitBreakerState.failures >= circuitBreakerState.maxFailures) {\n circuitBreakerState.isOpen = true;\n console.warn('Logo API circuit breaker opened due to repeated failures');\n }\n};\n\n/**\n * Record circuit breaker success\n */\nconst recordCircuitBreakerSuccess = (): void => {\n if (circuitBreakerState.failures > 0) {\n circuitBreakerState.failures = Math.max(0, circuitBreakerState.failures - 1);\n }\n};\n\n/**\n * Fetch logo from logoapi.sportcreative.eu with optimization and circuit breaker\n */\nexport const fetchLogoFromLogoAPI = async (teamId: string, teamName?: string): Promise<string | null> => {\n // Check circuit breaker first\n if (isCircuitBreakerOpen()) {\n console.warn(`Logo API circuit breaker is open, skipping request for team ${teamId}`);\n return null;\n }\n \n try {\n // Check cache first\n const cached = await getCachedLogo(teamId);\n if (cached?.url && !cached.url.startsWith('blob:')) {\n await updateLastUsed(teamId);\n return cached.url;\n }\n \n // Fetch from logoapi with timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000); // 5 second timeout\n \n const res = await fetch(`https://logoapi.sportcreative.eu/logos/${teamId}/json`, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n \n clearTimeout(timeoutId);\n \n if (!res.ok) {\n recordCircuitBreakerFailure();\n return null;\n }\n \n const data = await res.json();\n const url = data.logo_url_svg || data.logo_url_png || data.logo_url;\n \n if (!url) {\n recordCircuitBreakerFailure();\n return null;\n }\n \n // Cache the logo\n await saveCachedLogo({\n id: teamId,\n url,\n timestamp: Date.now(),\n source: 'logoapi',\n lastUsed: Date.now(),\n });\n \n recordCircuitBreakerSuccess();\n return url;\n } catch (e) {\n recordCircuitBreakerFailure();\n console.warn(`Failed to fetch logo for team ${teamId}:`, e);\n return null;\n }\n};\n\n/**\n * Fetch club name and logo from logoapi.sportcreative.eu\n */\nexport const fetchClubNameAndLogoFromAPI = async (teamId: string): Promise<{ clubName?: string; logoUrl?: string } | null> => {\n try {\n // Fetch from logoapi\n const res = await fetch(`https://logoapi.sportcreative.eu/logos/${teamId}/json`, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n });\n \n if (!res.ok) return null;\n \n const data = await res.json();\n const logoUrl = data.logo_url_svg || data.logo_url_png || data.logo_url;\n const clubName = data.club_name;\n \n if (!logoUrl && !clubName) return null;\n \n // Cache the logo if available\n if (logoUrl) {\n await saveCachedLogo({\n id: teamId,\n url: logoUrl,\n timestamp: Date.now(),\n source: 'logoapi',\n lastUsed: Date.now(),\n });\n }\n \n return {\n clubName: clubName || undefined,\n logoUrl: logoUrl || undefined,\n };\n } catch (e) {\n console.warn(`Failed to fetch club info for team ${teamId}:`, e);\n return null;\n }\n};\n\n// Request monitoring for logo API\nlet requestStats = {\n totalRequests: 0,\n successfulRequests: 0,\n failedRequests: 0,\n lastResetTime: Date.now(),\n windowMs: 60000, // 1 minute window\n};\n\n/**\n * Get current request statistics\n */\nexport const getLogoAPIRequestStats = () => {\n const now = Date.now();\n if (now - requestStats.lastResetTime > requestStats.windowMs) {\n // Reset stats if window expired\n requestStats = {\n totalRequests: 0,\n successfulRequests: 0,\n failedRequests: 0,\n lastResetTime: now,\n windowMs: requestStats.windowMs,\n };\n }\n return { ...requestStats };\n};\n\n/**\n * Track a logo API request\n */\nconst trackRequest = (success: boolean): void => {\n requestStats.totalRequests++;\n if (success) {\n requestStats.successfulRequests++;\n } else {\n requestStats.failedRequests++;\n }\n \n // Log warning if too many requests\n if (requestStats.totalRequests > 100) {\n console.warn(`High logo API request volume detected: ${requestStats.totalRequests} requests in last minute`);\n }\n};\n\n/**\n * Fetches team logos in bulk from logoapi.sportcreative.eu API\n * Enhanced with rate limiting and batching to prevent request storms\n * @param teamIds Array of team IDs to fetch logos for\n * @returns Promise that resolves to a map of teamId -> logo URL\n */\nexport const batchFetchLogosFromSportLogosAPI = async (teamIds: string[]): Promise<Record<string, string>> => {\n if (!teamIds.length) return {};\n \n // Check current request volume\n const stats = getLogoAPIRequestStats();\n if (stats.totalRequests > 200) {\n console.warn(`Request volume too high (${stats.totalRequests}/min). Skipping batch logo fetch.`);\n return {};\n }\n \n // Rate limiting: process in batches of 10 concurrent requests\n const BATCH_SIZE = 10;\n const RATE_LIMIT_DELAY = 100; // ms between batches\n \n try {\n const logos: Record<string, string> = {};\n \n // Process in batches to avoid overwhelming the API\n for (let i = 0; i < teamIds.length; i += BATCH_SIZE) {\n const batch = teamIds.slice(i, i + BATCH_SIZE);\n \n // Process current batch concurrently\n const batchPromises = batch.map(async (id) => {\n // Check cache first to avoid unnecessary requests\n const cached = await getCachedLogo(id);\n if (cached?.url && !cached.url.startsWith('blob:')) {\n await updateLastUsed(id);\n return { id, url: cached.url, cached: true };\n }\n \n const url = await fetchLogoFromLogoAPI(id);\n trackRequest(!!url);\n return { id, url, cached: false };\n });\n \n const batchResults = await Promise.all(batchPromises);\n batchResults.forEach(({ id, url, cached }) => {\n if (url) logos[id] = url;\n });\n \n // Rate limiting delay between batches (except for last batch)\n if (i + BATCH_SIZE < teamIds.length) {\n await new Promise(resolve => setTimeout(resolve, RATE_LIMIT_DELAY));\n }\n }\n \n return logos;\n } catch (error) {\n console.error('Error in batchFetchLogosFromSportLogosAPI (logoapi.sportcreative.eu):', error);\n return {};\n }\n};\n\n/**\n * Get logo for a team by name or ID, with fallback chain:\n * 1. logoapi.sportcreative.eu (cached)\n * 2. FACR logo (if provided) - this may be a fotbal.cz URL or local upload\n * 3. If local upload fails, try to construct fotbal.cz URL from team ID\n * 4. Placeholder\n */\nexport const getTeamLogo = async (teamId?: string, teamName?: string, facrLogo?: string): Promise<string> => {\n const PLACEHOLDER = '/logo192.png';\n \n // Try logoapi first if we have an ID\n if (teamId) {\n const logoApiUrl = await fetchLogoFromLogoAPI(teamId, teamName);\n if (logoApiUrl) return logoApiUrl;\n }\n \n // Fallback to FACR logo (this may be a fotbal.cz URL or local upload)\n if (facrLogo) {\n // If it's already a fotbal.cz URL, use it directly\n if (facrLogo.includes('fotbal.cz') || facrLogo.includes('is1.fotbal.cz')) {\n return facrLogo;\n }\n \n // If it's a local upload, we'll let the browser handle it and fall back to fotbal.cz on 404\n if (facrLogo.startsWith('/uploads/logos/facr/')) {\n return facrLogo; // Let the browser handle 404 -> fallback\n }\n \n // Otherwise return as-is\n return facrLogo;\n }\n \n // If we have a team ID but no FACR logo, try to construct fotbal.cz URL\n if (teamId) {\n const fotbalCzUrl = `https://is1.fotbal.cz/media/kluby/${teamId}/${teamId}_crop.jpg`;\n return fotbalCzUrl;\n }\n \n // Return placeholder\n return PLACEHOLDER;\n};\n","import React from 'react';\nimport { Box, VStack, HStack, Text, Heading, Textarea, Button, Avatar, IconButton, useColorModeValue, Spinner, Link as ChakraLink, Badge, Tooltip } from '@chakra-ui/react';\nimport { useInfiniteQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { listComments, createComment, updateComment, deleteComment, CommentItem, reactComment, unreactComment, requestUnban, reportComment } from '../../services/comments';\nimport { useAuth } from '../../contexts/AuthContext';\nimport { Pencil, Trash2, Send, CheckCircle2 } from 'lucide-react';\nimport { Link as RouterLink } from 'react-router-dom';\nimport { useTranslation } from 'react-i18next';\n\ntype Props = {\n targetType: 'article' | 'event' | 'gallery_album' | 'youtube_video';\n targetId: string;\n};\n\nconst PAGE_SIZE = 20;\n\nconst displayName = (u?: CommentItem['user']) => {\n const { i18n } = useTranslation();\n const useEnglish = i18n.language === 'en';\n \n if (!u) return useEnglish ? 'Anonymous' : 'Anonym';\n const uname = (u.username || '').trim();\n if (uname) return uname;\n const name = `${u.first_name || ''} ${u.last_name || ''}`.trim();\n return name || (useEnglish ? 'User' : 'Uživatel');\n};\n\nconst CommentsSection: React.FC<Props> = ({ targetType, targetId }) => {\n const { t, i18n } = useTranslation();\n const cardBg = useColorModeValue('white', 'gray.800');\n const border = useColorModeValue('gray.200', 'gray.700');\n const muted = useColorModeValue('gray.600', 'gray.400');\n const appealBg = useColorModeValue('gray.50','gray.700');\n const adminLikedColor = useColorModeValue('blue.600','blue.300');\n const queryClient = useQueryClient();\n const { isAuthenticated, user } = useAuth();\n \n const useEnglish = i18n.language === 'en';\n\n const commentsQuery = useInfiniteQuery({\n queryKey: ['comments', targetType, targetId],\n queryFn: ({ pageParam = 1 }) => listComments({ target_type: targetType, target_id: targetId, page: pageParam, page_size: PAGE_SIZE }),\n getNextPageParam: (lastPage, pages) => {\n const loaded = pages.reduce((sum, p) => sum + (p.items?.length || 0), 0);\n return loaded < lastPage.total ? pages.length + 1 : undefined;\n },\n staleTime: 30_000,\n });\n\n const allItems = (commentsQuery.data?.pages || []).flatMap(p => p.items || []);\n\n const [newContent, setNewContent] = React.useState('');\n const [editingId, setEditingId] = React.useState<number | null>(null);\n const [editContent, setEditContent] = React.useState('');\n const [replyTo, setReplyTo] = React.useState<number | null>(null);\n const [errorMsg, setErrorMsg] = React.useState<string | null>(null);\n const [canRequestUnban, setCanRequestUnban] = React.useState<boolean>(false);\n const [unbanMessage, setUnbanMessage] = React.useState<string>('Please unblock my comments. Thank you.');\n const [localReactions, setLocalReactions] = React.useState<Record<number, string | undefined>>({});\n const [pendingReactions, setPendingReactions] = React.useState<Set<number>>(new Set());\n\n const createMut = useMutation({\n mutationFn: (body: { content: string; parent_id?: number | null }) => createComment({ target_type: targetType, target_id: targetId, content: body.content, parent_id: body.parent_id }),\n onSuccess: async (created) => {\n setNewContent('');\n setReplyTo(null);\n setErrorMsg(null);\n await queryClient.invalidateQueries({ queryKey: ['comments', targetType, targetId] });\n if ((created as any)?.status === 'hidden') {\n setErrorMsg(useEnglish ? 'Your comment is awaiting approval (automatic moderation).' : 'Váš komentář čeká na schválení (automatická moderace).');\n }\n try { window.dispatchEvent(new CustomEvent('engagement:refresh')); } catch {}\n },\n onError: (e: any) => {\n const msg = e?.response?.data?.error || (useEnglish ? 'Failed to post comment' : 'Nepodařilo se odeslat komentář');\n setErrorMsg(msg);\n if ((e?.response?.status || 0) === 403) setCanRequestUnban(true);\n }\n });\n\n const updateMut = useMutation({\n mutationFn: (args: { id: number; content: string }) => updateComment(args.id, { content: args.content }),\n onSuccess: async () => {\n setEditingId(null);\n setEditContent('');\n await queryClient.invalidateQueries({ queryKey: ['comments', targetType, targetId] });\n },\n });\n\n const deleteMut = useMutation({\n mutationFn: (id: number) => deleteComment(id),\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: ['comments', targetType, targetId] });\n },\n });\n\n const reactMut = useMutation({\n mutationFn: (args: { id: number; type: string }) => reactComment(args.id, args.type),\n onMutate: async ({ id, type }) => {\n setPendingReactions(prev => new Set(prev).add(id));\n \n const qk = ['comments', targetType, targetId] as const;\n await queryClient.cancelQueries({ queryKey: qk });\n const previous = queryClient.getQueryData<any>(qk);\n \n // Set optimistic state\n setLocalReactions((m) => ({ ...m, [id]: type }));\n \n queryClient.setQueryData(qk, (oldData: any) => {\n if (!oldData) return oldData;\n const pages = (oldData.pages || []).map((page: any) => {\n const items = (page.items || []).map((it: any) => {\n if (it.id !== id) return it;\n const next = { ...it, reactions: { ...(it.reactions || {}) } };\n const prevType = (next.my_reaction as string | undefined)?.trim();\n \n // Remove previous reaction count if it existed\n if (prevType && prevType !== type) {\n const prevCount = (typeof next.reactions[prevType] === 'number' ? next.reactions[prevType] : 1) as number;\n const newPrev = Math.max(0, prevCount - 1);\n if (newPrev <= 0) {\n delete (next.reactions as any)[prevType];\n } else {\n next.reactions[prevType] = newPrev;\n }\n }\n \n // Add new reaction count\n next.reactions[type] = ((next.reactions[type] || 0) as number) + 1;\n next.my_reaction = type;\n \n if ((user as any)?.role === 'admin') {\n next.admin_liked = (type === 'thumbs_up' || type === 'like');\n }\n return next;\n });\n return { ...page, items };\n });\n return { ...oldData, pages };\n });\n return { previous };\n },\n onError: (_err, _vars, ctx) => {\n const qk = ['comments', targetType, targetId] as const;\n if ((ctx as any)?.previous) {\n queryClient.setQueryData(qk, (ctx as any).previous);\n }\n },\n onSettled: async (_data, _error, variables) => {\n if (variables?.id) {\n setPendingReactions(prev => {\n const next = new Set(prev);\n next.delete(variables.id);\n return next;\n });\n }\n // Clear local optimistic state after a delay to allow server state to sync\n setTimeout(() => {\n setLocalReactions((m) => {\n const cp = { ...m };\n delete cp[variables?.id];\n return cp;\n });\n }, 100);\n \n await queryClient.invalidateQueries({ queryKey: ['comments', targetType, targetId] });\n try { window.dispatchEvent(new CustomEvent('engagement:refresh')); } catch {}\n },\n });\n\n const unreactMut = useMutation({\n mutationFn: (id: number) => unreactComment(id),\n onMutate: async (id: number) => {\n setPendingReactions(prev => new Set(prev).add(id));\n \n const qk = ['comments', targetType, targetId] as const;\n await queryClient.cancelQueries({ queryKey: qk });\n const previous = queryClient.getQueryData<any>(qk);\n \n // Set optimistic state to empty\n setLocalReactions((m) => ({ ...m, [id]: '' }));\n \n queryClient.setQueryData(qk, (oldData: any) => {\n if (!oldData) return oldData;\n const pages = (oldData.pages || []).map((page: any) => {\n const items = (page.items || []).map((it: any) => {\n if (it.id !== id) return it;\n const next = { ...it, reactions: { ...(it.reactions || {}) } };\n const prevType = (next.my_reaction as string | undefined)?.trim();\n if (prevType) {\n const prevCount = (typeof next.reactions[prevType] === 'number' ? next.reactions[prevType] : 1) as number;\n const newPrev = Math.max(0, prevCount - 1);\n if (newPrev <= 0) {\n delete (next.reactions as any)[prevType];\n } else {\n next.reactions[prevType] = newPrev;\n }\n }\n next.my_reaction = '';\n if ((user as any)?.role === 'admin') {\n next.admin_liked = false;\n }\n return next;\n });\n return { ...page, items };\n });\n return { ...oldData, pages };\n });\n return { previous };\n },\n onError: (_err, _vars, ctx) => {\n const qk = ['comments', targetType, targetId] as const;\n if ((ctx as any)?.previous) {\n queryClient.setQueryData(qk, (ctx as any).previous);\n }\n },\n onSettled: async (_data, _error, variables) => {\n if (variables) {\n setPendingReactions(prev => {\n const next = new Set(prev);\n next.delete(variables);\n return next;\n });\n }\n // Clear local optimistic state after a delay to allow server state to sync\n setTimeout(() => {\n setLocalReactions((m) => {\n const cp = { ...m };\n delete cp[variables];\n return cp;\n });\n }, 100);\n \n await queryClient.invalidateQueries({ queryKey: ['comments', targetType, targetId] });\n try { window.dispatchEvent(new CustomEvent('engagement:refresh')); } catch {}\n },\n });\n\n const unbanMut = useMutation({\n mutationFn: (message: string) => requestUnban(message),\n onSuccess: () => {\n setCanRequestUnban(false);\n setErrorMsg(useEnglish ? 'Unban request sent.' : 'Žádost o odblokování odeslána.');\n setUnbanMessage(useEnglish ? 'Please unblock my comments. Thank you.' : 'Prosím o odblokování komentářů. Děkuji.');\n }\n });\n\n const reportMut = useMutation({\n mutationFn: (args: { id: number; reason?: string }) => reportComment(args.id, args.reason),\n onSuccess: async () => {\n setErrorMsg(useEnglish ? 'Thank you for reporting. A moderator will review the comment.' : 'Děkujeme za nahlášení. Moderátor se na komentář podívá.');\n },\n });\n\n const canEdit = (c: CommentItem) => {\n if (!user) return false;\n if (user.role === 'admin') return true;\n return Number(user.id) === Number(c.user?.id);\n };\n\n const minChars = 6;\n\n // Build simple threaded structure\n const byParent: Record<string, CommentItem[]> = React.useMemo(() => {\n const map: Record<string, CommentItem[]> = {};\n for (const c of allItems) {\n const key = String(c.parent_id || 0);\n (map[key] = map[key] || []).push(c);\n }\n return map;\n }, [allItems]);\n\n const ReactionBar: React.FC<{ c: CommentItem }> = ({ c }) => {\n const options: { key: string; label: string; color: string; name: string }[] = [\n { key: 'thumbs_up', label: '👍', color: 'green', name: useEnglish ? 'Thumbs up' : 'Palec nahoru' },\n { key: 'heart', label: '❤️', color: 'pink', name: useEnglish ? 'Heart' : 'Srdíčko' },\n { key: 'smile', label: '😀', color: 'yellow', name: useEnglish ? 'Smile' : 'Úsměv' },\n { key: 'surprised', label: '😮', color: 'purple', name: useEnglish ? 'Surprised' : 'Překvapení' },\n { key: 'thumbs_down', label: '👎', color: 'red', name: useEnglish ? 'Thumbs down' : 'Palec dolů' },\n ];\n const counts = c.reactions || {};\n const active = React.useMemo(() => {\n // Prioritize local optimistic state, fallback to server state\n const localActive = (localReactions[c.id] || '').trim();\n if (localActive !== '') {\n return localActive;\n }\n return (c.my_reaction || '').trim();\n }, [c.my_reaction, localReactions, c.id]);\n \n const viewCounts = React.useMemo(() => {\n const base: Record<string, number> = { ...(counts as any) };\n const a = (active || '').trim();\n const serverActive = (c.my_reaction || '').trim();\n const localActive = (localReactions[c.id] || '').trim();\n \n // If we have a local optimistic state that differs from server, adjust counts\n if (localActive !== '' && localActive !== serverActive) {\n // Remove old server reaction count if it existed\n if (serverActive) {\n const prev = typeof base[serverActive] === 'number' ? base[serverActive] : 0;\n if (prev > 0) {\n base[serverActive] = prev - 1;\n if (base[serverActive] <= 0) delete base[serverActive];\n }\n }\n // Add new local reaction count\n base[localActive] = (base[localActive] || 0) + 1;\n }\n // Handle unreact optimistic state (empty string)\n else if (localActive === '' && serverActive) {\n // Remove the server reaction count optimistically\n const prev = typeof base[serverActive] === 'number' ? base[serverActive] : 0;\n if (prev > 0) {\n base[serverActive] = prev - 1;\n if (base[serverActive] <= 0) delete base[serverActive];\n }\n }\n \n return base;\n }, [counts, active, c.my_reaction, localReactions, c.id]);\n const isBusy = reactMut.isPending || unreactMut.isPending || pendingReactions.has(c.id);\n return (\n <HStack spacing={2} mt={1}>\n {options.map((o) => (\n <Tooltip key={o.key} label={o.name} placement=\"top\" hasArrow>\n <Button\n size=\"xs\"\n colorScheme={o.color}\n variant={active === o.key ? 'solid' : 'outline'}\n isDisabled={!isAuthenticated || isBusy}\n isActive={active === o.key}\n onClick={() => {\n if (!isAuthenticated || isBusy) return;\n if (active === o.key) {\n unreactMut.mutate(c.id);\n } else {\n reactMut.mutate({ id: c.id, type: o.key });\n }\n }}\n >\n <HStack spacing={1}>\n <Text as=\"span\">{o.label}</Text>\n <Text as=\"span\" fontSize=\"xs\">{viewCounts[o.key] || 0}</Text>\n </HStack>\n </Button>\n </Tooltip>\n ))}\n </HStack>\n );\n };\n\n const renderThread = (parentId: number | null, depth = 0) => {\n const list = byParent[String(parentId || 0)] || [];\n return (\n <VStack align=\"stretch\" spacing={3} pl={depth ? 6 : 0}>\n {list.map((c) => (\n <HStack key={c.id} align=\"start\" spacing={3} borderWidth=\"1px\" borderColor={border} borderRadius=\"md\" p={3}>\n <Avatar name={displayName(c.user)} size=\"sm\" src={(c as any)?.user?.avatar_url || undefined} />\n <VStack align=\"stretch\" spacing={1} flex={1}>\n <HStack justify=\"space-between\">\n <HStack spacing={2}>\n <Text fontWeight=\"600\">{displayName(c.user)}</Text>\n {c.user?.role === 'admin' && <Badge colorScheme=\"purple\" variant=\"subtle\">{useEnglish ? 'Admin' : 'Admin'}</Badge>}\n <Text fontSize=\"sm\" color={muted}>{new Date(c.created_at).toLocaleString()}</Text>\n {c.is_edited && <Text fontSize=\"xs\" color={muted}>({useEnglish ? '(edited)' : '(upraveno)'})</Text>}\n </HStack>\n {canEdit(c) && (\n <HStack spacing={1}>\n <IconButton aria-label={useEnglish ? 'Edit' : 'Upravit'} size=\"xs\" variant=\"ghost\" icon={<Pencil size={16} />} onClick={() => { setEditingId(c.id); setEditContent(c.content); }} />\n <IconButton aria-label={useEnglish ? 'Delete' : 'Smazat'} size=\"xs\" variant=\"ghost\" colorScheme=\"red\" icon={<Trash2 size={16} />} onClick={() => deleteMut.mutate(c.id)} />\n </HStack>\n )}\n </HStack>\n {editingId === c.id ? (\n <VStack align=\"stretch\" spacing={2}>\n <Textarea value={editContent} onChange={(e) => setEditContent(e.target.value)} rows={3} />\n <HStack>\n <Button size=\"sm\" colorScheme=\"blue\" onClick={() => updateMut.mutate({ id: c.id, content: editContent.trim() })} isLoading={updateMut.isPending}>{useEnglish ? 'Save' : 'Uložit'}</Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => { setEditingId(null); setEditContent(''); }}>{useEnglish ? 'Cancel' : 'Zrušit'}</Button>\n </HStack>\n </VStack>\n ) : (\n c.content_html ? (\n <Box sx={{ '.cw': { textDecoration: 'underline dotted', cursor: 'help' } }} dangerouslySetInnerHTML={{ __html: c.content_html }} />\n ) : (\n <Text whiteSpace=\"pre-wrap\">{c.content}</Text>\n )\n )}\n <ReactionBar c={c} />\n {c.admin_liked && (\n <HStack spacing={2} mt={1} color={adminLikedColor}>\n <CheckCircle2 size={16} />\n <Text fontSize=\"sm\">{useEnglish ? 'Marked by administrator' : 'Označeno administrátorem'}</Text>\n </HStack>\n )}\n <HStack>\n {isAuthenticated && <Button size=\"xs\" variant=\"ghost\" onClick={() => setReplyTo(c.id)}>{useEnglish ? 'Reply' : 'Odpovědět'}</Button>}\n {isAuthenticated && <Button size=\"xs\" variant=\"ghost\" colorScheme=\"red\" onClick={() => reportMut.mutate({ id: c.id })}>{useEnglish ? 'Report' : 'Nahlásit'}</Button>}\n {c.status === 'hidden' && <Badge colorScheme=\"yellow\">{useEnglish ? 'Awaiting approval' : 'Čeká na schválení'}</Badge>}\n </HStack>\n {/* Replies */}\n {renderThread(c.id, depth + 1)}\n </VStack>\n </HStack>\n ))}\n </VStack>\n );\n };\n\n return (\n <Box mt={6} borderWidth=\"1px\" borderColor={border} borderRadius=\"lg\" bg={cardBg} p={4}>\n <HStack justify=\"space-between\" align=\"center\" mb={3}>\n <Heading as=\"h3\" size=\"md\">{useEnglish ? 'Comments' : 'Komentáře'}</Heading>\n </HStack>\n\n {commentsQuery.isLoading ? (\n <HStack><Spinner size=\"sm\" /><Text>{useEnglish ? 'Loading...' : 'Načítám…'}</Text></HStack>\n ) : (\n <VStack align=\"stretch\" spacing={3}>\n {allItems.length === 0 && (\n <Text color={muted}>{useEnglish ? 'No comments yet.' : 'Zatím žádné komentáře.'}</Text>\n )}\n {renderThread(null)}\n {commentsQuery.hasNextPage && (\n <Button onClick={() => commentsQuery.fetchNextPage()} isLoading={commentsQuery.isFetchingNextPage} alignSelf=\"center\" size=\"sm\" variant=\"outline\">{useEnglish ? 'Load more' : 'Načíst další'}</Button>\n )}\n </VStack>\n )}\n\n <Box mt={4}>\n {errorMsg && (\n <Text color=\"orange.500\" fontSize=\"sm\" mb={2}>{errorMsg}</Text>\n )}\n {isAuthenticated ? (\n <VStack align=\"stretch\" spacing={2}>\n {replyTo && (\n <HStack justify=\"space-between\">\n <Text fontSize=\"sm\" color={muted}>{useEnglish ? `Reply to comment #${replyTo}` : `Odpověď na komentář #${replyTo}`}</Text>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => setReplyTo(null)}>{useEnglish ? 'Cancel reply' : 'Zrušit odpověď'}</Button>\n </HStack>\n )}\n <Textarea placeholder={useEnglish ? 'Write a comment...' : 'Napište komentář…'} value={newContent} onChange={(e) => setNewContent(e.target.value)} rows={3} />\n <HStack>\n <Button leftIcon={<Send size={16} />} colorScheme=\"blue\" onClick={() => createMut.mutate({ content: newContent.trim(), parent_id: replyTo })} isLoading={createMut.isPending} isDisabled={newContent.trim().length < minChars}>{useEnglish ? 'Send' : 'Odeslat'}</Button>\n <Text fontSize=\"sm\" color={muted}>{useEnglish ? 'Please respect the rules of decent discussion.' : 'Respektujte prosím pravidla slušné diskuse.'}</Text>\n </HStack>\n {canRequestUnban && (\n <VStack align=\"stretch\" spacing={2} borderWidth=\"1px\" borderColor={border} borderRadius=\"md\" p={3} bg={appealBg}>\n <Text fontSize=\"sm\" color={muted}>{useEnglish ? 'Your account is temporarily blocked from commenting. You can send an unban request with a brief explanation.' : 'Váš účet je dočasně zablokován pro komentování. Můžete odeslat žádost o odblokování s krátkým vysvětlením.'}</Text>\n <Textarea\n placeholder={useEnglish ? 'Your message for administrators...' : 'Vaše zpráva pro administrátory…'}\n value={unbanMessage}\n onChange={(e) => setUnbanMessage(e.target.value)}\n rows={3}\n />\n <HStack>\n <Button size=\"sm\" variant=\"outline\" onClick={() => unbanMut.mutate(unbanMessage.trim() || (useEnglish ? 'Please unblock my comments. Thank you.' : 'Prosím o odblokování komentářů. Děkuji.'))} isLoading={unbanMut.isPending}>{useEnglish ? 'Send unban request' : 'Odeslat žádost o odblokování'}</Button>\n </HStack>\n </VStack>\n )}\n </VStack>\n ) : (\n <Text color={muted}>\n {useEnglish ? 'To add a comment, please ' : 'Pro přidání komentáře se prosím '}\n <ChakraLink as={RouterLink} to=\"/login\" color=\"blue.500\">\n {useEnglish ? 'log in' : 'přihlaste'}\n </ChakraLink>.\n </Text>\n )}\n </Box>\n </Box>\n );\n};\n\nexport default CommentsSection;\n","import api from './api';\n\nexport type RembgStatus = {\n running: boolean;\n total: number;\n done: number;\n started_at?: string;\n finished_at?: string | null;\n};\n\nexport const getRembgStatus = async (): Promise<RembgStatus> => {\n const res = await api.get('/rembg/status', { timeout: 20000 });\n return res.data;\n};\n\nexport const startRembgBatch = async (): Promise<{ started: boolean; status: RembgStatus }> => {\n const res = await api.post('/rembg/start', null, { timeout: 20000 });\n return res.data;\n};\n","import React, { useEffect, useState } from 'react';\nimport { Box, HStack, Input, Popover, PopoverTrigger, PopoverContent, PopoverBody, useColorModeValue } from '@chakra-ui/react';\nimport ColorPicker from './ColorPicker';\n\nexport type ColorPickerPopoverProps = {\n value: string;\n onChange: (hex: string) => void;\n recentStorageKey?: string;\n};\n\nconst ColorPickerPopover: React.FC<ColorPickerPopoverProps> = ({ value, onChange, recentStorageKey }) => {\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const inputBg = useColorModeValue('white', 'gray.800');\n const [internal, setInternal] = useState<string>(value || '#000000');\n\n useEffect(() => {\n setInternal(value || '#000000');\n }, [value]);\n\n return (\n <Popover\n placement=\"bottom-start\"\n closeOnBlur\n closeOnEsc\n autoFocus={false}\n returnFocusOnClose={false}\n >\n <PopoverTrigger>\n <HStack\n spacing={2}\n cursor=\"pointer\"\n align=\"center\"\n >\n <Box\n width=\"32px\"\n height=\"32px\"\n borderRadius=\"full\"\n borderWidth=\"1px\"\n borderColor={borderColor}\n bg={value || '#000000'}\n />\n <Input\n value={(value || '').toUpperCase()}\n isReadOnly\n size=\"sm\"\n maxW=\"120px\"\n fontFamily=\"mono\"\n bg={inputBg}\n />\n </HStack>\n </PopoverTrigger>\n <PopoverContent w=\"auto\" maxW=\"280px\" _focus={{ boxShadow: 'none' }}>\n <PopoverBody p={3}>\n <ColorPicker\n value={internal}\n onChange={(hex) => {\n setInternal(hex);\n onChange(hex);\n }}\n onChangeComplete={(hex) => {\n setInternal(hex);\n onChange(hex);\n }}\n recentStorageKey={recentStorageKey}\n compact\n />\n </PopoverBody>\n </PopoverContent>\n </Popover>\n );\n};\n\nexport default ColorPickerPopover;\n","import { useEffect, useState, useMemo, startTransition } from 'react';\nimport { Box, Button, FormControl, FormLabel, Input, VStack, Heading, useToast, SimpleGrid, Divider, Text, useColorModeValue, InputGroup, InputRightElement, List, ListItem, Spinner, HStack, Image, Checkbox, Tooltip, Alert, AlertIcon, Select, FormHelperText, Badge, Link } from '@chakra-ui/react';\nimport { InfoOutlineIcon } from '@chakra-ui/icons';\nimport './styles/MagazineHome.css';\nimport './styles/ProHome.css';\nimport { useNavigate } from 'react-router-dom';\nimport { getSetupStatus, initializeSetup, SetupInitializePayload, validateSMTP } from '../services/setup';\nimport { getRembgStatus, startRembgBatch } from '../services/rembg';\nimport { updateSeoSettings } from '../services/seo';\nimport { API_URL } from '../services/api';\nimport { assetUrl } from '../utils/url';\nimport { useFacrApi } from '../hooks/useFacrApi';\nimport { SearchResult } from '../services/facr/types';\nimport { extractPalette, pickTextColor, generateJwtSecret, contrastRatio, isContrastAccessible, generateThemeCandidates, ThemeCandidate, adjustForContrast } from '../utils/colors';\nimport { clearToken, setHasAdmin } from '../utils/auth';\nimport ContactMap from '../components/home/ContactMap';\nimport { FONT_PAIRINGS, applyFontPairing, getFontStyleColor } from '../config/fonts';\nimport MapLinkImporter from '../components/admin/MapLinkImporter';\nimport MapStyleSelector from '../components/admin/MapStyleSelector';\nimport { MapCoordinates } from '../utils/mapUrlParser';\nimport { useTranslation } from 'react-i18next';\nimport { fetchLogoFromLogoAPI, fetchClubNameAndLogoFromAPI } from '../utils/sportLogosAPI';\nimport { HelpTooltipCard, PasswordHelpTooltip } from '../components/common/HelpTooltipCard';\nimport ColorPicker from '../components/common/ColorPicker';\nimport ColorPickerPopover from '../components/common/ColorPickerPopover';\nimport { usePublicSettings } from '../hooks/usePublicSettings';\n\nconst normalizePhone = (raw: string, country?: string) => {\n let s = (raw || '').trim();\n if (!s) return '';\n s = s.replace(/[\\s\\-.()]/g, '');\n s = s.replace(/^00/, '+');\n if (s.startsWith('+')) return s;\n if (/^420\\d{9}$/.test(s)) return '+' + s;\n if (/^\\d{9}$/.test(s)) {\n const c = (country || '').toLowerCase();\n if (c.includes('česk') || c.includes('czech')) {\n return '+420' + s;\n }\n }\n return s;\n};\n\nconst SetupPage: React.FC = () => {\n const { t } = useTranslation();\n const [loading, setLoading] = useState(true);\n const [submitting, setSubmitting] = useState(false);\n const [requiresSetup, setRequiresSetup] = useState(false);\n\n // form state\n const [adminEmail, setAdminEmail] = useState('');\n const [adminPassword, setAdminPassword] = useState('');\n const [showAdminPassword, setShowAdminPassword] = useState(false);\n const [firstName, setFirstName] = useState('');\n const [lastName, setLastName] = useState('');\n const [jwtSecret, setJwtSecret] = useState('');\n const [clubId, setClubId] = useState('');\n const [clubType, setClubType] = useState('football');\n const [clubName, setClubName] = useState('');\n const [clubLogoUrl, setClubLogoUrl] = useState('');\n const [uploadingLogo, setUploadingLogo] = useState(false);\n const [clubUrl, setClubUrl] = useState('');\n const [clubLink, setClubLink] = useState('');\n const [clubQuery, setClubQuery] = useState('');\n const { data: publicSettings } = usePublicSettings();\n const isManualClubDataMode = (publicSettings?.club_data_mode || '').toLowerCase() === 'manual';\n const { searchClubs, searchResults, searchLoading } = useFacrApi();\n\n const resolveLogoUrl = (u?: string | null) => {\n if (!u) return undefined;\n // If it's a logoapi URL, use it directly (no proxy needed)\n if (u.includes('logoapi.sportcreative.eu')) return u;\n // If it's a backend-relative path or dist asset, use assetUrl helper\n if (u.startsWith('/uploads') || u.startsWith('/dist') || u.startsWith('/api/')) return assetUrl(u);\n // If it's an absolute remote URL, route through backend proxy to avoid CORS/hotlinking issues\n if (/^https?:\\/\\//i.test(u)) {\n const base = (API_URL || '').replace(/\\/$/, '');\n return `${base}/proxy/image?url=${encodeURIComponent(u)}`;\n }\n return u;\n };\n\n // Theme colors\n // Default theme colors before any logo/preset is selected\n const [primaryColor, setPrimaryColor] = useState('#2d74da');\n const [secondaryColor, setSecondaryColor] = useState('#f6f8fb');\n const [accentColor, setAccentColor] = useState('#ffb703');\n const [backgroundColor, setBackgroundColor] = useState('#ffffff');\n const [textColor, setTextColor] = useState('#111827');\n // Site style\n const [frontpageStyle, setFrontpageStyle] = useState<'unified' | 'magazine'>('unified');\n // Theme presets generated from logo\n const [themePresets, setThemePresets] = useState<ThemeCandidate[]>([]);\n const [selectedPreset, setSelectedPreset] = useState<number | null>(null);\n\n // Typography/Font\n const [selectedFont, setSelectedFont] = useState<string>('inter-inter');\n\n // GPS Location\n const [mapUrl, setMapUrl] = useState('');\n const [gpsLat, setGpsLat] = useState<number | ''>('');\n const [gpsLng, setGpsLng] = useState<number | ''>('');\n const [mapStyle, setMapStyle] = useState<string>('positron');\n\n // Contact Details\n const [contactStreet, setContactStreet] = useState('');\n const [contactCity, setContactCity] = useState('');\n const [contactPostalCode, setContactPostalCode] = useState('');\n const [contactCountry, setContactCountry] = useState('Česká republika');\n const [contactPhone, setContactPhone] = useState('');\n const [contactEmail, setContactEmail] = useState('');\n\n // SMTP\n const [smtpHost, setSmtpHost] = useState('');\n const [smtpPort, setSmtpPort] = useState<number | ''>('');\n const [smtpUser, setSmtpUser] = useState('');\n const [smtpPass, setSmtpPass] = useState('');\n const [showSmtpPass, setShowSmtpPass] = useState(false);\n const [smtpUserEdited, setSmtpUserEdited] = useState(false);\n // Sender display name only; actual email is derived from smtpUser\n const [smtpFromName, setSmtpFromName] = useState('');\n const [smtpTLS, setSmtpTLS] = useState(true);\n const [testingSMTP, setTestingSMTP] = useState(false);\n\n // Social & gallery\n const [facebookUrl, setFacebookUrl] = useState('');\n const [instagramUrl, setInstagramUrl] = useState('');\n const [youtubeUrl, setYoutubeUrl] = useState('');\n const [galleryUrl, setGalleryUrl] = useState('');\n\n const [frontendBaseUrl, setFrontendBaseUrl] = useState('');\n const [apiBaseUrl, setApiBaseUrl] = useState('');\n const [isDomainHost, setIsDomainHost] = useState(false);\n const [showAdvancedApi, setShowAdvancedApi] = useState(false);\n const [apiUrlTouched, setApiUrlTouched] = useState(false);\n const [processingLogos, setProcessingLogos] = useState(false);\n const [rembgTotal, setRembgTotal] = useState(0);\n const [rembgDone, setRembgDone] = useState(0);\n\n const toast = useToast();\n const navigate = useNavigate();\n const bg = useColorModeValue('white', 'gray.800');\n const borderCol = useColorModeValue('gray.200', 'gray.600');\n\n // Password helpers\n const sanitizePassword = (val: string) => {\n // remove all whitespace characters (spaces, tabs, newlines, non-breaking spaces)\n return (val || '').replace(/\\s+/g, '');\n };\n const isPasswordValid = (val: string) => {\n // 8-128 chars, no whitespace\n return /^\\S{8,128}$/.test(val);\n };\n const generateStrongPassword = () => {\n const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*()-_=+[]{};:,.?';\n let out = '';\n const len = 16;\n for (let i = 0; i < len; i++) {\n out += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return out;\n };\n\n const isValidEmail = (val: string) => /^(?:[^\\s@]+)@(?:[^\\s@]+)\\.(?:[^\\s@]+)$/.test((val || '').trim());\n\n\n useEffect(() => {\n let mounted = true;\n // Ensure no stale auth/admin flags can interfere with setup\n try {\n clearToken();\n setHasAdmin(false);\n } catch {}\n (async () => {\n try {\n const s = await getSetupStatus();\n if (!mounted) return;\n setRequiresSetup(!!s.requires_setup);\n } catch (e) {\n setRequiresSetup(false);\n } finally {\n if (mounted) setLoading(false);\n }\n })();\n return () => { mounted = false; };\n }, []);\n\n useEffect(() => {\n try {\n const loc = window.location;\n const host = loc.hostname;\n const origin = loc.origin;\n const isLocal = /^(localhost|127\\.0\\.0\\.1)$/i.test(host);\n const isIPv4 = /^\\d{1,3}(?:\\.\\d{1,3}){3}$/.test(host);\n if (isLocal || isIPv4) {\n setIsDomainHost(false);\n setFrontendBaseUrl(origin);\n const apiOrigin = `${loc.protocol}//${host}:8080`;\n setApiBaseUrl(apiOrigin.replace(/\\/$/, '') + '/api/v1');\n } else {\n setIsDomainHost(true);\n setFrontendBaseUrl(origin);\n setApiBaseUrl(origin.replace(/\\/$/, '') + '/api/v1');\n }\n } catch {}\n }, []);\n\n // Auto-generate JWT secret when setup is required\n useEffect(() => {\n if (requiresSetup && !jwtSecret) {\n setJwtSecret(generateJwtSecret());\n }\n }, [requiresSetup, jwtSecret]);\n\n // Debounced search for clubs\n useEffect(() => {\n const q = clubQuery.trim();\n if (!q) return;\n const t = setTimeout(() => {\n searchClubs(q).catch(() => {});\n }, 300);\n return () => clearTimeout(t);\n }, [clubQuery, searchClubs]);\n\n useEffect(() => {\n if (isDomainHost && !showAdvancedApi) {\n if (frontendBaseUrl) {\n setApiBaseUrl(frontendBaseUrl.replace(/\\/$/, '') + '/api/v1');\n }\n }\n }, [isDomainHost, showAdvancedApi, frontendBaseUrl]);\n\n // Load and apply selected font for preview\n useEffect(() => {\n const pairing = FONT_PAIRINGS.find((f) => f.id === selectedFont);\n if (pairing) {\n applyFontPairing(pairing);\n }\n }, [selectedFont]);\n\n // Auto-fill SMTP username from contact email\n useEffect(() => {\n if (contactEmail && isValidEmail(contactEmail) && !smtpUserEdited) {\n setSmtpUser(contactEmail);\n }\n }, [contactEmail, smtpUserEdited]);\n\n const extractUuidFromHref = (href: string): string | null => {\n try {\n const re = /[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}/;\n const m = href.match(re);\n if (m && m[0]) return m[0];\n } catch {}\n return null;\n };\n\n const detectClubTypeFromUrl = (raw: string): 'football' | 'futsal' => {\n const s = (raw || '').toLowerCase();\n if (s.includes('/futsal') || s.includes('futsal.fotbal.cz')) return 'futsal';\n return 'football';\n };\n\n const handleClubLinkBlur = async () => {\n const raw = (clubLink || '').trim();\n if (!raw) return;\n let href = raw;\n try {\n // Ensure we can parse as URL for robustness\n if (!/^https?:\\/\\//i.test(href)) {\n href = 'https://' + href;\n }\n const u = new URL(href);\n href = u.toString();\n } catch {\n // Leave href as-is if URL constructor fails\n }\n const id = extractUuidFromHref(href);\n if (id) {\n setClubId(id);\n }\n const t = detectClubTypeFromUrl(href);\n setClubType(t);\n setClubUrl(href);\n\n if (id) {\n try {\n // Try to get both club name and logo from logoapi\n const clubInfo = await fetchClubNameAndLogoFromAPI(id);\n let logoUrl = clubInfo?.logoUrl;\n \n // Use club name from logoapi if available and current club name is empty\n if (clubInfo?.clubName && !clubName) {\n setClubName(clubInfo.clubName);\n // Auto-fill sender display name from club name if empty\n if (!smtpFromName) {\n setSmtpFromName(clubInfo.clubName);\n }\n // Update the document title immediately for instant feedback\n try {\n if (typeof document !== 'undefined') {\n document.title = clubInfo.clubName;\n }\n } catch {}\n }\n \n // Fallback to FACR logo if logoapi doesn't have it\n if (!logoUrl) {\n logoUrl = `https://is1.fotbal.cz/media/kluby/${id}/${id}_crop.jpg`;\n }\n if (logoUrl) {\n setClubLogoUrl(logoUrl);\n extractPalette(logoUrl, 5)\n .then((colors) => {\n if (!colors || colors.length === 0) return;\n const presets = generateThemeCandidates(colors);\n setThemePresets(presets);\n const p0 = presets[0];\n if (p0) {\n setPrimaryColor(p0.primary);\n setSecondaryColor(p0.secondary);\n setAccentColor(p0.accent);\n setBackgroundColor(p0.background);\n setTextColor(p0.text);\n setSelectedPreset(0);\n }\n })\n .catch(() => {});\n }\n } catch {\n }\n }\n };\n\n const handleSelectClub = async (item: SearchResult) => {\n const clubIdValue = item.club_id || '';\n setClubId(clubIdValue);\n setClubType(item.club_type || 'football');\n setClubName(item.name || '');\n setClubUrl(item.url || '');\n setClubQuery(item.name || '');\n \n // Try to fetch both logo and club name from logoapi first\n let logoUrl = '';\n let finalClubName = item.name || '';\n \n if (clubIdValue) {\n try {\n const clubInfo = await fetchClubNameAndLogoFromAPI(clubIdValue);\n if (clubInfo?.logoUrl) {\n logoUrl = clubInfo.logoUrl;\n }\n // Prefer club name from logoapi if available\n if (clubInfo?.clubName) {\n finalClubName = clubInfo.clubName;\n setClubName(clubInfo.clubName);\n }\n } catch {\n // If logoapi fails, continue with FACR data\n }\n }\n \n // Fallback to FACR logo if logoapi doesn't have it\n if (!logoUrl && item.logo_url) {\n logoUrl = item.logo_url;\n }\n setClubLogoUrl(logoUrl);\n \n // Auto-fill sender display name from club name if empty\n if (!smtpFromName && finalClubName) {\n setSmtpFromName(finalClubName);\n }\n // Update the document title immediately for instant feedback\n try {\n if (typeof document !== 'undefined' && finalClubName) {\n document.title = finalClubName;\n }\n } catch {}\n // Try to extract colors\n if (logoUrl) {\n extractPalette(logoUrl, 5)\n .then((colors) => {\n if (!colors || colors.length === 0) return;\n const presets = generateThemeCandidates(colors);\n setThemePresets(presets);\n // Apply first preset by default\n const p0 = presets[0];\n if (p0) {\n setPrimaryColor(p0.primary);\n setSecondaryColor(p0.secondary);\n setAccentColor(p0.accent);\n setBackgroundColor(p0.background);\n setTextColor(p0.text);\n setSelectedPreset(0);\n }\n })\n .catch(() => {});\n }\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setSubmitting(true);\n try {\n // Validate and sanitize password\n const cleanPassword = sanitizePassword(adminPassword);\n if (!isPasswordValid(cleanPassword)) {\n toast({ title: 'Neplatné heslo', description: 'Heslo musí mít 8128 znaků a nesmí obsahovat mezery.', status: 'error' });\n setSubmitting(false);\n return;\n }\n // Compose SMTP From as \"Name <username>\" if both provided\n const composedFrom = smtpFromName && smtpUser\n ? `${smtpFromName} <${smtpUser}>`\n : (smtpUser || undefined);\n\n const payload: SetupInitializePayload = {\n admin_email: adminEmail,\n admin_password: cleanPassword,\n first_name: firstName || undefined,\n last_name: lastName || undefined,\n jwt_secret: jwtSecret || undefined,\n club_id: clubId || undefined,\n club_type: clubType || undefined,\n club_name: clubName || undefined,\n club_logo_url: clubLogoUrl || undefined,\n club_url: clubUrl || undefined,\n frontend_base_url: frontendBaseUrl || undefined,\n api_base_url: apiBaseUrl || undefined,\n frontpage_style: frontpageStyle || undefined,\n primary_color: primaryColor || undefined,\n secondary_color: secondaryColor || undefined,\n accent_color: accentColor || undefined,\n background_color: backgroundColor || undefined,\n text_color: textColor || undefined,\n // typography (optional)\n font_heading: FONT_PAIRINGS.find(f => f.id === selectedFont)?.heading || undefined,\n font_body: FONT_PAIRINGS.find(f => f.id === selectedFont)?.body || undefined,\n // social & gallery (optional)\n facebook_url: facebookUrl || undefined,\n instagram_url: instagramUrl || undefined,\n youtube_url: youtubeUrl || undefined,\n gallery_url: galleryUrl || undefined,\n // GPS location (optional)\n location_latitude: typeof gpsLat === 'number' ? gpsLat : undefined,\n location_longitude: typeof gpsLng === 'number' ? gpsLng : undefined,\n map_style: mapStyle || undefined,\n // Contact details (optional)\n contact_address: contactStreet || undefined,\n contact_city: contactCity || undefined,\n contact_zip: contactPostalCode || undefined,\n contact_country: contactCountry || undefined,\n contact_phone: normalizePhone(contactPhone, contactCountry) || undefined,\n contact_email: contactEmail || undefined,\n smtp: (smtpHost || smtpPort || smtpUser || smtpPass || smtpFromName) ? {\n host: smtpHost || undefined,\n port: typeof smtpPort === 'number' ? smtpPort : undefined,\n username: smtpUser || undefined,\n password: smtpPass || undefined,\n from: composedFrom,\n use_tls: smtpTLS,\n } : null,\n };\n try {\n const fb = (frontendBaseUrl || '').trim().replace(/\\/$/, '');\n let ab = (apiBaseUrl || '').trim();\n if (fb || ab) {\n try {\n const u = new URL(ab || '', fb || (typeof window !== 'undefined' ? window.location.origin : ''));\n if (!/\\/api\\//.test(u.pathname)) { u.pathname = u.pathname.replace(/\\/$/, '') + '/api/v1'; }\n ab = u.toString();\n } catch {}\n try { localStorage.setItem('fc_frontend_base_url', fb); } catch {}\n try { localStorage.setItem('fc_api_base_url', ab); } catch {}\n try { localStorage.setItem('api_base_url', ab); } catch {}\n }\n } catch {}\n await initializeSetup(payload);\n // Set sensible default SEO based on setup data\n try {\n const origin = (typeof window !== 'undefined' ? window.location.origin : '').replace(/\\/$/, '');\n const canonical = (frontendBaseUrl || origin || '').replace(/\\/$/, '');\n await updateSeoSettings({\n site_title: clubName || 'Fotbal Club',\n site_description: clubName ? `${clubName} oficiální klubový web: aktuality, zápasy, tabulky, hráči.` : 'Oficiální klubový web: aktuality, zápasy, tabulky, hráči.',\n default_og_image_url: clubLogoUrl || undefined,\n canonical_base_url: canonical || undefined,\n enable_indexing: true,\n });\n } catch {}\n toast({ title: 'Nastavení dokončeno', status: 'success', duration: 3000, isClosable: true });\n // Start background removal only if backend allows it; otherwise skip waiting UI\n let allowRembg = false;\n try {\n const resp = await startRembgBatch().catch(() => null as any);\n allowRembg = !!resp && (resp.started || resp.status?.running || (resp.status?.total || 0) > 0);\n } catch {}\n if (allowRembg) {\n setProcessingLogos(true);\n try {\n // Wait for batch to actually start or totals to appear (prefetch must finish first)\n const deadline = Date.now() + 120000; // 2 minutes max\n let started = false;\n while (Date.now() < deadline) {\n const s0 = await getRembgStatus();\n setRembgTotal(s0?.total || 0);\n setRembgDone(s0?.done || 0);\n if (s0?.running || (s0?.total || 0) > 0 || (s0?.done || 0) > 0) { started = true; break; }\n await new Promise((r) => setTimeout(r, 1000));\n }\n if (started) {\n // Poll progress until finished\n for (;;) {\n const s = await getRembgStatus();\n setRembgTotal(s?.total || 0);\n setRembgDone(s?.done || 0);\n if (!s?.running) break;\n await new Promise((r) => setTimeout(r, 1200));\n }\n }\n } catch {}\n setProcessingLogos(false);\n }\n try {\n const fb = (frontendBaseUrl || '').trim().replace(/\\/$/, '');\n let ab = (apiBaseUrl || '').trim();\n if (fb || ab) {\n try {\n const u = new URL(ab || '', fb || (typeof window !== 'undefined' ? window.location.origin : ''));\n if (!/\\/api\\//.test(u.pathname)) { u.pathname = u.pathname.replace(/\\/$/, '') + '/api/v1'; }\n ab = u.toString();\n } catch {}\n try { localStorage.setItem('fc_frontend_base_url', fb); } catch {}\n try { localStorage.setItem('fc_api_base_url', ab); } catch {}\n try { localStorage.setItem('api_base_url', ab); } catch {}\n }\n } catch {}\n // In manuálním režimu si uložíme cíl pro \"krok 2\" (ruční data soutěží),\n // aby po reloadu a přihlášení byl admin přesměrován na stránku /admin/manual-data.\n if (isManualClubDataMode) {\n try { localStorage.setItem('fc_post_setup_target', '/admin/manual-data'); } catch {}\n }\n navigate('/login', { replace: true });\n // Force full reload to ensure app picks up fresh server state and env\n setTimeout(() => {\n try { window.location.reload(); } catch {}\n }, 800);\n } catch (error: any) {\n toast({ title: 'Nastavení selhalo', description: error?.response?.data?.error || 'Zkontrolujte prosím své údaje', status: 'error' });\n } finally {\n setSubmitting(false);\n }\n };\n\n const onLogoFile = async (f?: File | null) => {\n if (!f) return;\n setUploadingLogo(true);\n try {\n // Use a dedicated form so we can pass preserve_quality to backend\n const fd = new FormData();\n fd.append('file', f);\n fd.append('preserve_quality', 'true');\n // Upload should go to the API root (usually /api/v1/upload). Use configured API_URL\n const uploadUrl = `${(API_URL || '').replace(/\\/$/, '')}/upload`;\n const res = await fetch(uploadUrl, { method: 'POST', body: fd });\n if (!res.ok) throw new Error('Upload failed');\n const data = await res.json();\n let url = data?.url || '';\n try {\n const parsed = new URL(url, window.location.origin);\n url = parsed.pathname + parsed.search + parsed.hash;\n } catch {}\n setClubLogoUrl(url);\n \n // Also upload to logoapi if we have a club ID\n if (clubId) {\n try {\n const logoFd = new FormData();\n logoFd.append('logo', f);\n const logoApiRes = await fetch(`https://logoapi.sportcreative.eu/logos/${clubId}`, {\n method: 'POST',\n body: logoFd,\n });\n if (logoApiRes.ok) {\n toast({ title: 'Logo nahráno', description: 'Logo bylo nahráno na logoapi i lokálně', status: 'success', duration: 3000 });\n try {\n const apiUrl = await fetchLogoFromLogoAPI(clubId, clubName || undefined);\n if (apiUrl) {\n setClubLogoUrl(apiUrl);\n }\n } catch {}\n }\n } catch (logoApiErr) {\n console.warn('Failed to upload to logoapi:', logoApiErr);\n // Don't fail the whole upload if logoapi fails\n }\n }\n \n // Try to extract colors from uploaded logo\n try { const colors = await extractPalette(url, 5); const presets = generateThemeCandidates(colors); setThemePresets(presets); if (presets[0]) { setPrimaryColor(presets[0].primary); setSecondaryColor(presets[0].secondary); setAccentColor(presets[0].accent); setBackgroundColor(presets[0].background); setTextColor(presets[0].text); setSelectedPreset(0); } } catch {}\n } catch (e) {\n toast({ title: 'Nahrání loga selhalo', status: 'error' });\n } finally {\n setUploadingLogo(false);\n }\n };\n\n // Derived: contrast checks (memoized for perf)\n const bgTextContrast = useMemo(() => {\n if (!backgroundColor || !textColor) return null;\n return contrastRatio(backgroundColor, textColor);\n }, [backgroundColor, textColor]);\n\n const primaryTextContrast = useMemo(() => {\n if (!primaryColor || !textColor) return null;\n return contrastRatio(primaryColor, textColor);\n }, [primaryColor, textColor]);\n\n const isBgTextAccessible = useMemo(() => {\n if (bgTextContrast == null) return true;\n return isContrastAccessible(backgroundColor, textColor, 'AA');\n }, [bgTextContrast, backgroundColor, textColor]);\n\n const autofixTextForBg = () => {\n if (!backgroundColor) return;\n const fixed = pickTextColor(backgroundColor);\n setTextColor(fixed);\n };\n\n const adminPasswordStrength = useMemo(() => {\n const val = adminPassword || '';\n const length = val.length;\n const hasMinLength = length >= 8;\n const hasUpper = /[A-Z]/.test(val);\n const hasLower = /[a-z]/.test(val);\n const hasNumber = /[0-9]/.test(val);\n const hasSpecial = /[^0-9A-Za-z]/.test(val);\n let fulfilled = 0;\n if (hasMinLength) fulfilled++;\n if (hasUpper && hasLower) fulfilled++;\n if (hasNumber) fulfilled++;\n if (hasSpecial) fulfilled++;\n let label = 'Zatím žádné heslo';\n let color = 'gray.500';\n if (!val) {\n label = 'Zatím žádné heslo';\n color = 'gray.500';\n } else if (!hasMinLength) {\n label = 'Příliš krátké (min. 8 znaků)';\n color = 'red.500';\n } else if (fulfilled <= 2) {\n label = 'Slabé';\n color = 'red.500';\n } else if (fulfilled === 3) {\n label = 'Střední';\n color = 'orange.500';\n } else {\n label = 'Silné';\n color = 'green.500';\n }\n return {\n label,\n color,\n score: !val ? 0 : fulfilled,\n maxScore: 4,\n items: [\n { text: 'Minimálně 8 znaků (povinné)', ok: hasMinLength },\n { text: 'Kombinaci malých a velkých písmen', ok: hasUpper && hasLower },\n { text: 'Čísla', ok: hasNumber },\n { text: 'Speciální znaky (doporučeno)', ok: hasSpecial },\n ],\n };\n }, [adminPassword]);\n\n // Re-generate presets manually when user clicks button (from current logo URL)\n const regenerateFromLogo = async () => {\n const url = clubLogoUrl?.trim();\n if (!url) return;\n try {\n const colors = await extractPalette(url, 5);\n const presets = generateThemeCandidates(colors);\n setThemePresets(presets);\n if (presets[0]) {\n setPrimaryColor(presets[0].primary);\n setSecondaryColor(presets[0].secondary);\n setAccentColor(presets[0].accent);\n setBackgroundColor(presets[0].background);\n setTextColor(presets[0].text);\n setSelectedPreset(0);\n }\n } catch {}\n };\n\n const applyPreset = (idx: number) => {\n const p = themePresets[idx];\n if (!p) return;\n setPrimaryColor(p.primary);\n setSecondaryColor(p.secondary);\n setAccentColor(p.accent);\n setBackgroundColor(p.background);\n setTextColor(p.text);\n setSelectedPreset(idx);\n };\n\n // Redirect if setup not required\n useEffect(() => {\n if (!loading && !requiresSetup) {\n navigate('/login', { replace: true });\n }\n }, [loading, requiresSetup, navigate]);\n\n if (loading) return <Box p={8}>Načítání…</Box>;\n if (!requiresSetup) {\n return null;\n }\n\n // Get selected font pairing for live preview\n const selectedFontPairing = FONT_PAIRINGS.find((f) => f.id === selectedFont);\n const fontHeading = selectedFontPairing?.cssHeading || 'inherit';\n const fontBody = selectedFontPairing?.cssBody || 'inherit';\n\n return (\n <Box minH=\"100vh\" bg=\"gray.50\" display=\"flex\" alignItems=\"center\" justifyContent=\"center\" px={8} py={8} fontFamily={fontBody}>\n <Box as=\"form\" onSubmit={handleSubmit} w=\"100%\" maxW=\"3xl\" p={8} bg={bg} borderRadius=\"xl\" boxShadow=\"lg\" borderWidth=\"1px\" borderColor={borderCol} fontFamily={fontBody}>\n <VStack spacing={3} mb={6} align=\"stretch\">\n <Heading size=\"xl\" fontFamily={fontHeading}>🚀 Vítejte v nastavení vašeho webu!</Heading>\n {isManualClubDataMode && (\n <Text fontSize=\"sm\" color=\"gray.600\">\n Krok 1/2 základní nastavení klubu a administrátora. Po dokončení budete v dalším kroku nahrávat zápasy a tabulky.\n </Text>\n )}\n <Text fontSize=\"md\" color=\"gray.600\">\n Nastavte základní informace o vašem klubu. Můžete vše vyplnit nyní, nebo některé údaje doplnit později v administraci.\n </Text>\n <Alert status=\"info\" borderRadius=\"md\">\n <AlertIcon />\n <Box>\n {!isManualClubDataMode ? (\n <>\n <Text fontSize=\"sm\" fontWeight=\"medium\">💡 Tip: Vyhledejte váš klub v databázi FAČR</Text>\n <Text fontSize=\"sm\">Logo, barvy a základní údaje se doplní automaticky.</Text>\n </>\n ) : (\n <>\n <Text fontSize=\"sm\" fontWeight=\"medium\">💡 Tip: V manuálním režimu stačí nyní nastavit klub, logo a barvy.</Text>\n <Text fontSize=\"sm\">V dalším kroku (Manuální data soutěží) nahrajete zápasy a tabulky pomocí CSV/Excel šablon.</Text>\n </>\n )}\n </Box>\n </Alert>\n </VStack>\n\n <SimpleGrid columns={[1, 1, 2]} spacing={6}>\n <Box>\n <Heading as=\"h3\" size=\"md\" mb={4} fontFamily={fontHeading}>🔐 Administrátorský účet</Heading>\n <VStack align=\"stretch\" spacing={4}>\n <FormControl isRequired>\n <FormLabel>Email administrátora</FormLabel>\n <Input type=\"email\" value={adminEmail} onChange={(e) => setAdminEmail(e.target.value)} placeholder=\"admin@example.com\" />\n </FormControl>\n <FormControl>\n <FormLabel display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n <HStack spacing={1}>\n <Box>Heslo administrátora</Box>\n <Text as=\"span\" color=\"red.500\">*</Text>\n </HStack>\n <PasswordHelpTooltip />\n </FormLabel>\n <InputGroup>\n <Input\n type={showAdminPassword ? 'text' : 'password'}\n value={adminPassword}\n onChange={(e) => setAdminPassword(sanitizePassword(e.target.value))}\n placeholder=\"Minimálně 8 znaků, bez mezer\"\n minLength={8}\n />\n <InputRightElement width=\"4.5rem\">\n <Button h=\"1.75rem\" size=\"sm\" onClick={() => setShowAdminPassword((s) => !s)}>{showAdminPassword ? 'Skrýt' : 'Zobrazit'}</Button>\n </InputRightElement>\n </InputGroup>\n <FormHelperText mt={2}>\n <VStack align=\"stretch\" spacing={1}>\n <HStack justify=\"space-between\" align=\"center\" spacing={3}>\n <Text fontSize=\"xs\" color=\"gray.600\">\n Bez mezer. 8128 znaků. Použijte písmena, číslice a speciální znaky.\n </Text>\n <Text as=\"span\" fontSize=\"xs\" fontWeight=\"semibold\" color={adminPasswordStrength.color} whiteSpace=\"nowrap\">\n {adminPasswordStrength.label}\n </Text>\n </HStack>\n <Box\n mt={1}\n w=\"100%\"\n h=\"6px\"\n borderRadius=\"full\"\n bg=\"gray.200\"\n overflow=\"hidden\"\n >\n <Box\n h=\"100%\"\n w={`${(adminPasswordStrength.score / adminPasswordStrength.maxScore) * 100}%`}\n bg={adminPasswordStrength.color}\n transition=\"width 0.2s ease-out, background-color 0.2s ease-out\"\n />\n </Box>\n </VStack>\n </FormHelperText>\n <HStack mt={2} spacing={2}>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setAdminPassword(generateStrongPassword())}>Vygenerovat silné heslo</Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setAdminPassword('')}>Vymazat</Button>\n </HStack>\n </FormControl>\n <FormControl>\n <FormLabel>Jméno</FormLabel>\n <Input value={firstName} onChange={(e) => setFirstName(e.target.value)} />\n </FormControl>\n <FormControl>\n <FormLabel>Příjmení</FormLabel>\n <Input value={lastName} onChange={(e) => setLastName(e.target.value)} />\n </FormControl>\n </VStack>\n </Box>\n\n <Box>\n <Heading as=\"h3\" size=\"md\" mb={4} fontFamily={fontHeading}>⚽ Informace o klubu</Heading>\n <VStack align=\"stretch\" spacing={4}>\n {!isManualClubDataMode && (\n <FormControl>\n <FormLabel>Hledat klub (FAČR)</FormLabel>\n <InputGroup>\n <Input value={clubQuery} onChange={(e) => setClubQuery(e.target.value)} placeholder=\"Hledejte podle názvu klubu\" />\n <InputRightElement>\n {searchLoading ? <Spinner size=\"sm\" /> : null}\n </InputRightElement>\n </InputGroup>\n {clubQuery && searchResults?.length > 0 && (\n <Box mt={2} borderWidth=\"1px\" borderRadius=\"md\" maxH=\"240px\" overflowY=\"auto\">\n <List spacing={0}>\n {searchResults.filter((r) => r.name && r.name.trim() !== '').slice(0, 8).map((r) => (\n <ListItem \n key={`${r.club_type}-${r.club_id}`} \n px={3} py={2} _hover={{ bg: 'gray.50', cursor: 'pointer' }}\n onClick={() => handleSelectClub(r)}\n >\n <HStack spacing={3}>\n {r.logo_url ? <Image src={resolveLogoUrl(r.logo_url)} alt={r.name} boxSize=\"24px\" objectFit=\"contain\" /> : null}\n <Box>\n <Text fontWeight=\"medium\">{r.name}</Text>\n <Text fontSize=\"sm\" color=\"gray.500\">{r.club_type}</Text>\n </Box>\n </HStack>\n </ListItem>\n ))}\n </List>\n </Box>\n )}\n </FormControl>\n )}\n {isManualClubDataMode && (\n <FormControl>\n <FormLabel>Odkaz na klub (fotbal.cz)</FormLabel>\n <Input\n value={clubLink}\n onChange={(e) => {\n const val = e.target.value;\n setClubLink(val);\n setClubUrl(val);\n }}\n onBlur={handleClubLinkBlur}\n placeholder=\"https://www.fotbal.cz/klub/… nebo www.fotbal.cz/futsal/klub/…\"\n />\n <FormHelperText fontSize=\"xs\">\n Vložte veřejný odkaz na váš klub z webu fotbal.cz / futsal.fotbal.cz. ID klubu a typ sportu se vyplní automaticky.\n </FormHelperText>\n </FormControl>\n )}\n <FormControl>\n <FormLabel>Typ klubu</FormLabel>\n <Input value={clubType} onChange={(e) => setClubType(e.target.value)} placeholder=\"football nebo futsal\" />\n </FormControl>\n <FormControl>\n <FormLabel>ID klubu</FormLabel>\n <Input value={clubId} onChange={(e) => setClubId(e.target.value)} placeholder=\"FAČR ID klubu\" />\n </FormControl>\n <FormControl>\n <FormLabel>Název klubu</FormLabel>\n <Input value={clubName} onChange={(e) => setClubName(e.target.value)} />\n </FormControl>\n <FormControl>\n <FormLabel>URL loga klubu</FormLabel>\n <Input id=\"clubLogoUrlInput\" value={clubLogoUrl} onChange={(e) => setClubLogoUrl(e.target.value)} />\n <HStack mt={2} spacing={3}>\n <Button as=\"label\" size=\"sm\" leftIcon={<InfoOutlineIcon />}>\n Nahrát logo\n <Input\n type=\"file\"\n display=\"none\"\n accept=\"image/*,image/svg+xml,application/pdf\"\n id=\"clubLogoFileInput\"\n onChange={(e) => {\n const f = e.target.files?.[0] || null;\n // Process selected file\n onLogoFile(f);\n // Important: reset input value so selecting the same file again fires onChange\n // This fixes the bug where uploading the same logo twice did nothing\n try { (e.target as HTMLInputElement).value = ''; } catch {}\n }}\n />\n </Button>\n {uploadingLogo ? <Text fontSize=\"sm\">Nahrávám…</Text> : null}\n </HStack>\n </FormControl>\n <FormControl>\n <FormLabel>URL klubu</FormLabel>\n <Input value={clubUrl} onChange={(e) => setClubUrl(e.target.value)} />\n </FormControl>\n <Box>\n <Text mb={2}>Náhled loga</Text>\n <Image src={resolveLogoUrl(clubLogoUrl) || (assetUrl('/dist/img/logo-club-empty.svg') as string)} alt=\"Logo preview\" maxH=\"80px\" objectFit=\"contain\" />\n </Box>\n </VStack>\n </Box>\n </SimpleGrid>\n\n {/* removed overall style preview per request */}\n\n <>\n <Divider my={6} />\n <Heading as=\"h3\" size=\"md\" mb={2} fontFamily={fontHeading}>🌐 Adresa webu</Heading>\n <Text fontSize=\"sm\" mb={3} color=\"gray.600\">Zadejte adresu, kde bude web dostupný.</Text>\n {!isDomainHost && (\n <Alert status=\"warning\" borderRadius=\"md\" mb={4}>\n <AlertIcon />\n <Box>\n <Text fontSize=\"sm\" fontWeight=\"medium\">Doporučujeme nastavit finální doménu</Text>\n <Text fontSize=\"sm\">Aktuálně používáte localhost/IP. Nastavení bez vlastní domény nemusí fungovat správně (CORS, cookies, přihlášení, galerie…). Doménu můžete doplnit nyní nebo kdykoli později v Nastavení nebo zde.</Text>\n </Box>\n </Alert>\n )}\n <VStack align=\"stretch\" spacing={4}>\n <FormControl isRequired>\n <FormLabel\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n sx={{ '.chakra-form__required-indicator': { display: 'none' } }}\n >\n <HStack spacing={1}>\n <Box>URL webu</Box>\n <Text as=\"span\" color=\"red.500\">*</Text>\n </HStack>\n <HelpTooltipCard\n label=\"Jak vyplnit\"\n title=\"Doporučení pro adresu webu\"\n items={[\n 'Použijte finální doménu klubu (např. https://www.vasklub.cz).',\n 'Nezadávejte /api API adresa se doplní automaticky.',\n 'V produkci vždy používejte zabezpečené HTTPS.',\n ]}\n />\n </FormLabel>\n <Input placeholder=\"https://www.vasklub.cz\" value={frontendBaseUrl} onChange={(e) => { const val = e.target.value; setFrontendBaseUrl(val); let h = ''; try { const u = /^https?:\\/\\//i.test(val) ? new URL(val) : new URL('https://' + val); h = u.hostname; } catch {} const isLocal = /^(localhost|127\\.0\\.0\\.1)$/i.test(h); const isIPv4 = /^\\d{1,3}(?:\\.\\d{1,3}){3}$/.test(h); const isDomain = !!h && !isLocal && !isIPv4; if (isDomain) { setShowAdvancedApi(true); if (!apiUrlTouched) { let base = (val || '').trim(); if (base && !/^https?:\\/\\//i.test(base)) base = 'https://' + base; try { const u2 = new URL(base); if (!/\\/api\\//.test(u2.pathname)) { u2.pathname = u2.pathname.replace(/\\/$/, '') + '/api/v1'; } setApiBaseUrl(u2.toString()); } catch { setApiBaseUrl(base.replace(/\\/$/, '') + '/api/v1'); } } } }} />\n </FormControl>\n <Checkbox isChecked={showAdvancedApi} onChange={(e) => setShowAdvancedApi(e.target.checked)}>Zadat vlastní API URL</Checkbox>\n {showAdvancedApi && (\n <FormControl>\n <FormLabel>API URL</FormLabel>\n <Input placeholder=\"https://api.vasklub.cz/api/v1\" value={apiBaseUrl} onChange={(e) => { setApiUrlTouched(true); setApiBaseUrl(e.target.value); }} />\n <FormHelperText>Výchozí: {frontendBaseUrl ? `${frontendBaseUrl.replace(/\\/$/, '')}/api/v1` : ''}</FormHelperText>\n </FormControl>\n )}\n </VStack>\n </>\n\n <Divider my={6} />\n\n <Heading as=\"h3\" size=\"md\" mb={2} fontFamily={fontHeading}>🎨 Barvy a vzhled webu</Heading>\n <Text fontSize=\"sm\" mb={3} color=\"gray.600\">Automaticky z loga (lze upravit). Vyberte jednu z předloh nebo barvy ručně dolaďte.</Text>\n\n {/* Preset selector */}\n {themePresets.length > 0 && (\n <Box mb={4}>\n <Text fontWeight=\"semibold\" mb={2}>Předlohy z loga</Text>\n <SimpleGrid columns={{ base: 1, md: 5 }} spacing={3}>\n {themePresets.map((p, i) => (\n <Box key={p.name + i} borderWidth={selectedPreset === i ? '2px' : '1px'} borderColor={selectedPreset === i ? 'blue.400' : 'gray.200'} borderRadius=\"md\" p={3} cursor=\"pointer\" onClick={() => applyPreset(i)}>\n <Box mb={2} display=\"flex\" gap=\"6px\" alignItems=\"center\">\n <Box flex=\"1\" h=\"48px\" borderRadius=\"6px\" bg={p.primary} display=\"flex\" alignItems=\"center\" justifyContent=\"center\" color={p.text}>{/* primary */}</Box>\n <Box w=\"48px\" h=\"48px\" borderRadius=\"6px\" bg={p.secondary} />\n <Box w=\"48px\" h=\"48px\" borderRadius=\"6px\" bg={p.accent} />\n </Box>\n <Text fontSize=\"sm\" fontWeight=\"semibold\">{p.name}</Text>\n <Text fontSize=\"xs\" color=\"gray.500\">Primární / Sekundární / Akcent</Text>\n </Box>\n ))}\n </SimpleGrid>\n <Button mt={3} variant=\"ghost\" onClick={regenerateFromLogo}>Znovu z loga</Button>\n </Box>\n )}\n <SimpleGrid columns={[1, 1, 2]} spacing={6}>\n <FormControl>\n <FormLabel>Primární\n <Tooltip label=\"Hlavní barva značky (tlačítka, odkazy, zvýraznění).\" hasArrow><InfoOutlineIcon ml={2} /></Tooltip>\n </FormLabel>\n <ColorPickerPopover\n value={primaryColor}\n onChange={(hex) => startTransition(() => setPrimaryColor(hex))}\n recentStorageKey=\"setup-theme\"\n />\n <Text fontSize=\"xs\" color=\"gray.500\" mt={1}>Používá se na hlavních prvcích.</Text>\n </FormControl>\n <FormControl>\n <FormLabel>Sekundární\n <Tooltip label=\"Doplňková barva pro méně důležité prvky a plochy.\" hasArrow><InfoOutlineIcon ml={2} /></Tooltip>\n </FormLabel>\n <ColorPickerPopover\n value={secondaryColor}\n onChange={(hex) => startTransition(() => setSecondaryColor(hex))}\n recentStorageKey=\"setup-theme\"\n />\n <Text fontSize=\"xs\" color=\"gray.500\" mt={1}>Podpůrné zvýraznění.</Text>\n </FormControl>\n <FormControl>\n <FormLabel>Akcent\n <Tooltip label=\"Kontrastní barva pro odznaky, štítky a malé akce.\" hasArrow><InfoOutlineIcon ml={2} /></Tooltip>\n </FormLabel>\n <ColorPickerPopover\n value={accentColor}\n onChange={(hex) => startTransition(() => setAccentColor(hex))}\n recentStorageKey=\"setup-theme\"\n />\n <Text fontSize=\"xs\" color=\"gray.500\" mt={1}>Menší prvky a upozornění.</Text>\n </FormControl>\n <FormControl>\n <FormLabel>Pozadí</FormLabel>\n <ColorPickerPopover\n value={backgroundColor}\n onChange={(hex) => startTransition(() => setBackgroundColor(hex))}\n recentStorageKey=\"setup-theme\"\n />\n <Text fontSize=\"xs\" color=\"gray.500\" mt={1}>Barva ploch stránky.</Text>\n </FormControl>\n <FormControl>\n <FormLabel>Text</FormLabel>\n <ColorPickerPopover\n value={textColor}\n onChange={(hex) => startTransition(() => setTextColor(hex))}\n recentStorageKey=\"setup-theme\"\n />\n <Text fontSize=\"xs\" color=\"gray.500\" mt={1}>Základní barva textu.</Text>\n </FormControl>\n </SimpleGrid>\n\n {/* Contrast warnings */}\n {!isBgTextAccessible && (\n <Alert status=\"warning\" mt={4} borderRadius=\"md\">\n <AlertIcon />\n Slabý kontrast textu vůči pozadí (poměr {bgTextContrast?.toFixed(2)}). Pro čitelnost upravte barvy nebo\n <Button variant=\"link\" colorScheme=\"blue\" ml={2} onClick={autofixTextForBg}>automaticky opravit barvu textu</Button>.\n </Alert>\n )}\n {primaryTextContrast !== null && primaryTextContrast < 4.5 && (\n <Alert status=\"warning\" mt={3} borderRadius=\"md\">\n <AlertIcon />\n Text na primární barvě má nízký kontrast (poměr {primaryTextContrast.toFixed(2)}). Zvažte jinou barvu textu nebo primární barvy.\n </Alert>\n )}\n\n <Divider my={6} />\n\n <Heading as=\"h3\" size=\"md\" mb={2} fontFamily={fontHeading}>📱 Sociální sítě a {t('homepage.gallery')}</Heading>\n <Text fontSize=\"sm\" mb={3} color=\"gray.600\">Zadejte odkazy na profily klubu a volitelně na {t('homepage.gallery').toLowerCase()}. Lze později upravit v administraci.</Text>\n <SimpleGrid columns={[1, 1, 2]} spacing={6} mb={2}>\n <FormControl>\n <FormLabel>Facebook URL</FormLabel>\n <Input placeholder=\"https://www.facebook.com/vas.klub\" value={facebookUrl} onChange={(e) => setFacebookUrl(e.target.value)} />\n </FormControl>\n <FormControl>\n <FormLabel>Instagram URL</FormLabel>\n <Input placeholder=\"https://www.instagram.com/vas.klub\" value={instagramUrl} onChange={(e) => setInstagramUrl(e.target.value)} />\n </FormControl>\n <FormControl>\n <FormLabel>YouTube URL</FormLabel>\n <Input placeholder=\"https://www.youtube.com/@vas_klub\" value={youtubeUrl} onChange={(e) => setYoutubeUrl(e.target.value)} />\n </FormControl>\n <FormControl>\n <FormLabel>URL {t('homepage.gallery')}</FormLabel>\n <Input placeholder=\"https://photos.example.com/club\" value={galleryUrl} onChange={(e) => setGalleryUrl(e.target.value)} />\n <FormHelperText>Můžete použít libovolný web (SmugMug, Flickr, Google Photos, Zonerama...).</FormHelperText>\n </FormControl>\n </SimpleGrid>\n\n <Divider my={6} />\n\n <Heading as=\"h3\" size=\"md\" mb={2} fontFamily={fontHeading}>✍️ Písmo a typografie</Heading>\n <Text fontSize=\"sm\" mb={3} color=\"gray.600\">Vyberte vzhled písma pro váš web. Náhled se aplikuje okamžitě na celou stránku.</Text>\n <Box mb={4}>\n <SimpleGrid columns={{ base: 1, md: 3 }} spacing={3}>\n {FONT_PAIRINGS.map((font) => (\n <Box \n key={font.id} \n borderWidth={selectedFont === font.id ? '2px' : '1px'} \n borderColor={selectedFont === font.id ? 'blue.400' : 'gray.200'} \n borderRadius=\"md\" \n p={3} \n cursor=\"pointer\" \n onClick={() => setSelectedFont(font.id)}\n >\n <VStack align=\"stretch\" spacing={2}>\n <HStack justify=\"space-between\">\n <Text fontSize=\"sm\" fontWeight=\"medium\">{font.name}</Text>\n <Badge colorScheme={getFontStyleColor(font.style)}>{font.style}</Badge>\n </HStack>\n <Text fontFamily={font.cssHeading} fontSize=\"lg\" fontWeight=\"bold\">Nadpis</Text>\n <Text fontFamily={font.cssBody} fontSize=\"sm\">Text běžného odstavce</Text>\n </VStack>\n </Box>\n ))}\n </SimpleGrid>\n <Text fontSize=\"xs\" color=\"gray.500\" mt={2}>Zobrazeno {FONT_PAIRINGS.length} dostupných stylů písma.</Text>\n </Box>\n\n <Divider my={6} />\n\n <Heading as=\"h3\" size=\"md\" mb={2} fontFamily={fontHeading}>📍 GPS poloha a mapa</Heading>\n <Text fontSize=\"sm\" mb={4} color=\"gray.600\">Nastavte polohu vašeho stadionu. Můžete vložit odkaz z mapy, nebo zadat souřadnice ručně. Vyberte také styl mapy.</Text>\n \n <Box mb={4}>\n <MapLinkImporter\n currentLatitude={typeof gpsLat === 'number' ? gpsLat : undefined}\n currentLongitude={typeof gpsLng === 'number' ? gpsLng : undefined}\n currentZoom={15}\n mapStyle={mapStyle}\n onMapStyleChange={setMapStyle}\n clubPrimaryColor={primaryColor}\n clubSecondaryColor={accentColor}\n clubName={clubName || 'Váš klub'}\n onImport={(coords: MapCoordinates) => {\n setGpsLat(coords.latitude);\n setGpsLng(coords.longitude);\n // Auto-fill address fields if available from geocoding\n if (coords.street) {\n setContactStreet(coords.street);\n } else if (coords.houseNumber && coords.city) {\n setContactStreet(`${coords.city} ${coords.houseNumber}`);\n }\n if (coords.city) setContactCity(coords.city);\n if (coords.zip) setContactPostalCode(coords.zip);\n if (coords.country) setContactCountry(coords.country);\n toast({\n title: 'Poloha importována',\n description: coords.city ? `GPS souřadnice a adresa (${coords.city}) načteny` : 'GPS souřadnice načteny',\n status: 'success',\n duration: 3000,\n });\n }}\n />\n </Box>\n\n <Divider my={6} />\n\n <Heading as=\"h3\" size=\"md\" mb={2} fontFamily={fontHeading}>📧 Kontaktní údaje</Heading>\n <Text fontSize=\"sm\" mb={3} color=\"gray.600\">Tyto údaje se automaticky vyplní při importu z mapy. Můžete je upravit nebo doplnit ručně.</Text>\n <SimpleGrid columns={[1, 1, 2]} spacing={4} mb={4}>\n <FormControl>\n <FormLabel>Adresa (ulice a číslo)</FormLabel>\n <Input placeholder=\"Hlavní 123\" value={contactStreet} onChange={(e) => setContactStreet(e.target.value)} />\n </FormControl>\n <FormControl>\n <FormLabel>Město</FormLabel>\n <Input placeholder=\"Krnov\" value={contactCity} onChange={(e) => setContactCity(e.target.value)} />\n </FormControl>\n <FormControl>\n <FormLabel>PSČ</FormLabel>\n <Input placeholder=\"794 01\" value={contactPostalCode} onChange={(e) => setContactPostalCode(e.target.value)} />\n </FormControl>\n <FormControl>\n <FormLabel>Země</FormLabel>\n <Input placeholder=\"Česká republika\" value={contactCountry} onChange={(e) => setContactCountry(e.target.value)} />\n </FormControl>\n <FormControl>\n <FormLabel>Telefon</FormLabel>\n <Input type=\"tel\" placeholder=\"+420 123 456 789\" value={contactPhone} onChange={(e) => setContactPhone(e.target.value)} />\n <FormHelperText>Hlavní kontaktní telefon klubu</FormHelperText>\n </FormControl>\n <FormControl>\n <FormLabel>E-mail</FormLabel>\n <Input type=\"email\" placeholder=\"kontakt@klub.cz\" value={contactEmail} onChange={(e) => setContactEmail(e.target.value)} onBlur={() => { if (!smtpUserEdited && isValidEmail(contactEmail)) { setSmtpUser(contactEmail); } }} />\n <FormHelperText>Hlavní kontaktní e-mail klubu</FormHelperText>\n </FormControl>\n </SimpleGrid>\n\n <Divider my={6} />\n\n <Heading as=\"h3\" size=\"md\" mb={4} fontFamily={fontHeading}>🔒 Zabezpečení a SMTP</Heading>\n <SimpleGrid columns={[1, 1, 2]} spacing={6}>\n <FormControl>\n <FormLabel display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n <Box>JWT tajemství</Box>\n <HelpTooltipCard\n label=\"Co je JWT tajemství\"\n title=\"JWT tajemství (secret key)\"\n items={[\n 'Používá se k podepisování přihlašovacích tokenů (JWT).',\n 'Udržujte ho v tajnosti nemělo by se sdílet ani posílat emailem.',\n 'Pokud si nejste jisti, použijte tlačítko „Vygenerovat bezpečné tajemství“.',\n ]}\n />\n </FormLabel>\n <Input value={jwtSecret} onChange={(e) => setJwtSecret(e.target.value)} placeholder=\"Ponechte prázdné pro stávající hodnotu\" />\n <FormHelperText>Tajný klíč pro přihlášení (JWT). Nechte prázdné pro ponechání stávající hodnoty.</FormHelperText>\n <Button mt={2} size=\"sm\" onClick={() => setJwtSecret(generateJwtSecret())}>Vygenerovat bezpečné tajemství</Button>\n </FormControl>\n <Box>\n <FormControl mb={3}>\n <FormLabel>SMTP hostitel</FormLabel>\n <Input value={smtpHost} onChange={(e) => setSmtpHost(e.target.value)} placeholder=\"smtp.example.com\" />\n </FormControl>\n <FormControl mb={3}>\n <FormLabel>SMTP port</FormLabel>\n <Input type=\"number\" value={smtpPort} onChange={(e) => setSmtpPort(e.target.value ? Number(e.target.value) : '')} placeholder=\"587\" />\n </FormControl>\n <FormControl mb={3}>\n <FormLabel>SMTP uživatelské jméno</FormLabel>\n <Input value={smtpUser} onChange={(e) => { setSmtpUser(e.target.value); setSmtpUserEdited(true); }} />\n </FormControl>\n <FormControl mb={3}>\n <FormLabel>SMTP heslo</FormLabel>\n <InputGroup>\n <Input type={showSmtpPass ? 'text' : 'password'} value={smtpPass} onChange={(e) => setSmtpPass(e.target.value)} />\n <InputRightElement width=\"4.5rem\">\n <Button h=\"1.75rem\" size=\"sm\" onClick={() => setShowSmtpPass((s) => !s)}>{showSmtpPass ? 'Skrýt' : 'Zobrazit'}</Button>\n </InputRightElement>\n </InputGroup>\n </FormControl>\n <FormControl mb={3}>\n <FormLabel>Jméno odesílatele</FormLabel>\n <Input value={smtpFromName} onChange={(e) => setSmtpFromName(e.target.value)} placeholder=\"Název klubu (např. Fotbal Club)\" />\n <FormHelperText>Jako adresu použijeme váš SMTP username (email). Zde vyplňte pouze zobrazované jméno.</FormHelperText>\n </FormControl>\n <Checkbox isChecked={smtpTLS} onChange={(e) => setSmtpTLS(e.target.checked)}>Použít TLS</Checkbox>\n <HStack mt={3} spacing={3}>\n <Button\n size=\"sm\"\n onClick={async () => {\n const host = smtpHost.trim();\n const port = typeof smtpPort === 'number' ? smtpPort : 0;\n if (!host || !port) {\n toast({ title: 'Zadejte SMTP host a port', status: 'warning' });\n return;\n }\n setTestingSMTP(true);\n try {\n // Compose From as \"Name <username>\" for validation, if possible\n const composedFrom = smtpFromName && smtpUser ? `${smtpFromName} <${smtpUser}>` : (smtpFromName || undefined);\n const res = await validateSMTP({\n host,\n port,\n username: smtpUser || undefined,\n password: smtpPass || undefined,\n from: composedFrom,\n use_tls: smtpTLS,\n });\n if (res.ok) {\n toast({ title: 'SMTP ověřeno', description: 'Připojení a případná autentizace proběhly v pořádku.', status: 'success' });\n } else {\n toast({ title: 'SMTP selhalo', description: res.error || 'Zkontrolujte prosím údaje (host, port, šifrování, jméno/heslo).', status: 'error', duration: 7000 });\n }\n } catch (e: any) {\n const msg = e?.response?.data?.error || e?.message || 'Neznámá chyba';\n toast({ title: 'SMTP selhalo', description: msg, status: 'error', duration: 7000 });\n } finally {\n setTestingSMTP(false);\n }\n }}\n isLoading={testingSMTP}\n >Otestovat SMTP</Button>\n <HelpTooltipCard\n label=\"Jak funguje test SMTP\"\n title=\"Jak funguje test SMTP\"\n items={[\n 'Neodesílá reálný email, pouze testuje spojení se serverem a případné přihlášení.',\n 'Pro port 465 obvykle použijte SSL (šifrované spojení).',\n 'Pro port 587 začněte s TLS/STARTTLS a ujistěte se, že uživatelské jméno a heslo odpovídají nastavení poskytovatele.',\n ]}\n />\n </HStack>\n <Alert status=\"info\" mt={4} borderRadius=\"md\">\n <AlertIcon />\n <Box>\n <Text fontWeight=\"medium\">Před dokončením nastavení otestujte SMTP připojení.</Text>\n <Text fontSize=\"sm\" mt={1}>Nejčastější chyba: nesprávné heslo. Ujistěte se, že heslo je zkopírováno přesně bez mezer.</Text>\n </Box>\n </Alert>\n </Box>\n </SimpleGrid>\n\n <Button type=\"submit\" colorScheme=\"blue\" mt={8} isLoading={submitting} loadingText=\"Ukládám…\">Dokončit nastavení</Button>\n </Box>\n {processingLogos && (\n <Box position=\"fixed\" top={0} left={0} right={0} bottom={0} bg=\"rgba(0,0,0,0.6)\" zIndex={9999} display=\"flex\" alignItems=\"center\" justifyContent=\"center\">\n <VStack spacing={3} bg={bg} p={8} borderRadius=\"xl\" boxShadow=\"xl\">\n <Spinner size=\"xl\" />\n <Heading size=\"md\">Připravuji klubová loga</Heading>\n <Text>Odstraňuji pozadí: {rembgDone}/{rembgTotal}</Text>\n <Text fontSize=\"sm\" color=\"gray.500\">Prosím vyčkejte, dokončuji přípravu webu…</Text>\n </VStack>\n </Box>\n )}\n </Box>\n );\n};\n\n// Lightweight preview of overall site style during setup\nconst SetupStylePreview: React.FC<{ styleKey: 'unified' | 'magazine' | 'pro' | 'edge' }> = ({ styleKey }) => {\n // Try to render a screenshot if present in /dist/img\n const [imgError, setImgError] = useState(false);\n const fileMap: Record<string, string> = {\n unified: 'style-unified.png',\n magazine: 'style-magazine.png',\n pro: 'style-pro.png',\n edge: 'style-edge.png',\n };\n const imgSrc = assetUrl(`/dist/img/${fileMap[styleKey] || fileMap.unified}`);\n\n if (!imgError && imgSrc) {\n return (\n <Box borderWidth=\"1px\" borderRadius=\"md\" overflow=\"hidden\">\n <Image src={imgSrc} alt={`Náhled stylu: ${styleKey}`} onError={() => setImgError(true)} width=\"100%\" objectFit=\"cover\" />\n </Box>\n );\n }\n\n if (styleKey === 'magazine') {\n return (\n <Box className=\"magazine\" borderRadius=\"md\" overflow=\"hidden\" borderWidth=\"1px\" borderColor=\"gray.200\">\n <Box className=\"mag-bars\" />\n <Box p={3}>\n <HStack justify=\"space-between\">\n <Text fontWeight=\"bold\">Magazínová hlavička</Text>\n <Text fontSize=\"sm\" color=\"gray.500\">2 barvy klubu</Text>\n </HStack>\n <SimpleGrid columns={{ base: 1, md: 3 }} spacing={2} mt={3}>\n <Box h=\"100px\" bg=\"gray.100\" borderRadius=\"md\" />\n <Box h=\"48px\" bg=\"gray.100\" borderRadius=\"md\" />\n <Box h=\"48px\" bg=\"gray.100\" borderRadius=\"md\" />\n </SimpleGrid>\n </Box>\n </Box>\n );\n }\n if (styleKey === 'pro') {\n return (\n <Box className=\"pro\" borderRadius=\"md\" overflow=\"hidden\" borderWidth=\"1px\" borderColor=\"gray.200\">\n <Box className=\"pro-hero\" height=\"120px\" position=\"relative\">\n <Box position=\"absolute\" inset={0} bg=\"gray.300\" />\n <Box position=\"absolute\" inset={0} display=\"flex\" alignItems=\"center\" justifyContent=\"center\">\n <Text fontWeight=\"bold\" color=\"white\">Fullscreen Hero (náhled)</Text>\n </Box>\n </Box>\n <Box p={3}>\n <SimpleGrid columns={{ base: 1, md: 3 }} spacing={3}>\n <Box borderWidth=\"1px\" borderRadius=\"md\" p={3}>Zápasy</Box>\n <Box borderWidth=\"1px\" borderRadius=\"md\" p={3}>Aktuality</Box>\n <Box borderWidth=\"1px\" borderRadius=\"md\" p={3}>Vstupenka</Box>\n </SimpleGrid>\n </Box>\n </Box>\n );\n }\n if (styleKey === 'edge') {\n return (\n <Box borderRadius=\"md\" overflow=\"hidden\" borderWidth=\"1px\" borderColor=\"gray.200\" p={3}>\n <Text fontWeight=\"bold\" mb={2}>Edge: Fullwidth minimal</Text>\n <Box h=\"80px\" bg=\"gray.200\" borderRadius=\"md\" mb={2} />\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={2}>\n <Box h=\"48px\" bg=\"gray.100\" borderRadius=\"md\" />\n <Box h=\"48px\" bg=\"gray.100\" borderRadius=\"md\" />\n </SimpleGrid>\n </Box>\n );\n }\n return (\n <Box borderWidth=\"1px\" borderRadius=\"md\" p={3}>\n <Text fontSize=\"sm\" color=\"gray.600\">Stávající styl (Unified): Grid hero, sekce Nejbližší zápas, tři sloupce a sponzoři.</Text>\n </Box>\n );\n};\n\nexport default SetupPage;\n","import React, { useState, useEffect } from 'react';\nimport {\n Box,\n Button,\n Container,\n Heading,\n HStack,\n VStack,\n Table,\n Thead,\n Tbody,\n Tr,\n Th,\n Td,\n Badge,\n IconButton,\n useDisclosure,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalFooter,\n ModalBody,\n ModalCloseButton,\n FormControl,\n FormLabel,\n Input,\n Textarea,\n Select,\n Switch,\n useToast,\n Spinner,\n Text,\n Alert,\n AlertIcon,\n Tabs,\n TabList,\n TabPanels,\n Tab,\n TabPanel,\n NumberInput,\n NumberInputField,\n NumberInputStepper,\n NumberIncrementStepper,\n NumberDecrementStepper,\n Menu,\n MenuButton,\n MenuList,\n MenuItem,\n Stat,\n StatLabel,\n StatNumber,\n StatHelpText,\n SimpleGrid,\n Card,\n CardBody,\n Image,\n AspectRatio,\n} from '@chakra-ui/react';\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { AddIcon, EditIcon, DeleteIcon, ChevronDownIcon, ViewIcon, CheckIcon, CloseIcon } from '@chakra-ui/icons';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport {\n getAdminPolls,\n createPoll,\n updatePoll,\n deletePoll,\n getPollStats,\n getPollVotes,\n Poll,\n CreatePollRequest,\n UpdatePollRequest,\n PollStats,\n PollVote,\n} from '../../services/polls';\nimport { getCachedYouTube, YouTubeVideo } from '../../services/youtube';\nimport { useConfirmDialog } from '../../contexts/ConfirmDialogContext';\nimport { Doughnut, Line, Bar } from 'react-chartjs-2';\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend, CategoryScale, LinearScale, PointElement, LineElement, BarElement } from 'chart.js';\n\nChartJS.register(ArcElement, Tooltip, Legend, CategoryScale, LinearScale, PointElement, LineElement, BarElement);\n\nconst PollsAdminPage: React.FC = () => {\n const toast = useToast();\n const queryClient = useQueryClient();\n const { confirm } = useConfirmDialog();\n const { isOpen, onOpen, onClose } = useDisclosure();\n const { isOpen: isStatsOpen, onOpen: onStatsOpen, onClose: onStatsClose } = useDisclosure();\n \n const [statusFilter, setStatusFilter] = useState<string>('');\n const [editingPoll, setEditingPoll] = useState<Poll | null>(null);\n const [selectedPollStats, setSelectedPollStats] = useState<PollStats | null>(null);\n \n // Video selector state\n const [clubVideos, setClubVideos] = useState<YouTubeVideo[]>([]);\n const [loadingVideos, setLoadingVideos] = useState(false);\n \n // Form state\n const [formData, setFormData] = useState<CreatePollRequest>({\n title: '',\n description: '',\n type: 'single',\n style: 'auto',\n status: 'draft',\n allow_multiple: false,\n max_choices: 1,\n show_results: 'after_vote',\n require_auth: false,\n allow_guest_vote: true,\n featured: false,\n options: [\n { text: '', display_order: 0 },\n { text: '', display_order: 1 },\n ],\n });\n\n // Fetch polls\n const { data: polls, isLoading } = useQuery({\n queryKey: ['admin-polls', statusFilter],\n queryFn: () => getAdminPolls(statusFilter ? { status: statusFilter } : undefined),\n });\n\n // Create mutation\n const createMutation = useMutation({\n mutationFn: createPoll,\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['admin-polls'] });\n toast({\n title: 'Anketa vytvořena',\n status: 'success',\n duration: 3000,\n });\n onClose();\n resetForm();\n },\n onError: (error: any) => {\n toast({\n title: 'Chyba',\n description: error.response?.data?.error || 'Nepodařilo se vytvořit anketu',\n status: 'error',\n duration: 5000,\n });\n },\n });\n\n // Update mutation\n const updateMutation = useMutation({\n mutationFn: ({ id, data }: { id: number; data: UpdatePollRequest }) =>\n updatePoll(id, data),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['admin-polls'] });\n toast({\n title: 'Anketa aktualizována',\n status: 'success',\n duration: 3000,\n });\n onClose();\n resetForm();\n },\n onError: (error: any) => {\n toast({\n title: 'Chyba',\n description: error.response?.data?.error || 'Nepodařilo se aktualizovat anketu',\n status: 'error',\n duration: 5000,\n });\n },\n });\n\n // Delete mutation\n const deleteMutation = useMutation({\n mutationFn: deletePoll,\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['admin-polls'] });\n toast({\n title: 'Anketa smazána',\n status: 'success',\n duration: 3000,\n });\n },\n onError: (error: any) => {\n toast({\n title: 'Chyba',\n description: error.response?.data?.error || 'Nepodařilo se smazat anketu',\n status: 'error',\n duration: 5000,\n });\n },\n });\n\n // Stats query\n const { data: statsData, isLoading: isLoadingStats } = useQuery({\n queryKey: ['poll-stats', selectedPollStats?.poll?.id],\n queryFn: () => getPollStats(selectedPollStats!.poll.id),\n enabled: !!selectedPollStats?.poll?.id,\n });\n\n // Votes list (admin details)\n const { data: votesData, isLoading: isLoadingVotes } = useQuery<PollVote[]>({\n queryKey: ['poll-votes', selectedPollStats?.poll?.id],\n queryFn: () => getPollVotes(selectedPollStats!.poll.id),\n enabled: !!selectedPollStats?.poll?.id,\n });\n\n const exportVotesCSV = () => {\n if (!votesData) return;\n const header = ['id','poll_id','option_id','option_text','user_id','user_email','user_first_name','user_last_name','voter_name','voter_email','session_token','created_at'];\n const rows = votesData.map(v => [\n v.id,\n v.poll_id,\n v.option_id,\n JSON.stringify(v.option_text || ''),\n v.user_id ?? '',\n v.user_email || '',\n v.user_first_name || '',\n v.user_last_name || '',\n v.voter_name || '',\n v.voter_email || '',\n v.session_token || '',\n v.created_at,\n ]);\n const csv = [header.join(','), ...rows.map(r => r.join(','))].join('\\n');\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `poll_${selectedPollStats?.poll?.id || ''}_votes.csv`;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n const resetForm = () => {\n setFormData({\n title: '',\n description: '',\n type: 'single',\n style: 'auto',\n status: 'draft',\n allow_multiple: false,\n max_choices: 1,\n show_results: 'after_vote',\n require_auth: false,\n allow_guest_vote: true,\n featured: false,\n options: [\n { text: '', display_order: 0 },\n { text: '', display_order: 1 },\n ],\n });\n setEditingPoll(null);\n };\n\n const handleOpenCreate = () => {\n resetForm();\n onOpen();\n };\n\n const applyPreset = (preset: 'rating5' | 'rating10' | 'attendance') => {\n if (preset === 'rating5') {\n const options = Array.from({ length: 5 }).map((_, i) => ({\n text: String(i + 1),\n display_order: i + 1,\n }));\n setFormData({\n title: 'Hodnocení zápasu',\n description: 'Ohodnoťte zápas (1 = nejhorší, 5 = nejlepší)',\n type: 'rating',\n style: 'rating-stars',\n status: 'active',\n allow_multiple: false,\n max_choices: 1,\n show_results: 'after_vote',\n require_auth: false,\n allow_guest_vote: true,\n featured: false,\n options,\n });\n } else if (preset === 'rating10') {\n const options = Array.from({ length: 10 }).map((_, i) => ({\n text: String(i + 1),\n display_order: i + 1,\n }));\n setFormData({\n title: 'Hodnocení zápasu (110)',\n description: 'Ohodnoťte zápas (1 = nejhorší, 10 = nejlepší)',\n type: 'rating',\n style: 'rating-scale',\n status: 'active',\n allow_multiple: false,\n max_choices: 1,\n show_results: 'after_vote',\n require_auth: false,\n allow_guest_vote: true,\n featured: false,\n options,\n });\n } else if (preset === 'attendance') {\n setFormData({\n title: 'Dorazíš na schůzku?',\n description: 'Dej nám vědět, zda dorazíš.',\n type: 'single',\n style: 'choices-chips',\n status: 'active',\n allow_multiple: false,\n max_choices: 1,\n show_results: 'after_vote',\n require_auth: false,\n allow_guest_vote: true,\n featured: false,\n options: [\n { text: 'Ano', display_order: 0 },\n { text: 'Ne', display_order: 1 },\n { text: 'Možná', display_order: 2 },\n ],\n });\n }\n onOpen();\n };\n\n const handleOpenEdit = (poll: Poll) => {\n setEditingPoll(poll);\n setFormData({\n title: poll.title,\n description: poll.description,\n type: poll.type,\n style: (poll as any).style || 'auto',\n status: poll.status,\n start_date: poll.start_date,\n end_date: poll.end_date,\n allow_multiple: poll.allow_multiple,\n max_choices: poll.max_choices,\n show_results: poll.show_results,\n require_auth: poll.require_auth,\n allow_guest_vote: poll.allow_guest_vote,\n featured: poll.featured,\n category_id: poll.category_id,\n related_match_id: poll.related_match_id,\n related_article_id: poll.related_article_id,\n related_event_id: poll.related_event_id,\n related_video_url: poll.related_video_url,\n image_url: poll.image_url,\n options: poll.options.map(opt => ({\n text: opt.text,\n description: opt.description,\n image_url: opt.image_url,\n display_order: opt.display_order,\n player_id: opt.player_id,\n })),\n });\n onOpen();\n };\n\n const handleSave = () => {\n if (formData.type !== 'rating') {\n const invalidOptions = formData.options.filter(\n (opt) => !opt.text || opt.text.trim() === ''\n );\n if (invalidOptions.length > 0) {\n toast({\n title: 'Chyba',\n description: 'Všechny možnosti musí mít vyplněný text',\n status: 'error',\n duration: 3000,\n });\n return;\n }\n }\n\n if (editingPoll) {\n updateMutation.mutate({ id: editingPoll.id, data: formData });\n } else {\n createMutation.mutate(formData);\n }\n };\n\n const handleDelete = async (id: number) => {\n const ok = await confirm({\n title: 'Smazat anketu',\n message: 'Opravdu chcete smazat tuto anketu?',\n confirmText: 'Smazat',\n cancelText: 'Zrušit',\n isDanger: true,\n });\n if (!ok) return;\n deleteMutation.mutate(id);\n };\n\n const handleViewStats = async (poll: Poll) => {\n try {\n const stats = await getPollStats(poll.id);\n setSelectedPollStats(stats);\n onStatsOpen();\n } catch (error: any) {\n toast({\n title: 'Chyba',\n description: 'Nepodařilo se načíst statistiky',\n status: 'error',\n duration: 3000,\n });\n }\n };\n\n const addOption = () => {\n setFormData({\n ...formData,\n options: [\n ...formData.options,\n { text: '', display_order: formData.options.length },\n ],\n });\n };\n\n const removeOption = (index: number) => {\n if (formData.options.length > 2) {\n setFormData({\n ...formData,\n options: formData.options.filter((_, i) => i !== index),\n });\n }\n };\n\n const updateOption = (index: number, field: string, value: any) => {\n const newOptions = [...formData.options];\n newOptions[index] = { ...newOptions[index], [field]: value };\n setFormData({ ...formData, options: newOptions });\n };\n\n // Load club videos when modal opens\n useEffect(() => {\n if (isOpen && clubVideos.length === 0) {\n setLoadingVideos(true);\n getCachedYouTube()\n .then((data) => {\n if (data?.videos) {\n setClubVideos(data.videos);\n }\n })\n .catch(() => {\n toast({\n title: 'Chyba',\n description: 'Nepodařilo se načíst videa',\n status: 'error',\n duration: 3000,\n });\n })\n .finally(() => {\n setLoadingVideos(false);\n });\n }\n }, [isOpen, clubVideos.length, toast]);\n\n // Keep rating polls consistent: enforce style and auto-generate options\n useEffect(() => {\n if (formData.type !== 'rating') return;\n const currentStyle = (formData as any).style || 'auto';\n const desiredStyle = currentStyle === 'rating-scale' ? 'rating-scale' : 'rating-stars';\n const count = desiredStyle === 'rating-scale' ? 10 : 5;\n const optionsMatch =\n formData.options.length === count &&\n formData.options.every((opt, idx) => String(opt.text) === String(idx + 1));\n\n if (\n currentStyle !== desiredStyle ||\n formData.allow_multiple ||\n (formData.max_choices || 1) !== 1 ||\n !optionsMatch\n ) {\n setFormData({\n ...formData,\n style: desiredStyle as any,\n allow_multiple: false,\n max_choices: 1,\n options: Array.from({ length: count }).map((_, i) => ({\n text: String(i + 1),\n display_order: i,\n })),\n });\n }\n }, [formData.type, (formData as any).style, formData.options, formData.allow_multiple, formData.max_choices]);\n\n const getStatusBadge = (status: string) => {\n const colorMap: Record<string, string> = {\n draft: 'gray',\n active: 'green',\n closed: 'orange',\n archived: 'red',\n };\n return <Badge colorScheme={colorMap[status] || 'gray'}>{status}</Badge>;\n };\n\n if (isLoading) {\n return (\n <AdminLayout>\n <Container maxW=\"7xl\" py={8}>\n <VStack spacing={4}>\n <Spinner size=\"xl\" />\n <Text>Načítání anket...</Text>\n </VStack>\n </Container>\n </AdminLayout>\n );\n }\n\n return (\n <AdminLayout>\n <Container maxW=\"7xl\" py={8}>\n <VStack spacing={6} align=\"stretch\">\n <HStack justify=\"space-between\">\n <Heading size=\"lg\">Správa anket</Heading>\n <HStack>\n <Menu>\n <MenuButton as={Button} rightIcon={<ChevronDownIcon />} variant=\"outline\">\n Předvolby\n </MenuButton>\n <MenuList>\n <MenuItem onClick={() => applyPreset('rating5')}>Hodnocení zápasu (5 hvězd)</MenuItem>\n <MenuItem onClick={() => applyPreset('rating10')}>Hodnocení zápasu (110)</MenuItem>\n <MenuItem onClick={() => applyPreset('attendance')}>Dorazíš na schůzku?</MenuItem>\n </MenuList>\n </Menu>\n <Button leftIcon={<AddIcon />} colorScheme=\"blue\" onClick={handleOpenCreate}>\n Nová anketa\n </Button>\n </HStack>\n </HStack>\n\n <Alert status=\"info\">\n <AlertIcon />\n <Box>\n <Text fontWeight=\"bold\">Ankety a hlasování</Text>\n <Text fontSize=\"sm\">\n Vytvořte interaktivní ankety pro fanoušky - Hráč zápasu, předpověď výsledku, designové ankety a další.\n </Text>\n </Box>\n </Alert>\n\n <HStack>\n <Select\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value)}\n maxW=\"200px\"\n >\n <option value=\"\">Všechny stavy</option>\n <option value=\"draft\">Koncepty</option>\n <option value=\"active\">Aktivní</option>\n <option value=\"closed\">Uzavřené</option>\n <option value=\"archived\">Archivované</option>\n </Select>\n </HStack>\n\n <Box overflowX=\"auto\">\n <Table variant=\"simple\">\n <Thead>\n <Tr>\n <Th>Název</Th>\n <Th>Typ</Th>\n <Th>Stav</Th>\n <Th>Počet hlasů</Th>\n <Th>Vytvořeno</Th>\n <Th>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {polls?.map((poll) => (\n <Tr key={poll.id} opacity={poll.status === 'draft' ? 0.6 : 1}>\n <Td>\n <VStack align=\"start\" spacing={0}>\n <Text fontWeight=\"bold\">{poll.title}</Text>\n {poll.featured && <Badge colorScheme=\"purple\">Zvýrazněná</Badge>}\n </VStack>\n </Td>\n <Td>{poll.type}</Td>\n <Td>{getStatusBadge(poll.status)}</Td>\n <Td>{poll.total_votes}</Td>\n <Td>{new Date(poll.created_at).toLocaleDateString('cs-CZ')}</Td>\n <Td>\n <HStack spacing={2}>\n <IconButton\n aria-label=\"Statistiky\"\n icon={<ViewIcon />}\n size=\"sm\"\n onClick={() => handleViewStats(poll)}\n />\n <IconButton\n aria-label=\"Upravit\"\n icon={<EditIcon />}\n size=\"sm\"\n onClick={() => handleOpenEdit(poll)}\n />\n <IconButton\n aria-label=\"Smazat\"\n icon={<DeleteIcon />}\n size=\"sm\"\n colorScheme=\"red\"\n onClick={() => handleDelete(poll.id)}\n />\n </HStack>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n\n {polls?.length === 0 && (\n <Alert status=\"info\">\n <AlertIcon />\n Zatím nemáte žádné ankety. Vytvořte první anketu pomocí tlačítka výše.\n </Alert>\n )}\n </VStack>\n\n {/* Create/Edit Modal */}\n <Modal isOpen={isOpen} onClose={onClose} size=\"4xl\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>\n {editingPoll ? 'Upravit anketu' : 'Nová anketa'}\n </ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <Tabs>\n <TabList>\n <Tab>Základní</Tab>\n {formData.type !== 'rating' && <Tab>Možnosti</Tab>}\n <Tab>Nastavení</Tab>\n </TabList>\n\n <TabPanels>\n {/* Basic Info Tab */}\n <TabPanel>\n <VStack spacing={4}>\n <HStack w=\"full\" justify=\"space-between\">\n <Text fontWeight=\"semibold\">Doporučené předvolby</Text>\n <HStack>\n <Button size=\"sm\" onClick={() => applyPreset('rating5')}>Hodnocení (5 hvězd)</Button>\n <Button size=\"sm\" onClick={() => applyPreset('rating10')}>Hodnocení (110)</Button>\n <Button size=\"sm\" onClick={() => applyPreset('attendance')}>Docházka</Button>\n </HStack>\n </HStack>\n <FormControl isRequired>\n <FormLabel>Název ankety</FormLabel>\n <Input\n value={formData.title}\n onChange={(e) =>\n setFormData({ ...formData, title: e.target.value })\n }\n placeholder=\"Např. Hráč zápasu\"\n />\n </FormControl>\n\n <FormControl>\n <FormLabel>Popis</FormLabel>\n <Textarea\n value={formData.description}\n onChange={(e) =>\n setFormData({ ...formData, description: e.target.value })\n }\n placeholder=\"Volitelný popis ankety\"\n />\n </FormControl>\n\n <SimpleGrid columns={3} spacing={4} w=\"full\">\n <FormControl>\n <FormLabel>Typ</FormLabel>\n <Select\n value={formData.type}\n onChange={(e) =>\n setFormData({ ...formData, type: e.target.value as any })\n }\n >\n <option value=\"single\">Jedna volba</option>\n <option value=\"multiple\">Více voleb</option>\n <option value=\"rating\">Hodnocení</option>\n </Select>\n </FormControl>\n\n <FormControl>\n <FormLabel>Stav</FormLabel>\n <Select\n value={formData.status}\n onChange={(e) =>\n setFormData({ ...formData, status: e.target.value as any })\n }\n >\n <option value=\"draft\">Koncept</option>\n <option value=\"active\">Aktivní</option>\n <option value=\"closed\">Uzavřená</option>\n <option value=\"archived\">Archivovaná</option>\n </Select>\n </FormControl>\n\n <FormControl>\n <FormLabel>Styl</FormLabel>\n <Select\n value={(formData as any).style || 'auto'}\n onChange={(e) => setFormData({ ...formData, style: e.target.value as any })}\n >\n <option value=\"auto\">Automaticky</option>\n {formData.type === 'rating' ? (\n <>\n <option value=\"rating-stars\">Hvězdičky</option>\n <option value=\"rating-scale\">Číselná stupnice</option>\n </>\n ) : (\n <>\n <option value=\"choices-list\">Seznam</option>\n <option value=\"choices-chips\">Štítky</option>\n <option value=\"choices-cards\">Karty</option>\n </>\n )}\n </Select>\n </FormControl>\n </SimpleGrid>\n\n {formData.type === 'rating' && (\n <Box w=\"full\" borderWidth=\"1px\" borderRadius=\"md\" p={3} bg=\"gray.50\">\n <Text fontSize=\"sm\" mb={2}>Možnosti se generují automaticky podle stylu:</Text>\n <Text fontSize=\"sm\">\n {Array.from({ length: ((formData as any).style === 'rating-scale' ? 10 : 5) })\n .map((_, i) => String(i + 1))\n .join(', ')}\n </Text>\n </Box>\n )}\n\n <SimpleGrid columns={2} spacing={4} w=\"full\">\n <FormControl>\n <FormLabel>Datum zahájení</FormLabel>\n <Input\n type=\"datetime-local\"\n value={formData.start_date || ''}\n onChange={(e) =>\n setFormData({ ...formData, start_date: e.target.value })\n }\n />\n </FormControl>\n\n <FormControl>\n <FormLabel>Datum ukončení</FormLabel>\n <Input\n type=\"datetime-local\"\n value={formData.end_date || ''}\n onChange={(e) =>\n setFormData({ ...formData, end_date: e.target.value })\n }\n />\n </FormControl>\n </SimpleGrid>\n\n <FormControl>\n <FormLabel>Video z klubového kanálu (volitelné)</FormLabel>\n <Text fontSize=\"sm\" color=\"gray.500\" mb={2}>\n Připojte anketu k videu z vašeho YouTube kanálu\n </Text>\n {loadingVideos ? (\n <HStack>\n <Spinner size=\"sm\" />\n <Text fontSize=\"sm\">Načítání videí...</Text>\n </HStack>\n ) : clubVideos.length === 0 ? (\n <Alert status=\"info\" size=\"sm\">\n <AlertIcon />\n <Text fontSize=\"sm\">Žádná videa nenalezena. Přidejte videa v Nastavení → Videa.</Text>\n </Alert>\n ) : (\n <VStack spacing={3} align=\"stretch\">\n <Select\n value={formData.related_video_url || ''}\n onChange={(e) =>\n setFormData({ ...formData, related_video_url: e.target.value })\n }\n placeholder=\"Vyberte video (nebo nechte prázdné)\"\n >\n {clubVideos.map((video) => (\n <option \n key={video.video_id} \n value={`https://www.youtube.com/watch?v=${video.video_id}`}\n >\n {video.title} {video.published_text ? `(${video.published_text})` : ''}\n </option>\n ))}\n </Select>\n {formData.related_video_url && (\n <Box borderWidth=\"1px\" borderRadius=\"md\" p={2}>\n <Text fontSize=\"sm\" fontWeight=\"semibold\" mb={2}>Náhled vybraného videa:</Text>\n {(() => {\n const selectedVideo = clubVideos.find(\n v => `https://www.youtube.com/watch?v=${v.video_id}` === formData.related_video_url\n );\n if (selectedVideo) {\n return (\n <HStack spacing={3}>\n <Image \n src={selectedVideo.thumbnail_url} \n alt={selectedVideo.title}\n boxSize=\"120px\"\n objectFit=\"cover\"\n borderRadius=\"md\"\n />\n <VStack align=\"start\" spacing={1}>\n <Text fontSize=\"sm\" fontWeight=\"medium\">{selectedVideo.title}</Text>\n {selectedVideo.published_text && (\n <Badge size=\"sm\">{selectedVideo.published_text}</Badge>\n )}\n </VStack>\n </HStack>\n );\n }\n return null;\n })()}\n </Box>\n )}\n </VStack>\n )}\n <Text fontSize=\"xs\" color=\"gray.500\" mt={2}>\n Poznámka: Propojení s články a aktivitami se nastavuje přímo v editoru článku/aktivity.\n </Text>\n </FormControl>\n </VStack>\n </TabPanel>\n\n {/* Options Tab */}\n {formData.type !== 'rating' && (\n <TabPanel>\n <VStack spacing={4} align=\"stretch\">\n {formData.options.map((option, index) => (\n <Card key={index}>\n <CardBody>\n <HStack align=\"start\">\n <VStack flex={1} spacing={3}>\n <FormControl isRequired>\n <FormLabel>Možnost {index + 1}</FormLabel>\n <Input\n value={option.text}\n onChange={(e) =>\n updateOption(index, 'text', e.target.value)\n }\n placeholder=\"Text možnosti\"\n />\n </FormControl>\n <FormControl>\n <FormLabel>Popis (volitelné)</FormLabel>\n <Input\n value={option.description || ''}\n onChange={(e) =>\n updateOption(index, 'description', e.target.value)\n }\n placeholder=\"Doplňující informace\"\n />\n </FormControl>\n </VStack>\n {formData.options.length > 2 && (\n <IconButton\n aria-label=\"Odstranit možnost\"\n icon={<DeleteIcon />}\n colorScheme=\"red\"\n variant=\"ghost\"\n onClick={() => removeOption(index)}\n />\n )}\n </HStack>\n </CardBody>\n </Card>\n ))}\n\n <Button\n leftIcon={<AddIcon />}\n onClick={addOption}\n variant=\"outline\"\n colorScheme=\"blue\"\n >\n Přidat možnost\n </Button>\n </VStack>\n </TabPanel>\n )}\n\n {/* Settings Tab */}\n <TabPanel>\n <VStack spacing={4}>\n {formData.type !== 'rating' && (\n <FormControl display=\"flex\" alignItems=\"center\">\n <FormLabel mb=\"0\">Povolit více voleb</FormLabel>\n <Switch\n isChecked={formData.allow_multiple}\n onChange={(e) =>\n setFormData({ ...formData, allow_multiple: e.target.checked })\n }\n />\n </FormControl>\n )}\n\n {formData.type !== 'rating' && formData.allow_multiple && (\n <FormControl>\n <FormLabel>Max. počet voleb</FormLabel>\n <NumberInput\n value={formData.max_choices}\n min={1}\n max={formData.options.length}\n onChange={(_, num) =>\n setFormData({ ...formData, max_choices: num })\n }\n >\n <NumberInputField />\n <NumberInputStepper>\n <NumberIncrementStepper />\n <NumberDecrementStepper />\n </NumberInputStepper>\n </NumberInput>\n </FormControl>\n )}\n\n <FormControl>\n <FormLabel>Zobrazení výsledků</FormLabel>\n <Select\n value={formData.show_results}\n onChange={(e) =>\n setFormData({ ...formData, show_results: e.target.value as any })\n }\n >\n <option value=\"always\">Vždy</option>\n <option value=\"after_vote\">Po hlasování</option>\n <option value=\"after_end\">Po ukončení</option>\n <option value=\"never\">Nikdy (pouze admin)</option>\n </Select>\n </FormControl>\n\n <FormControl display=\"flex\" alignItems=\"center\">\n <FormLabel mb=\"0\">Vyžadovat přihlášení</FormLabel>\n <Switch\n isChecked={formData.require_auth}\n onChange={(e) =>\n setFormData({ ...formData, require_auth: e.target.checked })\n }\n />\n </FormControl>\n\n <FormControl display=\"flex\" alignItems=\"center\">\n <FormLabel mb=\"0\">Povolit hlasování hostů</FormLabel>\n <Switch\n isChecked={formData.allow_guest_vote}\n onChange={(e) =>\n setFormData({ ...formData, allow_guest_vote: e.target.checked })\n }\n />\n </FormControl>\n\n <FormControl display=\"flex\" alignItems=\"center\">\n <FormLabel mb=\"0\">Zvýraznit na hlavní stránce</FormLabel>\n <Switch\n isChecked={formData.featured}\n onChange={(e) =>\n setFormData({ ...formData, featured: e.target.checked })\n }\n />\n </FormControl>\n </VStack>\n </TabPanel>\n </TabPanels>\n </Tabs>\n </ModalBody>\n\n <ModalFooter>\n <Button variant=\"ghost\" mr={3} onClick={onClose}>\n Zrušit\n </Button>\n <Button\n colorScheme=\"blue\"\n onClick={handleSave}\n isLoading={createMutation.isPending || updateMutation.isPending}\n >\n {editingPoll ? 'Uložit' : 'Vytvořit'}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n {/* Stats Modal */}\n <Modal isOpen={isStatsOpen} onClose={onStatsClose} size=\"4xl\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Statistiky ankety</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n {isLoadingStats ? (\n <VStack py={8}>\n <Spinner size=\"xl\" />\n <Text>Načítání statistik...</Text>\n </VStack>\n ) : statsData ? (\n <VStack spacing={6} align=\"stretch\">\n <SimpleGrid columns={3} spacing={4}>\n <Stat>\n <StatLabel>Celkem hlasů</StatLabel>\n <StatNumber>{statsData.poll.total_votes}</StatNumber>\n </Stat>\n <Stat>\n <StatLabel>Přihlášení uživatelé</StatLabel>\n <StatNumber>{statsData.authenticated_votes}</StatNumber>\n <StatHelpText>\n {statsData.poll.total_votes > 0\n ? `${Math.round((statsData.authenticated_votes / statsData.poll.total_votes) * 100)}%`\n : '0%'}\n </StatHelpText>\n </Stat>\n <Stat>\n <StatLabel>Hosté</StatLabel>\n <StatNumber>{statsData.guest_votes}</StatNumber>\n <StatHelpText>\n {statsData.poll.total_votes > 0\n ? `${Math.round((statsData.guest_votes / statsData.poll.total_votes) * 100)}%`\n : '0%'}\n </StatHelpText>\n </Stat>\n </SimpleGrid>\n\n <Box>\n <Heading size=\"sm\" mb={4}>\n Výsledky\n </Heading>\n <VStack spacing={2} align=\"stretch\">\n {(statsData.poll.options || []).map((option) => {\n const percentage =\n statsData.poll.total_votes > 0\n ? (option.vote_count / statsData.poll.total_votes) * 100\n : 0;\n return (\n <Box key={option.id}>\n <HStack justify=\"space-between\" mb={1}>\n <Text fontWeight=\"medium\">{option.text}</Text>\n <Text fontSize=\"sm\" color=\"gray.500\">\n {option.vote_count} hlasů ({percentage.toFixed(1)}%)\n </Text>\n </HStack>\n <Box\n w=\"full\"\n h=\"8px\"\n bg=\"gray.200\"\n borderRadius=\"full\"\n overflow=\"hidden\"\n >\n <Box\n h=\"full\"\n bg=\"blue.500\"\n w={`${percentage}%`}\n transition=\"width 0.3s\"\n />\n </Box>\n </Box>\n );\n })}\n </VStack>\n </Box>\n\n {(statsData.votes_by_day?.length ?? 0) > 0 && (\n <Box>\n <Heading size=\"sm\" mb={4}>\n Hlasy podle dnů\n </Heading>\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={6}>\n <Box>\n <VStack spacing={2} align=\"stretch\">\n {(statsData.votes_by_day || []).map((day) => (\n <HStack key={day.date} justify=\"space-between\">\n <Text>{new Date(day.date).toLocaleDateString('cs-CZ')}</Text>\n <Badge>{day.count} hlasů</Badge>\n </HStack>\n ))}\n </VStack>\n </Box>\n <Box>\n <Line\n data={{\n labels: (statsData.votes_by_day || []).map(d => new Date(d.date).toLocaleDateString('cs-CZ')),\n datasets: [\n {\n label: 'Hlasy',\n data: (statsData.votes_by_day || []).map(d => d.count),\n borderColor: '#3182ce',\n backgroundColor: 'rgba(49,130,206,0.2)',\n tension: 0.3,\n },\n ],\n }}\n options={{ responsive: true, plugins: { legend: { display: false } } }}\n />\n </Box>\n </SimpleGrid>\n </Box>\n )}\n\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={6}>\n <Box>\n <Heading size=\"sm\" mb={3}>Složení hlasujících</Heading>\n <Doughnut\n data={{\n labels: ['Přihlášení', 'Hosté'],\n datasets: [\n {\n data: [statsData.authenticated_votes, statsData.guest_votes],\n backgroundColor: ['#2f855a', '#718096'],\n },\n ],\n }}\n options={{ plugins: { legend: { position: 'bottom' } } }}\n />\n </Box>\n <Box>\n <Heading size=\"sm\" mb={3}>Rozdělení hlasů podle možností</Heading>\n <Bar\n data={{\n labels: (statsData.poll.options || []).map(o => o.text),\n datasets: [\n {\n label: 'Hlasy',\n data: (statsData.poll.options || []).map(o => o.vote_count),\n backgroundColor: '#3182ce',\n },\n ],\n }}\n options={{\n responsive: true,\n plugins: { legend: { display: false } },\n scales: { y: { beginAtZero: true, ticks: { precision: 0 } } },\n }}\n />\n </Box>\n </SimpleGrid>\n\n <Box>\n <HStack justify=\"space-between\" mb={3}>\n <Heading size=\"sm\">Hlasující</Heading>\n <Button size=\"sm\" onClick={exportVotesCSV} isDisabled={!votesData || votesData.length === 0}>Export CSV</Button>\n </HStack>\n {isLoadingVotes ? (\n <HStack><Spinner size=\"sm\" /><Text>Načítání hlasů...</Text></HStack>\n ) : (votesData && votesData.length > 0) ? (\n <Box overflowX=\"auto\">\n <Table size=\"sm\" variant=\"simple\">\n <Thead>\n <Tr>\n <Th>Datum</Th>\n <Th>Jméno</Th>\n <Th>E-mail</Th>\n <Th>Typ</Th>\n <Th>Možnost</Th>\n <Th>Session</Th>\n </Tr>\n </Thead>\n <Tbody>\n {votesData.slice(0, 100).map((v) => {\n const name = v.voter_name || ((v.user_first_name || '') + ' ' + (v.user_last_name || '')).trim();\n const email = v.voter_email || v.user_email || '';\n const type = v.user_id ? 'Přihlášený' : 'Host';\n const session = (v.session_token || '').slice(-8);\n return (\n <Tr key={v.id}>\n <Td>{new Date(v.created_at).toLocaleString('cs-CZ')}</Td>\n <Td>{name || '-'}</Td>\n <Td>{email || '-'}</Td>\n <Td><Badge colorScheme={v.user_id ? 'green' : 'gray'}>{type}</Badge></Td>\n <Td>{v.option_text}</Td>\n <Td>{session}</Td>\n </Tr>\n );\n })}\n </Tbody>\n </Table>\n {votesData.length > 100 && (\n <Text fontSize=\"xs\" color=\"gray.500\" mt={2}>Zobrazeno 100 z {votesData.length} hlasů</Text>\n )}\n </Box>\n ) : (\n <Text fontSize=\"sm\" color=\"gray.500\">Žádné hlasy k zobrazení.</Text>\n )}\n </Box>\n </VStack>\n ) : null}\n </ModalBody>\n\n <ModalFooter>\n <Button onClick={onStatsClose}>Zavřít</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </Container>\n </AdminLayout>\n );\n};\n\nexport default PollsAdminPage;\n","/**\n * Utility functions for processing AI-generated content\n */\n\n/**\n * Clean AI-generated text by removing excessive newlines and normalizing spacing\n * @param text - Raw AI-generated text\n * @returns Cleaned text with proper formatting\n */\nexport function cleanAIText(text: string): string {\n if (!text || typeof text !== 'string') {\n return '';\n }\n\n return text\n // Remove unwanted characters (• bullet points and other special chars)\n .replace(/•/g, '')\n // Fix spacing before <strong> tags - add space before <strong> if there's no space\n .replace(/(\\S)(?=<strong>)/g, '$1 ')\n // Remove ALL newline characters completely\n .replace(/\\n/g, '')\n // Clean up multiple spaces\n .replace(/\\s{2,}/g, ' ')\n // Remove leading/trailing whitespace\n .trim();\n}\n\n/**\n * Round percentage values to whole numbers\n * @param percentage - Percentage value (can be decimal)\n * @returns Rounded whole number percentage\n */\nexport function roundPercentage(percentage: number): number {\n if (typeof percentage !== 'number' || isNaN(percentage)) {\n return 0;\n }\n return Math.round(Math.max(0, Math.min(100, percentage)));\n}\n\n/**\n * Process AI-generated content with both text cleaning and percentage rounding\n * @param content - Raw content from AI\n * @param options - Processing options\n * @returns Processed content\n */\nexport interface ProcessAIContentOptions {\n cleanText?: boolean;\n roundPercentages?: boolean;\n preserveHtmlTags?: boolean;\n}\n\nexport function processAIContent(\n content: string,\n options: ProcessAIContentOptions = {\n cleanText: true,\n roundPercentages: true,\n preserveHtmlTags: false\n }\n): string {\n if (!content || typeof content !== 'string') {\n return '';\n }\n\n let processed = content;\n\n // Clean text if requested\n if (options.cleanText) {\n if (options.preserveHtmlTags) {\n // Preserve HTML tags while cleaning text around them\n processed = processed\n .replace(/>([^<]+)</g, (_, text) => {\n const cleaned = text\n .replace(/•/g, '')\n // Fix spacing before <strong> tags\n .replace(/(\\S)(?=<strong>)/g, '$1 ')\n // Remove ALL newline characters completely\n .replace(/\\n/g, '')\n .replace(/\\s{2,}/g, ' ')\n .trim();\n return `>${cleaned}<`;\n });\n } else {\n processed = cleanAIText(processed);\n }\n }\n\n // Round percentages if requested\n if (options.roundPercentages) {\n processed = processed.replace(/(\\d+(?:\\.\\d+)?)%/g, (_, match) => {\n const percentage = parseFloat(match);\n return `${roundPercentage(percentage)}%`;\n });\n }\n\n return processed;\n}\n\n/**\n * Extract and round all percentage values from text\n * @param text - Text containing percentages\n * @returns Array of rounded percentage values\n */\nexport function extractPercentages(text: string): number[] {\n if (!text || typeof text !== 'string') {\n return [];\n }\n\n const matches = text.match(/(\\d+(?:\\.\\d+)?)%/g);\n if (!matches) {\n return [];\n }\n\n return matches.map(match => {\n const percentage = parseFloat(match.replace('%', ''));\n return roundPercentage(percentage);\n });\n}\n\n/**\n * Format AI response for display with proper Czech localization\n * @param text - AI response text\n * @param model - AI model used for generation\n * @returns Formatted response\n */\nexport function formatAIResponse(text: string, model?: string): string {\n const cleaned = cleanAIText(text);\n \n // Add model attribution if provided\n if (model) {\n return `${cleaned}\\n\\n— ${model}`;\n }\n \n return cleaned;\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Button, Center, HStack, Heading, Image, SimpleGrid, Text, useColorModeValue, useToast, VStack, Badge } from '@chakra-ui/react';\nimport AdminLayout from '@/layouts/AdminLayout';\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport { getAdminScoreboard, updateAdminScoreboard, ScoreboardState, startTimer, pauseTimer, resetTimer, startSecondHalf } from '@/services/scoreboard';\n\nconst MobileScoreboardControlPage: React.FC = () => {\n const toast = useToast();\n const qc = useQueryClient();\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderCol = useColorModeValue('gray.200', 'gray.700');\n\n const { data: state, isLoading } = useQuery<ScoreboardState>({\n queryKey: ['admin-scoreboard-mobile'],\n queryFn: getAdminScoreboard,\n refetchInterval: (data: any) => (data?.running ? 1000 : false),\n staleTime: 500,\n });\n\n const setPartial = async (patch: Partial<ScoreboardState>) => {\n try {\n await updateAdminScoreboard(patch);\n await qc.invalidateQueries({ queryKey: ['admin-scoreboard-mobile'] });\n } catch (e) {\n toast({ title: 'Uložení selhalo', status: 'error' });\n }\n };\n\n // Use backend timer; control via API and reflect state via polling\n const handleStartTimer = async () => {\n await startTimer();\n await qc.invalidateQueries({ queryKey: ['admin-scoreboard-mobile'] });\n };\n\n const handlePauseTimer = async () => {\n await pauseTimer();\n await qc.invalidateQueries({ queryKey: ['admin-scoreboard-mobile'] });\n };\n\n const handleResetTimer = async () => {\n await resetTimer();\n await qc.invalidateQueries({ queryKey: ['admin-scoreboard-mobile'] });\n };\n\n const mmss = useMemo(() => {\n return state?.timer || '00:00';\n }, [state?.timer]);\n\n if (isLoading || !state) {\n return (\n <AdminLayout requireAdmin={false}>\n <Center minH=\"50vh\">Načítání…</Center>\n </AdminLayout>\n );\n }\n\n return (\n <AdminLayout requireAdmin={false}>\n <Box p={3}>\n <Heading size=\"md\" mb={3}>Mobilní ovládání tabule</Heading>\n <VStack align=\"stretch\" spacing={3}>\n <Box borderWidth=\"1px\" borderColor={borderCol} bg={cardBg} borderRadius=\"lg\" p={{ base: 3, md: 4 }}>\n <VStack spacing={3} align=\"stretch\">\n <HStack justify=\"space-between\" align=\"center\" flexWrap=\"wrap\">\n <Text fontSize={{ base: '4xl', md: '5xl' }} fontWeight=\"black\" lineHeight=\"1\">{state.homeScore} : {state.awayScore}</Text>\n <Text fontSize={{ base: '3xl', md: '4xl' }} fontFamily=\"mono\" fontWeight=\"semibold\">{mmss}</Text>\n </HStack>\n <HStack spacing={2} wrap=\"wrap\">\n <Button size=\"lg\" colorScheme={state.running ? 'red' : 'green'} onClick={() => (state.running ? handlePauseTimer() : handleStartTimer())}>\n {state.running ? 'Stop' : 'Start'}\n </Button>\n <Button size=\"lg\" variant=\"outline\" onClick={handleResetTimer}>Reset</Button>\n <Button size=\"lg\" colorScheme=\"purple\" onClick={async ()=>{ try { await startSecondHalf(); await qc.invalidateQueries({ queryKey: ['admin-scoreboard-mobile'] }); toast({ title: 'Začal 2. poločas', status: 'success' }); } catch { toast({ title: 'Akce selhala', status: 'error' }); } }}>\n Začít 2. poločas\n </Button>\n <Badge ml=\"auto\" colorScheme=\"purple\" fontSize={{ base: 'sm', md: 'md' }}>Poločas: {state.half || 1}</Badge>\n </HStack>\n </VStack>\n </Box>\n\n <SimpleGrid columns={{ base: 1, sm: 2 }} spacing={3} alignItems=\"stretch\">\n <VStack spacing={3} borderWidth=\"1px\" borderColor={borderCol} bg={cardBg} borderRadius=\"lg\" p={{ base: 3, md: 4 }} align=\"stretch\">\n {state.homeLogo ? <Image src={state.homeLogo} alt=\"DOM\" boxSize={{ base: '56px', md: '64px' }} objectFit=\"contain\" alignSelf=\"center\" /> : null}\n <Text fontWeight=\"bold\" textAlign=\"center\">{state.homeShort || 'DOM'}</Text>\n <HStack justify=\"center\">\n <Button size=\"lg\" onClick={() => setPartial({ homeScore: Math.max(0, (state.homeScore || 0) - 1) })}></Button>\n <Button size=\"lg\" colorScheme=\"green\" onClick={() => setPartial({ homeScore: (state.homeScore || 0) + 1 })}>+</Button>\n </HStack>\n <HStack justify=\"center\">\n <Button size=\"sm\" onClick={() => setPartial({ homeFouls: Math.max(0, Math.min(5, (state.homeFouls || 0) - 1)) })}> Faul</Button>\n <Text fontWeight=\"semibold\">{Math.max(0, Math.min(5, state.homeFouls || 0))}</Text>\n <Button size=\"sm\" colorScheme=\"orange\" onClick={() => setPartial({ homeFouls: Math.max(0, Math.min(5, (state.homeFouls || 0) + 1)) })}>+ Faul</Button>\n </HStack>\n </VStack>\n\n <VStack spacing={3} borderWidth=\"1px\" borderColor={borderCol} bg={cardBg} borderRadius=\"lg\" p={{ base: 3, md: 4 }} align=\"stretch\">\n {state.awayLogo ? <Image src={state.awayLogo} alt=\"HOS\" boxSize={{ base: '56px', md: '64px' }} objectFit=\"contain\" alignSelf=\"center\" /> : null}\n <Text fontWeight=\"bold\" textAlign=\"center\">{state.awayShort || 'HOS'}</Text>\n <HStack justify=\"center\">\n <Button size=\"lg\" onClick={() => setPartial({ awayScore: Math.max(0, (state.awayScore || 0) - 1) })}></Button>\n <Button size=\"lg\" colorScheme=\"green\" onClick={() => setPartial({ awayScore: (state.awayScore || 0) + 1 })}>+</Button>\n </HStack>\n <HStack justify=\"center\">\n <Button size=\"sm\" onClick={() => setPartial({ awayFouls: Math.max(0, Math.min(5, (state.awayFouls || 0) - 1)) })}> Faul</Button>\n <Text fontWeight=\"semibold\">{Math.max(0, Math.min(5, state.awayFouls || 0))}</Text>\n <Button size=\"sm\" colorScheme=\"orange\" onClick={() => setPartial({ awayFouls: Math.max(0, Math.min(5, (state.awayFouls || 0) + 1)) })}>+ Faul</Button>\n </HStack>\n </VStack>\n </SimpleGrid>\n </VStack>\n\n {/* Removed 'Vybraný zápas' section for remote managed on main Tabule page */}\n </Box>\n </AdminLayout>\n );\n};\n\nexport default MobileScoreboardControlPage;\n","import api from '../api';\nimport { RewardItem } from '../../services/engagement';\nimport type { LeaderboardResponse } from '../../services/engagement';\n\nexport type AdminRewardItem = RewardItem & {\n active: boolean;\n stock: number;\n metadata?: Record<string, any>;\n created_at?: string;\n updated_at?: string;\n};\n\nexport type AdminRewardsResponse = { items: AdminRewardItem[] };\n\nexport async function adminListRewards(params?: { active?: boolean }): Promise<AdminRewardItem[]> {\n const res = await api.get('/admin/engagement/rewards', { params });\n return (res.data as AdminRewardsResponse).items || [];\n}\n\nexport async function adminCreateReward(body: {\n name: string;\n type: string;\n cost_points: number;\n image_url?: string;\n stock?: number;\n active?: boolean;\n metadata?: Record<string, any>;\n}): Promise<AdminRewardItem> {\n const res = await api.post('/admin/engagement/rewards', body);\n return res.data as AdminRewardItem;\n}\n\nexport async function adminUpdateReward(id: number, body: Partial<{\n name: string;\n type: string;\n cost_points: number;\n image_url: string;\n stock: number;\n active: boolean;\n metadata: Record<string, any>;\n}>): Promise<{ ok: boolean }>{\n const res = await api.put(`/admin/engagement/rewards/${id}`, body);\n return res.data as { ok: boolean };\n}\n\nexport async function adminDeleteReward(id: number): Promise<{ ok: boolean }>{\n const res = await api.delete(`/admin/engagement/rewards/${id}`);\n return res.data as { ok: boolean };\n}\n\nexport type AdminRedemption = {\n id: number;\n user_id: number;\n reward_id: number;\n status: 'pending'|'approved'|'rejected'|'fulfilled'|string;\n created_at?: string;\n};\n\nexport type AdminRedemptionsResponse = { items: AdminRedemption[] };\n\nexport async function adminListRedemptions(params?: { status?: string }): Promise<AdminRedemption[]> {\n const res = await api.get('/admin/engagement/redemptions', { params });\n return (res.data as AdminRedemptionsResponse).items || [];\n}\n\nexport async function adminUpdateRedemptionStatus(id: number, action: 'approve'|'reject'|'fulfill'): Promise<{ ok: boolean; status: string }>{\n const res = await api.patch(`/admin/engagement/redemptions/${id}`, { action });\n return res.data as { ok: boolean; status: string };\n}\n\nexport async function adminGetLeaderboard(metric: 'points'|'level'|'xp' = 'points', limit?: number): Promise<LeaderboardResponse> {\n const res = await api.get('/admin/engagement/leaderboard', { params: { metric, limit } });\n return res.data as LeaderboardResponse;\n}\n\nexport type AdminPointsTx = {\n id: number;\n user_id: number;\n delta: number;\n xp_delta?: number;\n reason: string;\n meta?: Record<string, any>;\n created_at: string;\n};\n\nexport async function adminListTransactions(params?: { user_id?: number|string; reason?: string; limit?: number }): Promise<AdminPointsTx[]> {\n const res = await api.get('/admin/engagement/transactions', { params });\n return (res.data?.items || []) as AdminPointsTx[];\n}\n\nexport async function adminAdjustPoints(body: { user_id: number; delta: number; reason?: string; meta?: Record<string, any>; current_password?: string }): Promise<{ ok: boolean }>{\n const res = await api.post('/admin/engagement/adjust', body);\n return res.data as { ok: boolean };\n}\n\nexport type AdminUserProfile = {\n user_id: number;\n first_name?: string;\n last_name?: string;\n email?: string;\n role?: string;\n points: number;\n level: number;\n xp: number;\n username?: string;\n avatar_url?: string;\n animated_avatar_url?: string;\n avatar_upload_unlocked?: boolean;\n};\n\nexport async function adminGetUserProfile(user_id: number | string): Promise<AdminUserProfile> {\n const res = await api.get(`/admin/engagement/profile/${user_id}`);\n return res.data as AdminUserProfile;\n}\n\nexport type AdminUserListItem = {\n id: number;\n email: string;\n name: string;\n role: string;\n isActive: boolean;\n createdAt: string;\n};\n\nexport async function adminListUsers(): Promise<AdminUserListItem[]> {\n const res = await api.get('/admin/users');\n return (res.data || []) as AdminUserListItem[];\n}\n","import { useEffect, useState } from 'react';\nimport axios from 'axios';\nimport { API_URL } from '../services/api';\nimport { useLocation } from 'react-router-dom';\nimport { trackEvent as trackAnalyticsEvent } from '../services/analyticsService';\n\ninterface UmamiConfig {\n enabled: boolean;\n website_id: string;\n script_url: string;\n}\n\n// Extend window object to include umami\ndeclare global {\n interface Window {\n umami?: {\n track: (eventName: string, eventData?: Record<string, any>) => void;\n };\n }\n}\n\nexport const useUmami = () => {\n const [config, setConfig] = useState<UmamiConfig | null>(null);\n const [isLoaded, setIsLoaded] = useState(false);\n const location = useLocation();\n\n // Helper to check if current path is an admin route or system page\n const isAdminRoute = (pathname: string) => {\n return pathname.startsWith('/admin') || \n pathname === '/login' || \n pathname === '/setup';\n };\n\n useEffect(() => {\n // Don't load Umami for admin pages\n if (isAdminRoute(location.pathname)) {\n console.log('Umami tracking disabled for admin pages');\n return;\n }\n\n // Fetch Umami configuration from backend\n const fetchConfig = async () => {\n try {\n const response = await axios.get(`${API_URL}/insights/config`);\n const umamiConfig = response.data as UmamiConfig;\n setConfig(umamiConfig);\n\n // If enabled and not already loaded, inject the script\n if (umamiConfig.enabled && umamiConfig.website_id && !isLoaded) {\n loadUmamiScript(umamiConfig.script_url, umamiConfig.website_id);\n }\n } catch (error) {\n console.error('Failed to load Umami config:', error);\n }\n };\n\n fetchConfig();\n }, [location.pathname]);\n\n // Track page views when location changes (skip admin routes for Umami)\n useEffect(() => {\n if (location.pathname && !isAdminRoute(location.pathname)) {\n // Track with our analytics backend (public pages only)\n trackAnalyticsEvent({\n event_type: 'page_view',\n page_path: location.pathname,\n page_name: document.title,\n }).catch(err => {\n console.debug('Analytics tracking failed:', err);\n });\n }\n }, [location.pathname]);\n\n const loadUmamiScript = (scriptUrl: string, websiteId: string) => {\n // Check if script already exists\n const existingScript = document.querySelector(`script[data-website-id=\"${websiteId}\"]`);\n if (existingScript) {\n setIsLoaded(true);\n return;\n }\n\n // Create and inject the script\n const script = document.createElement('script');\n script.async = true;\n script.defer = true;\n script.src = scriptUrl;\n script.setAttribute('data-website-id', websiteId);\n\n script.onload = () => {\n console.log('Umami tracking loaded');\n setIsLoaded(true);\n };\n\n script.onerror = () => {\n console.error('Failed to load Umami script');\n };\n\n document.head.appendChild(script);\n };\n\n // Track custom events (skip admin routes)\n const trackEvent = (eventName: string, eventData?: Record<string, any>) => {\n // Skip tracking for admin routes\n if (isAdminRoute(location.pathname)) {\n return;\n }\n\n // Track with Umami if available\n if (window.umami && isLoaded) {\n window.umami.track(eventName, eventData);\n }\n\n // Also track with our backend analytics\n trackAnalyticsEvent({\n event_type: eventName,\n page: location.pathname,\n data: eventData,\n }).catch(err => {\n console.debug('Backend tracking failed:', err);\n });\n };\n\n return {\n isEnabled: config?.enabled || false,\n isLoaded,\n trackEvent,\n };\n};\n","import React, { useState, useEffect } from 'react';\nimport {\n Box,\n Heading,\n Table,\n Thead,\n Tbody,\n Tr,\n Th,\n Td,\n Button,\n Input,\n Select,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalFooter,\n ModalBody,\n ModalCloseButton,\n FormControl,\n FormLabel,\n Textarea,\n useToast,\n HStack,\n VStack,\n Text,\n Badge,\n IconButton,\n Tooltip,\n useDisclosure,\n Flex,\n Spacer,\n InputGroup,\n InputLeftElement,\n} from '@chakra-ui/react';\nimport { FaEdit, FaTrash, FaPlus, FaSearch, FaGlobe } from 'react-icons/fa';\nimport { api } from '../../services/api';\n\ninterface Language {\n id: string;\n name: string;\n native_name: string;\n code: string;\n is_default: boolean;\n is_active: boolean;\n sort_order: number;\n}\n\ninterface Translation {\n id: number;\n key: string;\n language_code: string;\n value: string;\n context: string;\n language?: Language;\n}\n\nconst I18nAdminPage: React.FC = () => {\n const [languages, setLanguages] = useState<Language[]>([]);\n const [translations, setTranslations] = useState<Translation[]>([]);\n const [selectedLanguage, setSelectedLanguage] = useState<string>('');\n const [selectedContext, setSelectedContext] = useState<string>('');\n const [searchTerm, setSearchTerm] = useState<string>('');\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [total, setTotal] = useState<number>(0);\n const [currentPage, setCurrentPage] = useState<number>(1);\n const [pageSize] = useState<number>(50);\n \n // Modal states\n const { isOpen: isLangModalOpen, onOpen: onLangModalOpen, onClose: onLangModalClose } = useDisclosure();\n const { isOpen: isTransModalOpen, onOpen: onTransModalOpen, onClose: onTransModalClose } = useDisclosure();\n const [editingItem, setEditingItem] = useState<any>(null);\n \n const toast = useToast();\n\n // Fetch languages\n const fetchLanguages = async () => {\n try {\n const response = await api.get('/admin/i18n/languages');\n setLanguages(response.data.languages);\n } catch (error) {\n toast({\n title: 'Chyba při načítání jazyků',\n description: 'Nepodařilo se načíst seznam jazyků',\n status: 'error',\n duration: 3000,\n });\n }\n };\n\n // Fetch translations\n const fetchTranslations = async () => {\n setIsLoading(true);\n try {\n const params = new URLSearchParams({\n page: currentPage.toString(),\n limit: pageSize.toString(),\n });\n \n if (selectedLanguage) params.append('language', selectedLanguage);\n if (selectedContext) params.append('context', selectedContext);\n \n const response = await api.get(`/admin/i18n/translations?${params}`);\n setTranslations(response.data.translations);\n setTotal(response.data.total);\n } catch (error) {\n toast({\n title: 'Chyba při načítání překladů',\n description: 'Nepodařilo se načíst seznam překladů',\n status: 'error',\n duration: 3000,\n });\n } finally {\n setIsLoading(false);\n }\n };\n\n // Save language\n const saveLanguage = async (languageData: Partial<Language>) => {\n try {\n if (editingItem?.id) {\n await api.put(`/admin/i18n/languages/${editingItem.id}`, languageData);\n toast({\n title: 'Jazyk aktualizován',\n description: 'Jazyk byl úspěšně aktualizován',\n status: 'success',\n duration: 3000,\n });\n } else {\n await api.post('/admin/i18n/languages', languageData);\n toast({\n title: 'Jazyk vytvořen',\n description: 'Nový jazyk byl úspěšně vytvořen',\n status: 'success',\n duration: 3000,\n });\n }\n await fetchLanguages();\n onLangModalClose();\n setEditingItem(null);\n } catch (error) {\n toast({\n title: 'Chyba při ukládání jazyka',\n description: 'Nepodařilo se uložit jazyk',\n status: 'error',\n duration: 3000,\n });\n }\n };\n\n // Save translation\n const saveTranslation = async (translationData: Partial<Translation>) => {\n try {\n if (editingItem?.id) {\n await api.put(`/admin/i18n/translations/${editingItem.id}`, translationData);\n toast({\n title: 'Překlad aktualizován',\n description: 'Překlad byl úspěšně aktualizován',\n status: 'success',\n duration: 3000,\n });\n } else {\n await api.post('/admin/i18n/translations', translationData);\n toast({\n title: 'Překlad vytvořen',\n description: 'Nový překlad byl úspěšně vytvořen',\n status: 'success',\n duration: 3000,\n });\n }\n await fetchTranslations();\n onTransModalClose();\n setEditingItem(null);\n } catch (error) {\n toast({\n title: 'Chyba při ukládání překladu',\n description: 'Nepodařilo se uložit překlad',\n status: 'error',\n duration: 3000,\n });\n }\n };\n\n // Delete language\n const deleteLanguage = async (id: string) => {\n if (!confirm('Opravdu chcete smazat tento jazyk?')) return;\n \n try {\n await api.delete(`/admin/i18n/languages/${id}`);\n toast({\n title: 'Jazyk smazán',\n description: 'Jazyk byl úspěšně smazán',\n status: 'success',\n duration: 3000,\n });\n await fetchLanguages();\n } catch (error) {\n toast({\n title: 'Chyba při mazání jazyka',\n description: 'Nepodařilo se smazat jazyk',\n status: 'error',\n duration: 3000,\n });\n }\n };\n\n // Delete translation\n const deleteTranslation = async (id: number) => {\n if (!confirm('Opravdu chcete smazat tento překlad?')) return;\n \n try {\n await api.delete(`/admin/i18n/translations/${id}`);\n toast({\n title: 'Překlad smazán',\n description: 'Překlad byl úspěšně smazán',\n status: 'success',\n duration: 3000,\n });\n await fetchTranslations();\n } catch (error) {\n toast({\n title: 'Chyba při mazání překladu',\n description: 'Nepodařilo se smazat překlad',\n status: 'error',\n duration: 3000,\n });\n }\n };\n\n // Filter translations\n const filteredTranslations = translations.filter(translation => {\n const matchesSearch = translation.key.toLowerCase().includes(searchTerm.toLowerCase()) ||\n translation.value.toLowerCase().includes(searchTerm.toLowerCase());\n return matchesSearch;\n });\n\n useEffect(() => {\n fetchLanguages();\n }, []);\n\n useEffect(() => {\n fetchTranslations();\n }, [selectedLanguage, selectedContext, currentPage]);\n\n return (\n <Box p={6}>\n <VStack spacing={6} align=\"stretch\">\n <Flex justify=\"space-between\" align=\"center\">\n <Heading size=\"lg\" display=\"flex\" alignItems=\"center\" gap={2}>\n <FaGlobe />\n Správa překladů\n </Heading>\n <HStack spacing={2}>\n <Button colorScheme=\"blue\" onClick={onLangModalOpen} leftIcon={<FaPlus />}>\n Přidat jazyk\n </Button>\n <Button colorScheme=\"green\" onClick={onTransModalOpen} leftIcon={<FaPlus />}>\n Přidat překlad\n </Button>\n </HStack>\n </Flex>\n\n {/* Languages Section */}\n <Box bg=\"white\" p={6} borderRadius=\"lg\" shadow=\"sm\">\n <Heading size=\"md\" mb={4}>Jazyky</Heading>\n <Table>\n <Thead>\n <Tr>\n <Th>Kód</Th>\n <Th>Název</Th>\n <Th>Domorodý název</Th>\n <Th>Výchozí</Th>\n <Th>Aktivní</Th>\n <Th>Pořadí</Th>\n <Th>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {languages.map((lang) => (\n <Tr key={lang.id}>\n <Td>\n <Badge colorScheme={lang.is_default ? 'blue' : 'gray'}>\n {lang.code}\n </Badge>\n </Td>\n <Td>{lang.name}</Td>\n <Td>{lang.native_name}</Td>\n <Td>\n <Badge colorScheme={lang.is_default ? 'green' : 'gray'}>\n {lang.is_default ? 'Ano' : 'Ne'}\n </Badge>\n </Td>\n <Td>\n <Badge colorScheme={lang.is_active ? 'green' : 'red'}>\n {lang.is_active ? 'Ano' : 'Ne'}\n </Badge>\n </Td>\n <Td>{lang.sort_order}</Td>\n <Td>\n <HStack spacing={2}>\n <Tooltip label=\"Upravit\">\n <IconButton\n aria-label=\"Upravit\"\n icon={<FaEdit />}\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditingItem(lang);\n onLangModalOpen();\n }}\n />\n </Tooltip>\n {!lang.is_default && (\n <Tooltip label=\"Smazat\">\n <IconButton\n aria-label=\"Smazat\"\n icon={<FaTrash />}\n size=\"sm\"\n variant=\"ghost\"\n colorScheme=\"red\"\n onClick={() => deleteLanguage(lang.id)}\n />\n </Tooltip>\n )}\n </HStack>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n\n {/* Translations Section */}\n <Box bg=\"white\" p={6} borderRadius=\"lg\" shadow=\"sm\">\n <VStack spacing={4} align=\"stretch\" mb={6}>\n <Heading size=\"md\">Překlady</Heading>\n \n {/* Filters */}\n <HStack spacing={4}>\n <Select\n placeholder=\"Všechny jazyky\"\n value={selectedLanguage}\n onChange={(e) => setSelectedLanguage(e.target.value)}\n maxW=\"200px\"\n >\n {languages.map((lang) => (\n <option key={lang.code} value={lang.code}>\n {lang.native_name}\n </option>\n ))}\n </Select>\n \n <Select\n placeholder=\"Všechny kontexty\"\n value={selectedContext}\n onChange={(e) => setSelectedContext(e.target.value)}\n maxW=\"200px\"\n >\n <option value=\"common\">Obecné</option>\n <option value=\"nav\">Navigace</option>\n <option value=\"admin\">Admin</option>\n <option value=\"form\">Formuláře</option>\n <option value=\"content\">Obsah</option>\n <option value=\"match\">Zápasy</option>\n <option value=\"team\">Týmy</option>\n <option value=\"gallery\">Galerie</option>\n <option value=\"search\">Vyhledávání</option>\n <option value=\"pagination\">Stránkování</option>\n <option value=\"date\">Datum</option>\n <option value=\"auth\">Autentizace</option>\n <option value=\"error\">Chyby</option>\n </Select>\n \n <InputGroup maxW=\"300px\">\n <InputLeftElement>\n <FaSearch />\n </InputLeftElement>\n <Input\n placeholder=\"Hledat překlad...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n />\n </InputGroup>\n </HStack>\n </VStack>\n\n <Table>\n <Thead>\n <Tr>\n <Th>Klíč</Th>\n <Th>Jazyk</Th>\n <Th>Hodnota</Th>\n <Th>Kontext</Th>\n <Th>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {isLoading ? (\n <Tr>\n <Td colSpan={5} textAlign=\"center\">\n <Text>Načítání...</Text>\n </Td>\n </Tr>\n ) : filteredTranslations.length === 0 ? (\n <Tr>\n <Td colSpan={5} textAlign=\"center\">\n <Text>Žádné překlady</Text>\n </Td>\n </Tr>\n ) : (\n filteredTranslations.map((translation) => (\n <Tr key={translation.id}>\n <Td>\n <Text fontFamily=\"mono\" fontSize=\"sm\">\n {translation.key}\n </Text>\n </Td>\n <Td>\n <Badge colorScheme=\"blue\">\n {translation.language_code}\n </Badge>\n </Td>\n <Td>\n <Text maxW=\"300px\" noOfLines={2}>\n {translation.value}\n </Text>\n </Td>\n <Td>\n <Badge colorScheme=\"gray\">\n {translation.context || '—'}\n </Badge>\n </Td>\n <Td>\n <HStack spacing={2}>\n <Tooltip label=\"Upravit\">\n <IconButton\n aria-label=\"Upravit\"\n icon={<FaEdit />}\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditingItem(translation);\n onTransModalOpen();\n }}\n />\n </Tooltip>\n <Tooltip label=\"Smazat\">\n <IconButton\n aria-label=\"Smazat\"\n icon={<FaTrash />}\n size=\"sm\"\n variant=\"ghost\"\n colorScheme=\"red\"\n onClick={() => deleteTranslation(translation.id)}\n />\n </Tooltip>\n </HStack>\n </Td>\n </Tr>\n ))\n )}\n </Tbody>\n </Table>\n\n {/* Pagination */}\n {total > pageSize && (\n <Flex justify=\"center\" mt={4}>\n <HStack spacing={2}>\n <Button\n onClick={() => setCurrentPage(Math.max(1, currentPage - 1))}\n isDisabled={currentPage === 1}\n >\n Předchozí\n </Button>\n <Text>\n Strana {currentPage} z {Math.ceil(total / pageSize)}\n </Text>\n <Button\n onClick={() => setCurrentPage(Math.min(Math.ceil(total / pageSize), currentPage + 1))}\n isDisabled={currentPage >= Math.ceil(total / pageSize)}\n >\n Další\n </Button>\n </HStack>\n </Flex>\n )}\n </Box>\n </VStack>\n\n {/* Language Modal */}\n <Modal isOpen={isLangModalOpen} onClose={onLangModalClose}>\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>\n {editingItem?.id ? 'Upravit jazyk' : 'Přidat jazyk'}\n </ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack spacing={4}>\n <FormControl isRequired>\n <FormLabel>ID</FormLabel>\n <Input\n defaultValue={editingItem?.id || ''}\n placeholder=\"cs, en, de...\"\n />\n </FormControl>\n <FormControl isRequired>\n <FormLabel>Název</FormLabel>\n <Input\n defaultValue={editingItem?.name || ''}\n placeholder=\"Czech, English...\"\n />\n </FormControl>\n <FormControl isRequired>\n <FormLabel>Domorodý název</FormLabel>\n <Input\n defaultValue={editingItem?.native_name || ''}\n placeholder=\"Čeština, English...\"\n />\n </FormControl>\n <FormControl isRequired>\n <FormLabel>Kód</FormLabel>\n <Input\n defaultValue={editingItem?.code || ''}\n placeholder=\"cs, en, de...\"\n />\n </FormControl>\n <FormControl>\n <FormLabel>Pořadí</FormLabel>\n <Input\n type=\"number\"\n defaultValue={editingItem?.sort_order || 0}\n />\n </FormControl>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" onClick={onLangModalClose}>\n Zrušit\n </Button>\n <Button\n colorScheme=\"blue\"\n onClick={() => {\n const form = document.querySelector('form') as HTMLFormElement;\n const formData = new FormData(form);\n const data = Object.fromEntries(formData.entries());\n saveLanguage(data);\n }}\n >\n Uložit\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n {/* Translation Modal */}\n <Modal isOpen={isTransModalOpen} onClose={onTransModalClose}>\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>\n {editingItem?.id ? 'Upravit překlad' : 'Přidat překlad'}\n </ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack spacing={4}>\n <FormControl isRequired>\n <FormLabel>Klíč</FormLabel>\n <Input\n defaultValue={editingItem?.key || ''}\n placeholder=\"nav.home, form.required...\"\n />\n </FormControl>\n <FormControl isRequired>\n <FormLabel>Jazyk</FormLabel>\n <Select\n defaultValue={editingItem?.language_code || ''}\n >\n {languages.map((lang) => (\n <option key={lang.code} value={lang.code}>\n {lang.native_name}\n </option>\n ))}\n </Select>\n </FormControl>\n <FormControl isRequired>\n <FormLabel>Hodnota</FormLabel>\n <Textarea\n defaultValue={editingItem?.value || ''}\n placeholder=\"Přeložený text...\"\n rows={3}\n />\n </FormControl>\n <FormControl>\n <FormLabel>Kontext</FormLabel>\n <Select\n defaultValue={editingItem?.context || ''}\n >\n <option value=\"\">Žádný</option>\n <option value=\"common\">Obecné</option>\n <option value=\"nav\">Navigace</option>\n <option value=\"admin\">Admin</option>\n <option value=\"form\">Formuláře</option>\n <option value=\"content\">Obsah</option>\n <option value=\"match\">Zápasy</option>\n <option value=\"team\">Týmy</option>\n <option value=\"gallery\">Galerie</option>\n <option value=\"search\">Vyhledávání</option>\n <option value=\"pagination\">Stránkování</option>\n <option value=\"date\">Datum</option>\n <option value=\"auth\">Autentizace</option>\n <option value=\"error\">Chyby</option>\n </Select>\n </FormControl>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" onClick={onTransModalClose}>\n Zrušit\n </Button>\n <Button\n colorScheme=\"blue\"\n onClick={() => {\n const form = document.querySelector('form') as HTMLFormElement;\n const formData = new FormData(form);\n const data = Object.fromEntries(formData.entries());\n saveTranslation(data);\n }}\n >\n Uložit\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </Box>\n );\n};\n\nexport default I18nAdminPage;\n","import api from './api';\n\nexport type Match = { id: number; home?: string; away?: string; date?: string; score?: string };\nexport type Standing = { team: string; played: number; won: number; draw: number; lost: number; points: number };\nexport type Player = {\n id: number;\n first_name: string;\n last_name: string;\n position?: string;\n jersey_number?: number;\n image_url?: string;\n gender?: string;\n is_active?: boolean;\n // Extended detail fields (optional on public endpoint)\n nationality?: string;\n date_of_birth?: string;\n height?: number;\n weight?: number;\n email?: string;\n phone?: string;\n team_id?: number;\n team?: { id?: number; name?: string };\n};\nexport type Sponsor = { id: number; name: string; logo_url?: string; website_url?: string; tier?: string; display_order?: number };\nexport type Category = { id?: number; name: string; slug?: string; url?: string; children?: Category[] };\n\nfunction normalizePlayer(p: any): Player {\n if (!p) return p as any;\n const id = p.id ?? p.ID;\n return {\n id: typeof id === 'string' ? Number(id) : id,\n first_name: p.first_name ?? p.FirstName ?? '',\n last_name: p.last_name ?? p.LastName ?? '',\n position: p.position ?? p.Position ?? undefined,\n jersey_number: p.jersey_number ?? p.JerseyNumber ?? undefined,\n image_url: p.image_url ?? p.ImageURL ?? undefined,\n gender: p.gender ?? p.Gender ?? undefined,\n is_active: Boolean(p.is_active ?? p.IsActive ?? true),\n nationality: p.nationality ?? p.Nationality ?? undefined,\n date_of_birth: p.date_of_birth ?? p.DateOfBirth ?? undefined,\n height: p.height ?? p.Height ?? undefined,\n weight: p.weight ?? p.Weight ?? undefined,\n email: p.email ?? p.Email ?? undefined,\n phone: p.phone ?? p.Phone ?? undefined,\n team_id: p.team_id ?? p.TeamID ?? (p.team?.id ?? p.Team?.ID) ?? undefined,\n team: (p.team || p.Team) ? { id: (p.team?.id ?? p.Team?.ID), name: (p.team?.name ?? p.Team?.Name ?? p.Team?.name) } : undefined,\n } as Player;\n}\n\nexport async function getMatches() {\n const res = await api.get<Match[] | { data: Match[] }>('/matches');\n return Array.isArray(res.data) ? res.data : res.data.data;\n}\n\nexport async function getStandings() {\n const res = await api.get<Standing[] | { data: Standing[] }>('/standings');\n return Array.isArray(res.data) ? res.data : res.data.data;\n}\n\nexport async function getPlayers(opts?: { active?: boolean; team_id?: number | string }) {\n let url = '/players';\n const params = new URLSearchParams();\n if (opts && opts.active === false) params.set('active', 'false');\n if (opts && opts.team_id != null) params.set('team_id', String(opts.team_id));\n if (Array.from(params.keys()).length > 0) url += `?${params.toString()}`;\n const res = await api.get<any[] | { data?: any[]; items?: any[] }>(url);\n const raw = Array.isArray(res.data)\n ? res.data\n : ((res.data as any).data || (res.data as any).items);\n return (raw || []).map(normalizePlayer);\n}\n\nexport async function getPlayer(id: number | string) {\n const res = await api.get<any>(`/players/${id}`);\n return normalizePlayer(res.data);\n}\n\nexport async function getSponsors() {\n const res = await api.get<Sponsor[] | { data: Sponsor[] }>('/sponsors');\n return Array.isArray(res.data) ? res.data : res.data.data;\n}\n\nexport async function sendContact(payload: { name: string; email: string; subject: string; message: string; source?: string }) {\n const res = await api.post('/contact', payload);\n return res.data;\n}\n\nexport async function subscribeToNewsletter(email: string, preferences?: Record<string, boolean> ) {\n const payload: any = { email };\n try {\n // Provide backend with the correct site origin for preference/unsubscribe links\n const origin = window?.location?.origin;\n if (origin) (payload as any).site_base_url = origin;\n } catch {}\n if (preferences) payload.preferences = preferences;\n const res = await api.post('/newsletter/subscribe', payload);\n return res.data;\n}\n\nexport async function getCategories() {\n const res = await api.get<Category[] | { data: Category[] }>('/categories');\n return Array.isArray(res.data) ? res.data : res.data.data;\n}\n","import { useEffect, useRef, useState, useCallback } from 'react';\nimport { useToast } from '@chakra-ui/react';\n\nexport type SaveStatus = 'idle' | 'saving' | 'saved' | 'error';\n\ninterface UseAutoSaveOptions<T> {\n data: T;\n storageKey: string;\n onSave: (data: T) => Promise<{ id?: number | string; [key: string]: any }>;\n onError?: (error: any) => void;\n debounceMs?: number;\n enabled?: boolean;\n requiresId?: boolean; // If true, only saves to backend when item has an ID\n}\n\ninterface UseAutoSaveReturn {\n saveStatus: SaveStatus;\n lastSaved: Date | null;\n forceSave: () => Promise<void>;\n clearDraft: () => void;\n hasDraft: boolean;\n draftAge: number | null; // Age in minutes\n}\n\n/**\n * Auto-save hook with dual-layer protection:\n * 1. Immediate localStorage save for offline protection\n * 2. Debounced backend save for persistence\n * \n * Usage:\n * ```tsx\n * const { saveStatus, lastSaved, forceSave, clearDraft } = useAutoSave({\n * data: formData,\n * storageKey: 'draft-article-123',\n * onSave: async (data) => {\n * if (data.id) {\n * return await updateArticle(data.id, data);\n * } else {\n * return await createArticle({ ...data, published: false });\n * }\n * },\n * debounceMs: 2000,\n * enabled: true\n * });\n * ```\n */\nexport function useAutoSave<T extends Record<string, any>>({\n data,\n storageKey,\n onSave,\n onError,\n debounceMs = 2000,\n enabled = true,\n requiresId = false,\n}: UseAutoSaveOptions<T>): UseAutoSaveReturn {\n const toast = useToast();\n const [saveStatus, setSaveStatus] = useState<SaveStatus>('idle');\n const [lastSaved, setLastSaved] = useState<Date | null>(null);\n const [hasDraft, setHasDraft] = useState(false);\n const [draftAge, setDraftAge] = useState<number | null>(null);\n \n const saveTimerRef = useRef<NodeJS.Timeout>();\n const lastLocalDataRef = useRef<string>('');\n const lastBackendDataRef = useRef<string>('');\n const isSavingRef = useRef(false);\n const lastDataObjRef = useRef<T | null>(null);\n const localSaveTimerRef = useRef<NodeJS.Timeout>();\n\n // Check for existing draft on mount\n useEffect(() => {\n try {\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n const parsed = JSON.parse(stored);\n setHasDraft(true);\n if (parsed.timestamp) {\n const age = Math.floor((Date.now() - parsed.timestamp) / 60000); // minutes\n setDraftAge(age);\n }\n }\n } catch (err) {\n console.warn('Failed to check for draft:', err);\n }\n }, [storageKey]);\n\n // Save to localStorage immediately (instant protection)\n const saveToLocalStorage = useCallback((data: T) => {\n try {\n const payload = {\n data,\n timestamp: Date.now(),\n version: 1,\n };\n localStorage.setItem(storageKey, JSON.stringify(payload));\n setHasDraft(true);\n setDraftAge(0);\n } catch (err) {\n console.error('Failed to save to localStorage:', err);\n }\n }, [storageKey]);\n\n // Save to backend (debounced)\n const saveToBackend = useCallback(async (data: T) => {\n // If requiresId is true and no ID exists, skip backend save\n if (requiresId && !data.id) {\n console.log('Skipping backend save - no ID yet');\n return;\n }\n\n if (isSavingRef.current) {\n console.log('Save already in progress, skipping...');\n return;\n }\n\n try {\n isSavingRef.current = true;\n setSaveStatus('saving');\n \n const result = await onSave(data);\n \n setSaveStatus('saved');\n setLastSaved(new Date());\n \n // If the save returned an ID, update the data reference\n if (result?.id && !data.id) {\n console.log('Draft saved with new ID:', result.id);\n }\n \n setTimeout(() => setSaveStatus('idle'), 2000);\n } catch (error: any) {\n console.error('Auto-save error:', error);\n setSaveStatus('error');\n \n if (onError) {\n onError(error);\n } else {\n // Only show error toast if it's not a 401/403 (auth issues)\n const status = error?.response?.status;\n if (status !== 401 && status !== 403) {\n toast({\n title: 'Automatické uložení selhalo',\n description: error?.response?.data?.error || error?.message || 'Koncept je uložen lokálně',\n status: 'warning',\n duration: 3000,\n isClosable: true,\n });\n }\n }\n \n setTimeout(() => setSaveStatus('idle'), 3000);\n } finally {\n isSavingRef.current = false;\n }\n }, [onSave, onError, toast, requiresId]);\n\n // Main auto-save effect\n useEffect(() => {\n if (!enabled) return;\n if (lastDataObjRef.current === data) {\n return;\n }\n\n lastDataObjRef.current = data;\n\n if (localSaveTimerRef.current) {\n clearTimeout(localSaveTimerRef.current);\n }\n localSaveTimerRef.current = setTimeout(() => {\n try {\n const dataString = JSON.stringify(data);\n if (dataString !== lastLocalDataRef.current) {\n lastLocalDataRef.current = dataString;\n saveToLocalStorage(data);\n }\n } catch (err) {\n console.error('Local draft serialize error:', err);\n }\n }, 300);\n\n // Debounce backend save\n if (saveTimerRef.current) {\n clearTimeout(saveTimerRef.current);\n }\n\n saveTimerRef.current = setTimeout(() => {\n try {\n const dataString = JSON.stringify(data);\n if (dataString !== lastBackendDataRef.current) {\n lastBackendDataRef.current = dataString;\n saveToBackend(data);\n }\n } catch (err) {\n console.error('Backend draft serialize error:', err);\n }\n }, debounceMs);\n\n return () => {\n if (saveTimerRef.current) {\n clearTimeout(saveTimerRef.current);\n }\n if (localSaveTimerRef.current) {\n clearTimeout(localSaveTimerRef.current);\n }\n };\n }, [data, enabled, debounceMs, saveToLocalStorage, saveToBackend]);\n\n // Force immediate save\n const forceSave = useCallback(async () => {\n if (saveTimerRef.current) {\n clearTimeout(saveTimerRef.current);\n }\n saveToLocalStorage(data);\n await saveToBackend(data);\n }, [data, saveToLocalStorage, saveToBackend]);\n\n // Clear draft\n const clearDraft = useCallback(() => {\n try {\n localStorage.removeItem(storageKey);\n setHasDraft(false);\n setDraftAge(null);\n if (saveTimerRef.current) {\n clearTimeout(saveTimerRef.current);\n }\n } catch (err) {\n console.error('Failed to clear draft:', err);\n }\n }, [storageKey]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (saveTimerRef.current) {\n clearTimeout(saveTimerRef.current);\n }\n if (localSaveTimerRef.current) {\n clearTimeout(localSaveTimerRef.current);\n }\n };\n }, []);\n\n return {\n saveStatus,\n lastSaved,\n forceSave,\n clearDraft,\n hasDraft,\n draftAge,\n };\n}\n\n/**\n * Load draft from localStorage\n */\nexport function loadDraft<T>(storageKey: string): T | null {\n try {\n const stored = localStorage.getItem(storageKey);\n if (!stored) return null;\n \n const parsed = JSON.parse(stored);\n return parsed.data || null;\n } catch (err) {\n console.error('Failed to load draft:', err);\n return null;\n }\n}\n\n/**\n * Get draft metadata\n */\nexport function getDraftMetadata(storageKey: string): { timestamp: number; age: number } | null {\n try {\n const stored = localStorage.getItem(storageKey);\n if (!stored) return null;\n \n const parsed = JSON.parse(stored);\n if (!parsed.timestamp) return null;\n \n const age = Math.floor((Date.now() - parsed.timestamp) / 60000); // minutes\n return {\n timestamp: parsed.timestamp,\n age,\n };\n } catch (err) {\n console.error('Failed to get draft metadata:', err);\n return null;\n }\n}\n","import { useState } from 'react';\nimport { \n Box, \n Container, \n Heading, \n Text, \n SimpleGrid, \n VStack, \n HStack,\n Button,\n Image,\n Badge,\n useColorModeValue,\n Icon,\n Divider,\n AspectRatio,\n} from '@chakra-ui/react';\nimport { FiCheck, FiExternalLink } from 'react-icons/fi';\nimport { useNavigate } from 'react-router-dom';\n\ninterface StyleOption {\n id: 'unified' | 'magazine' | 'pro' | 'edge';\n name: string;\n description: string;\n features: string[];\n recommended: boolean;\n imageUrl: string; // Will be a placeholder path that user will fill\n}\n\nconst STYLE_OPTIONS: StyleOption[] = [\n {\n id: 'unified',\n name: 'Unified',\n description: 'Klasický a univerzální styl s grid layoutem, ideální pro většinu klubů',\n features: [\n 'Grid layout pro články',\n 'Panel nejbližšího zápasu',\n 'Tři sloupce obsahu',\n 'Sekce sponzorů',\n ],\n recommended: true,\n imageUrl: '/dist/img/style-preview-unified.jpg', // Placeholder - user will create\n },\n {\n id: 'magazine',\n name: 'Magazine',\n description: 'Moderní magazínový styl s barevnými pruhy a dynamickým layoutem',\n features: [\n 'Barevné klubové pruhy',\n 'Magazínový header',\n 'Různé velikosti karet',\n 'Moderní navigace',\n ],\n recommended: false,\n imageUrl: '/dist/img/style-preview-magazine.jpg', // Placeholder - user will create\n },\n {\n id: 'pro',\n name: 'Pro',\n description: 'Prémiový styl s fullscreen hero obrazem pro maximální dojem',\n features: [\n 'Fullscreen hero slideshow',\n 'Premium vzhled',\n 'Horizontální scrollery',\n 'Velké vizuální prvky',\n ],\n recommended: false,\n imageUrl: '/dist/img/style-preview-pro.jpg', // Placeholder - user will create\n },\n {\n id: 'edge',\n name: 'Edge',\n description: 'Minimalistický a moderní full-width design',\n features: [\n 'Full-width layout',\n 'Minimalistický design',\n 'Moderní dlaždice',\n 'Sticky navigace',\n ],\n recommended: false,\n imageUrl: '/dist/img/style-preview-edge.jpg', // Placeholder - user will create\n },\n];\n\n// Mock data for Bizoni UH club\nconst MOCK_CLUB_DATA = {\n clubId: '441d3783-06aa-436a-b438-359300ee0371',\n clubName: 'FC Bizoni UH',\n clubLogo: '/dist/img/logo-club-empty.svg', // You can add actual logo\n primaryColor: '#1e40af',\n secondaryColor: '#dc2626',\n youtube: 'https://www.youtube.com/@FCBizoniUH',\n instagram: 'https://www.instagram.com/fcbizoni_uh/',\n facebook: 'https://www.facebook.com/bizoniuh/?locale=cs_CZ',\n gallery: 'https://eu.zonerama.com/Fcbizoni/1419417',\n maps: 'https://www.google.com/maps/place/Sportovi%C5%A1t%C4%9B+m%C4%9Bsta+Uhersk%C3%A9+Hradi%C5%A1t%C4%9B/@49.066982,17.4702993,19.5z/data=!4m6!3m5!1s0x4713144f4e888bd3:0xf6b552dcecd165df!8m2!3d49.0669271!4d17.4708283!16s%2Fg%2F1tdvc9kh?entry=ttu&g_ep=EgoyMDI1MTAwOC4wIKXMDSoASAFQAw%3D%3D',\n articles: [\n { title: 'Velké vítězství v derby', date: '15. března 2024', category: 'Zápasy' },\n { title: 'Nová posila v týmu', date: '12. března 2024', category: 'Aktuality' },\n { title: 'Pozvánka na trénink mládeže', date: '10. března 2024', category: 'Mládež' },\n ],\n nextMatch: {\n opponent: 'TJ Slovácko B',\n date: '2024-03-20',\n time: '17:00',\n location: 'Sportovište města Uherské Hradiště',\n },\n};\n\nconst StylePreviewPage: React.FC = () => {\n const [selectedStyle, setSelectedStyle] = useState<string | null>(null);\n const navigate = useNavigate();\n const bg = useColorModeValue('white', 'gray.800');\n const borderCol = useColorModeValue('gray.200', 'gray.600');\n\n const handleSelectStyle = (styleId: string) => {\n setSelectedStyle(styleId);\n };\n\n const handleContinue = () => {\n if (selectedStyle) {\n // Navigate back to setup with selected style\n navigate(`/setup?style=${selectedStyle}`);\n }\n };\n\n return (\n <Box minH=\"100vh\" bg=\"gray.50\" py={8}>\n <Container maxW=\"7xl\">\n <VStack spacing={8} align=\"stretch\">\n {/* Header */}\n <Box textAlign=\"center\">\n <Heading size=\"2xl\" mb={3}>Vyberte styl webu</Heading>\n <Text fontSize=\"lg\" color=\"gray.600\">\n Zvolte vzhled, který nejlépe reprezentuje váš klub. Můžete kdykoliv změnit v administraci.\n </Text>\n </Box>\n\n {/* Style Options Grid */}\n <SimpleGrid columns={[1, 1, 2]} spacing={8}>\n {STYLE_OPTIONS.map((style) => (\n <Box\n key={style.id}\n borderWidth={selectedStyle === style.id ? '3px' : '1px'}\n borderColor={selectedStyle === style.id ? 'blue.500' : borderCol}\n borderRadius=\"xl\"\n overflow=\"hidden\"\n bg={bg}\n cursor=\"pointer\"\n onClick={() => handleSelectStyle(style.id)}\n transition=\"all 0.3s\"\n _hover={{\n transform: 'translateY(-4px)',\n boxShadow: 'xl',\n borderColor: 'blue.400',\n }}\n position=\"relative\"\n >\n {/* Recommended Badge */}\n {style.recommended && (\n <Badge\n colorScheme=\"green\"\n position=\"absolute\"\n top={4}\n right={4}\n zIndex={2}\n fontSize=\"sm\"\n px={3}\n py={1}\n >\n Doporučeno\n </Badge>\n )}\n\n {/* Selected Check */}\n {selectedStyle === style.id && (\n <Box\n position=\"absolute\"\n top={4}\n left={4}\n zIndex={2}\n bg=\"blue.500\"\n color=\"white\"\n borderRadius=\"full\"\n p={2}\n >\n <Icon as={FiCheck} boxSize={5} />\n </Box>\n )}\n\n {/* Preview Image */}\n <AspectRatio ratio={16 / 9}>\n <Image\n src={style.imageUrl}\n alt={`${style.name} style preview`}\n objectFit=\"cover\"\n fallback={\n <Box bg=\"gray.200\" w=\"100%\" h=\"100%\" display=\"flex\" alignItems=\"center\" justifyContent=\"center\">\n <VStack spacing={2}>\n <Text fontWeight=\"bold\" fontSize=\"2xl\" color=\"gray.500\">\n {style.name}\n </Text>\n <Text fontSize=\"sm\" color=\"gray.500\">\n Náhled bude přidán\n </Text>\n </VStack>\n </Box>\n }\n />\n </AspectRatio>\n\n {/* Style Info */}\n <VStack align=\"stretch\" p={6} spacing={4}>\n <HStack justify=\"space-between\" align=\"flex-start\">\n <VStack align=\"stretch\" spacing={1} flex={1}>\n <Heading size=\"lg\">{style.name}</Heading>\n <Text fontSize=\"sm\" color=\"gray.600\">\n {style.description}\n </Text>\n </VStack>\n </HStack>\n\n <Divider />\n\n {/* Features */}\n <VStack align=\"stretch\" spacing={2}>\n <Text fontWeight=\"semibold\" fontSize=\"sm\" color=\"gray.700\">\n Klíčové vlastnosti:\n </Text>\n {style.features.map((feature, idx) => (\n <HStack key={idx} spacing={2}>\n <Icon as={FiCheck} color=\"green.500\" />\n <Text fontSize=\"sm\">{feature}</Text>\n </HStack>\n ))}\n </VStack>\n\n {/* Live Preview Button */}\n <Button\n variant=\"outline\"\n leftIcon={<FiExternalLink />}\n onClick={(e) => {\n e.stopPropagation();\n // Open live preview in new window\n window.open(`/?style=${style.id}&preview=1`, '_blank');\n }}\n size=\"sm\"\n >\n Živý náhled\n </Button>\n </VStack>\n </Box>\n ))}\n </SimpleGrid>\n\n {/* Mock Preview Section */}\n <Box bg={bg} borderRadius=\"xl\" borderWidth=\"1px\" borderColor={borderCol} p={8}>\n <Heading size=\"lg\" mb={4}>Náhled s vašimi daty</Heading>\n <Text fontSize=\"sm\" color=\"gray.600\" mb={6}>\n Ukázka stylu {selectedStyle ? STYLE_OPTIONS.find(s => s.id === selectedStyle)?.name : 'vyberte styl výše'} s ukázkovými daty klubu FC Bizoni UH\n </Text>\n\n {selectedStyle && (\n <Box>\n {/* Mock club header */}\n <HStack spacing={4} mb={6} p={4} bg=\"gray.50\" borderRadius=\"lg\">\n <Image \n src={MOCK_CLUB_DATA.clubLogo} \n alt={MOCK_CLUB_DATA.clubName}\n boxSize=\"64px\"\n borderRadius=\"md\"\n />\n <VStack align=\"stretch\" spacing={1}>\n <Heading size=\"md\">{MOCK_CLUB_DATA.clubName}</Heading>\n <HStack spacing={3}>\n <Badge colorScheme=\"blue\">Fotbal</Badge>\n <Badge colorScheme=\"green\">Aktivní</Badge>\n </HStack>\n </VStack>\n </HStack>\n\n {/* Mock articles preview */}\n <SimpleGrid columns={[1, 2, 3]} spacing={4}>\n {MOCK_CLUB_DATA.articles.map((article, idx) => (\n <Box\n key={idx}\n p={4}\n borderWidth=\"1px\"\n borderRadius=\"lg\"\n borderColor={borderCol}\n _hover={{ boxShadow: 'md' }}\n >\n <Badge colorScheme=\"blue\" mb={2}>{article.category}</Badge>\n <Heading size=\"sm\" mb={1} noOfLines={2}>\n {article.title}\n </Heading>\n <Text fontSize=\"xs\" color=\"gray.500\">{article.date}</Text>\n </Box>\n ))}\n </SimpleGrid>\n\n {/* Next match preview */}\n <Box mt={6} p={6} bg=\"blue.50\" borderRadius=\"lg\" borderWidth=\"1px\" borderColor=\"blue.200\">\n <Text fontSize=\"sm\" fontWeight=\"semibold\" color=\"blue.700\" mb={2}>\n NEJBLIŽŠÍ ZÁPAS\n </Text>\n <Heading size=\"lg\" mb={2}>{MOCK_CLUB_DATA.nextMatch.opponent}</Heading>\n <HStack spacing={4} fontSize=\"sm\" color=\"gray.700\">\n <Text>{new Date(MOCK_CLUB_DATA.nextMatch.date).toLocaleDateString('cs-CZ')}</Text>\n <Text>•</Text>\n <Text>{MOCK_CLUB_DATA.nextMatch.time}</Text>\n </HStack>\n <Text fontSize=\"sm\" color=\"gray.600\" mt={2}>\n {MOCK_CLUB_DATA.nextMatch.location}\n </Text>\n </Box>\n\n {/* Social links preview */}\n <HStack spacing={4} mt={6} justify=\"center\">\n <Button size=\"sm\" colorScheme=\"facebook\" leftIcon={<FiExternalLink />}>\n Facebook\n </Button>\n <Button size=\"sm\" colorScheme=\"pink\" leftIcon={<FiExternalLink />}>\n Instagram\n </Button>\n <Button size=\"sm\" colorScheme=\"red\" leftIcon={<FiExternalLink />}>\n YouTube\n </Button>\n </HStack>\n </Box>\n )}\n </Box>\n\n {/* Action Buttons */}\n <HStack justify=\"space-between\">\n <Button\n variant=\"ghost\"\n onClick={() => navigate('/setup')}\n >\n Zpět na nastavení\n </Button>\n <Button\n colorScheme=\"blue\"\n size=\"lg\"\n isDisabled={!selectedStyle}\n onClick={handleContinue}\n rightIcon={<Icon as={FiCheck} />}\n >\n Pokračovat s {selectedStyle ? STYLE_OPTIONS.find(s => s.id === selectedStyle)?.name : 'vybraným stylem'}\n </Button>\n </HStack>\n </VStack>\n </Container>\n </Box>\n );\n};\n\nexport default StylePreviewPage;\n","import { useEffect, useRef, useState } from 'react';\nimport { FiSave, FiEye, FiCode, FiLayout, FiZap, FiTrash } from 'react-icons/fi';\nimport {\n Box,\n Heading,\n Text,\n SimpleGrid,\n FormControl,\n FormLabel,\n FormHelperText,\n Input,\n Select,\n Button,\n useToast,\n VStack,\n HStack,\n Divider,\n Image,\n Textarea,\n Tabs,\n TabList,\n TabPanels,\n Tab,\n TabPanel,\n Switch,\n Badge,\n useTab,\n Alert,\n AlertIcon,\n NumberInput,\n NumberInputField,\n NumberInputStepper,\n useColorModeValue,\n} from '@chakra-ui/react';\nimport { useTranslation } from 'react-i18next';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport { AdminSettings, getAdminSettings, updateAdminSettings } from '../../services/settings';\nimport { sendNewsletterTestAdvanced } from '../../services/admin/newsletter';\nimport { SeoSettings, getSeoSettings, updateSeoSettings } from '../../services/seo';\nimport { uploadFile } from '../../services/articles';\nimport { assetUrl } from '../../utils/url';\nimport { triggerPrefetch } from '../../services/admin/prefetch';\nimport api from '../../services/api';\nimport { HelpTooltipCard } from '../../components/common/HelpTooltipCard';\nimport UploadPanel from '../../components/common/UploadPanel';\n\nconst SettingsAdminPage: React.FC = () => {\n const { t } = useTranslation();\n const toast = useToast();\n const [loading, setLoading] = useState<boolean>(false);\n const [saving, setSaving] = useState<boolean>(false);\n const [settings, setSettings] = useState<AdminSettings>({});\n const [testEmail, setTestEmail] = useState<string>('');\n const [testing, setTesting] = useState<boolean>(false);\n const [seo, setSeo] = useState<SeoSettings>({});\n const [tabIndex, setTabIndex] = useState(0);\n // Analytics state\n const [umamiWebsiteId, setUmamiWebsiteId] = useState<string>('');\n const [umamiDomain, setUmamiDomain] = useState<string>('');\n const [umamiName, setUmamiName] = useState<string>('');\n const [umamiInitializing, setUmamiInitializing] = useState<boolean>(false);\n const [umamiConfig, setUmamiConfig] = useState<any>(null);\n\n useEffect(() => {\n setLoading(true);\n getAdminSettings()\n .then((data) => {\n const s = data || {};\n const normalized: any = { ...s };\n if (!normalized.storage_warn_threshold || normalized.storage_warn_threshold <= 0) normalized.storage_warn_threshold = 80;\n if (!normalized.storage_critical_threshold || normalized.storage_critical_threshold <= 0) normalized.storage_critical_threshold = 95;\n setSettings(normalized);\n })\n .catch(() => {\n toast({ title: 'Chyba', description: 'Nepodařilo se načíst nastavení', status: 'error' });\n })\n .finally(() => setLoading(false));\n // load SEO\n getSeoSettings()\n .then((data) => setSeo(data || {}))\n .catch(() => {})\n .finally(() => {});\n // load Umami config\n fetchUmamiConfig();\n }, [toast]);\n\n // Handle hash navigation for deep links\n useEffect(() => {\n const hash = window.location.hash.replace('#', '');\n const tabMap: Record<string, number> = {\n 'obecne': 0,\n 'socialni-site': 1,\n 'videa': 2,\n 'smtp': 3,\n 'analytika': 4,\n 'seo': 5,\n };\n \n if (tabMap[hash] !== undefined) {\n setTabIndex(tabMap[hash]);\n }\n }, []);\n\n const fetchUmamiConfig = async () => {\n try {\n const response = await api.get('/insights/config');\n setUmamiConfig(response.data);\n if (response.data?.website_id) {\n setUmamiWebsiteId(response.data.website_id);\n }\n // Set default domain from current host\n if (!umamiDomain) {\n const hostname = window.location.hostname;\n setUmamiDomain(hostname);\n }\n // Set default name from club name if available\n if (!umamiName && settings.club_name) {\n setUmamiName(settings.club_name);\n }\n } catch (error) {\n console.error('Failed to fetch Umami config:', error);\n }\n };\n\n // Autofill SEO fields from general settings if missing\n useEffect(() => {\n setSeo((prev) => {\n const next: SeoSettings = { ...prev };\n let changed = false;\n if (!next.site_title && settings.club_name) { next.site_title = settings.club_name; changed = true; }\n if (!next.default_og_image_url && settings.club_logo_url) { next.default_og_image_url = settings.club_logo_url; changed = true; }\n return changed ? next : prev;\n });\n }, [settings.club_name, settings.club_logo_url]);\n\n const handleChange = (key: keyof AdminSettings) => (e: React.ChangeEvent<HTMLInputElement>) => {\n setSettings((prev) => ({ ...prev, [key]: e.target.value }));\n };\n\n const handleSeoChange = (key: keyof SeoSettings) => (e: React.ChangeEvent<HTMLInputElement>) => {\n const v = e.target.type === 'checkbox' ? (e.target as any).checked : e.target.value;\n setSeo((prev) => ({ ...prev, [key]: v }));\n };\n const sendSmtpTest = async () => {\n setTesting(true);\n try {\n const payload: any = { type: 'newsletter' };\n if (testEmail && testEmail.trim()) payload.email = testEmail.trim();\n await sendNewsletterTestAdvanced(payload);\n toast({ title: 'Test odeslán', description: testEmail ? `Zkontrolujte schránku ${testEmail}` : 'Test odeslán na výchozí administrátorský email.', status: 'success', duration: 5000 });\n } catch (e: any) {\n const errorMsg = e?.response?.data?.error || e?.message || 'Neznámá chyba';\n const isAuthError = errorMsg.includes('535') || errorMsg.toLowerCase().includes('authentication failed');\n toast({ \n title: isAuthError ? '⚠️ Chyba autentizace SMTP (535)' : 'Chyba při odeslání testu',\n description: isAuthError \n ? 'Zkontrolujte SMTP heslo. Ujistěte se, že je správně zkopírované bez mezer. Některé poskytovatele vyžadují aplikační heslo místo běžného hesla.'\n : errorMsg + ' Zkuste upravit SMTP nastavení.',\n status: 'error',\n duration: 10000,\n isClosable: true,\n });\n } finally {\n setTesting(false);\n }\n };\n // Numeric and boolean helpers for admin settings\n const handleNumChange = (key: keyof AdminSettings) => (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n const n = val === '' ? undefined : Number(val);\n setSettings((prev) => ({ ...prev, [key]: (Number.isFinite(n as number) ? (n as any) : undefined) }));\n };\n const handleBoolChange = (key: keyof AdminSettings) => (e: React.ChangeEvent<HTMLInputElement>) => {\n const checked = (e.target as any).checked as boolean;\n setSettings((prev) => ({ ...prev, [key]: checked as any }));\n };\n const saveSEO = async () => {\n try {\n await updateSeoSettings(seo);\n toast({ title: 'SEO uloženo', status: 'success' });\n } catch (e: any) {\n toast({ title: 'Chyba', description: e?.message || 'Uložení SEO nastavení se nezdařilo', status: 'error' });\n }\n };\n const handleSelectChange = (key: keyof AdminSettings) => (e: React.ChangeEvent<HTMLSelectElement>) => {\n setSettings((prev) => ({ ...prev, [key]: e.target.value }));\n };\n\n const presetStorageThresholds = () => {\n setSettings((prev) => ({\n ...prev,\n storage_warn_threshold: 80 as any,\n storage_critical_threshold: 95 as any,\n }));\n };\n\n const handleSave = async () => {\n setSaving(true);\n try {\n const payload: Partial<AdminSettings> = {\n club_name: settings.club_name,\n club_logo_url: settings.club_logo_url,\n // social & gallery links\n facebook_url: (settings as any).facebook_url,\n instagram_url: (settings as any).instagram_url,\n youtube_url: (settings as any).youtube_url,\n // generic gallery (preferred)\n gallery_url: (settings as any).gallery_url,\n // backward compatibility\n zonerama_url: (settings as any).zonerama_url,\n // SMTP\n smtp_host: (settings as any).smtp_host,\n smtp_port: (settings as any).smtp_port as any,\n smtp_user: (settings as any).smtp_user,\n smtp_password: (settings as any).smtp_password,\n smtp_from: (settings as any).smtp_from,\n smtp_from_name: (settings as any).smtp_from_name,\n smtp_encryption: (settings as any).smtp_encryption as any,\n ...(typeof (settings as any).smtp_auth === 'boolean' ? { smtp_auth: (settings as any).smtp_auth as any } : {}),\n smtp_skip_verify: (settings as any).smtp_skip_verify as any,\n // videos module\n videos_module_enabled: (settings as any).videos_module_enabled as any,\n videos_source: (settings as any).videos_source as any,\n // contact & map\n contact_address: (settings as any).contact_address,\n contact_city: (settings as any).contact_city,\n contact_zip: (settings as any).contact_zip,\n contact_country: (settings as any).contact_country,\n contact_phone: (settings as any).contact_phone,\n contact_email: (settings as any).contact_email,\n location_latitude: (settings as any).location_latitude as any,\n location_longitude: (settings as any).location_longitude as any,\n map_zoom_level: (settings as any).map_zoom_level as any,\n show_map_on_homepage:\n (typeof (settings as any).location_latitude === 'number') &&\n (typeof (settings as any).location_longitude === 'number'),\n map_style: (settings as any).map_style,\n frontend_base_url: (settings as any).frontend_base_url,\n api_base_url: (settings as any).api_base_url,\n // homepage matches display\n finished_match_display_days: (settings as any).finished_match_display_days as any,\n storage_warn_threshold: (((settings as any).storage_warn_threshold ?? 0) > 0 ? (settings as any).storage_warn_threshold : 80) as any,\n storage_critical_threshold: (((settings as any).storage_critical_threshold ?? 0) > 0 ? (settings as any).storage_critical_threshold : 95) as any,\n // error-review integration (domain managed via .env; only tokens are saved)\n error_review_admin_token: (settings as any).error_review_admin_token,\n error_review_ingest_token: (settings as any).error_review_ingest_token,\n };\n const saved = await updateAdminSettings(payload);\n setSettings((prev) => ({ ...prev, ...saved }));\n toast({ title: 'Uloženo', description: 'Nastavení bylo úspěšně aktualizováno', status: 'success' });\n // Try to refresh prefetch caches\n try { await triggerPrefetch(); } catch {}\n try {\n const fb = String(((saved as any).frontend_base_url || (settings as any).frontend_base_url || '')).replace(/\\/$/, '');\n let ab = String(((saved as any).api_base_url || (settings as any).api_base_url || '')).trim();\n if (fb || ab) {\n try {\n const u = new URL(ab || '', fb || (typeof window !== 'undefined' ? window.location.origin : ''));\n if (!/\\/api\\//.test(u.pathname)) { u.pathname = u.pathname.replace(/\\/$/, '') + '/api/v1'; }\n ab = u.toString();\n } catch {}\n try { localStorage.setItem('fc_frontend_base_url', fb); } catch {}\n try { localStorage.setItem('fc_api_base_url', ab); } catch {}\n try { localStorage.setItem('api_base_url', ab); } catch {}\n try { (api as any).defaults.baseURL = ab; } catch {}\n setTimeout(() => { try { window.location.reload(); } catch {} }, 600);\n }\n // Persist ingest token for frontend errorReporter (URL is fixed by default wiring)\n try {\n const ingestToken = (saved as any).error_review_ingest_token || (settings as any).error_review_ingest_token;\n if (ingestToken) localStorage.setItem('fc_error_ingest_token', String(ingestToken));\n } catch {}\n } catch {}\n } catch (e: any) {\n toast({ title: 'Chyba', description: e?.message || 'Uložení nastavení se nezdařilo', status: 'error' });\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <AdminLayout>\n <Box>\n <Heading size=\"lg\" mb={4}>Nastavení webu</Heading>\n\n <Tabs variant=\"enclosed\" colorScheme=\"brand\" index={tabIndex} onChange={setTabIndex}>\n <TabList flexWrap=\"wrap\">\n {['Obecné','Sociální sítě','Videa','SMTP','Analytika','SEO'].map((label) => (\n <Tab key={label}\n _selected={{ bg: 'brand.primary', color: 'text.onPrimary', borderColor: 'brand.primary' }}\n _hover={{ bg: 'rgba(0,0,0,0.04)', borderColor: 'brand.500' }}\n >{label}</Tab>\n ))}\n </TabList>\n <TabPanels>\n <TabPanel>\n <VStack align=\"stretch\" spacing={4}>\n <FormControl>\n <FormLabel>Název klubu</FormLabel>\n <Input value={settings.club_name || ''} onChange={handleChange('club_name')} />\n </FormControl>\n\n <Heading size=\"sm\">Úložiště souborů</Heading>\n <SimpleGrid columns={{ base: 1, md: 3 }} spacing={4}>\n <FormControl>\n <FormLabel display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n <Box>Varování při (%)</Box>\n <HelpTooltipCard\n label=\"Jak fungují limity\"\n title=\"Varovné a kritické limity úložiště\"\n items={[\n 'Varování (např. 80 %) upozorní administrátory, že se blížíte limitu úložiště.',\n 'Kritické (např. 95 %) je silnější upozornění v krajním případě může být nahrávání souborů omezeno.',\n 'Doporučené hodnoty jsou 80 % / 95 % příliš nízké hodnoty vedou k častým upozorněním.',\n ]}\n />\n </FormLabel>\n <Input\n type=\"number\"\n min={0}\n max={100}\n value={((settings as any).storage_warn_threshold ?? 0) > 0 ? (settings as any).storage_warn_threshold : 80}\n onChange={handleNumChange('storage_warn_threshold' as any)}\n />\n </FormControl>\n <FormControl>\n <FormLabel>Kritické při (%)</FormLabel>\n <Input\n type=\"number\"\n min={0}\n max={100}\n value={((settings as any).storage_critical_threshold ?? 0) > 0 ? (settings as any).storage_critical_threshold : 95}\n onChange={handleNumChange('storage_critical_threshold' as any)}\n />\n </FormControl>\n <FormControl>\n <FormLabel>Přednastavit</FormLabel>\n <Button onClick={presetStorageThresholds} variant=\"outline\">80 % / 95 %</Button>\n </FormControl>\n </SimpleGrid>\n <FormControl>\n <FormLabel>Logo klubu</FormLabel>\n <VStack align=\"stretch\" spacing={3}>\n <UploadPanel\n label=\"Logo klubu\"\n description=\"Nahrajte logo ve formátu PNG, SVG nebo PDF (max. 5 MB).\"\n accept=\"image/png,image/svg+xml,application/pdf\"\n multiple={false}\n maxFiles={1}\n maxFileSizeMB={5}\n allowUrlImport={false}\n onChange={(files) => {\n const last = files[files.length - 1];\n setSettings((prev) => ({\n ...prev,\n club_logo_url: last?.url || '',\n }));\n }}\n />\n {settings.club_logo_url && (\n <HStack align=\"center\" spacing={3}>\n <Image\n src={assetUrl(settings.club_logo_url) || settings.club_logo_url}\n alt=\"Logo\"\n boxSize=\"56px\"\n borderRadius=\"md\"\n />\n <Text fontSize=\"sm\" color=\"gray.500\">{settings.club_logo_url}</Text>\n </HStack>\n )}\n </VStack>\n </FormControl>\n\n <Divider />\n\n <Heading size=\"sm\">Nastavení URL</Heading>\n <FormControl>\n <FormLabel display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n <Box>URL webu</Box>\n <HelpTooltipCard\n label=\"Jak vyplnit\"\n title=\"Doporučení pro adresu webu\"\n items={[\n 'Použijte finální doménu klubu (např. https://www.vasklub.cz).',\n 'Nezadávejte /api API adresa se doplní a spravuje zvlášť.',\n 'V produkci vždy používejte zabezpečené HTTPS.',\n ]}\n />\n </FormLabel>\n <Input value={(settings as any).frontend_base_url || ''} onChange={handleChange('frontend_base_url' as any)} placeholder=\"https://www.vasklub.cz\" />\n </FormControl>\n <FormControl>\n <FormLabel>API URL</FormLabel>\n <Input value={(settings as any).api_base_url || ''} onChange={handleChange('api_base_url' as any)} placeholder=\"https://api.vasklub.cz/api/v1\" />\n <FormHelperText>Ujistěte se, že adresa končí na /api/v1</FormHelperText>\n </FormControl>\n\n <Heading size=\"sm\">Zobrazení zápasů</Heading>\n <FormControl>\n <FormLabel>Počet dní zobrazení dokončených zápasů</FormLabel>\n <Input \n type=\"number\" \n min={0}\n max={30}\n value={(settings as any).finished_match_display_days ?? 2} \n onChange={(e) => {\n const val = parseInt(e.target.value, 10);\n setSettings((prev) => ({ ...prev, finished_match_display_days: isNaN(val) ? 2 : val } as any));\n }} \n />\n <FormHelperText>\n Počet dní, po které se na úvodní stránce zobrazí dokončený zápas s výsledkem místo příštího zápasu (výchozí: 2 dny).\n </FormHelperText>\n </FormControl>\n\n <HStack>\n <Button onClick={handleSave} isLoading={saving} bg=\"brand.primary\" color=\"text.onPrimary\" _hover={{ filter: 'brightness(0.95)' }}>Uložit nastavení</Button>\n </HStack>\n </VStack>\n </TabPanel>\n\n <TabPanel>\n <VStack align=\"stretch\" spacing={4}>\n <FormControl>\n <FormLabel>Facebook URL</FormLabel>\n <Input value={(settings as any).facebook_url || ''} onChange={handleChange('facebook_url')} />\n </FormControl>\n <FormControl>\n <FormLabel>Instagram URL</FormLabel>\n <Input value={(settings as any).instagram_url || ''} onChange={handleChange('instagram_url')} />\n </FormControl>\n <FormControl>\n <FormLabel>YouTube URL</FormLabel>\n <Input value={(settings as any).youtube_url || ''} onChange={handleChange('youtube_url')} />\n <FormHelperText>Pro automatické načítání videí vyplňte YouTube kanál.</FormHelperText>\n </FormControl>\n <FormControl>\n <FormLabel>{t('homepage.gallery')} URL</FormLabel>\n <Input value={(settings as any).gallery_url || ''} onChange={handleChange('gallery_url')} />\n </FormControl>\n\n <HStack>\n <Button onClick={handleSave} isLoading={saving} bg=\"brand.primary\" color=\"text.onPrimary\" _hover={{ filter: 'brightness(0.95)' }}>Uložit nastavení</Button>\n </HStack>\n </VStack>\n </TabPanel>\n\n <TabPanel>\n <VStack align=\"stretch\" spacing={4}>\n <Box p={4} bg=\"blue.50\" borderRadius=\"md\" borderLeft=\"4px solid\" borderColor=\"blue.500\">\n <HStack spacing={2} mb={2}>\n <Text fontWeight=\"bold\" fontSize=\"sm\">️ Sekce Videa</Text>\n {(settings as any).videos_module_enabled && (\n <Badge colorScheme=\"green\">Aktivní</Badge>\n )}\n </HStack>\n <Text fontSize=\"sm\" color=\"gray.700\">\n Videa spravujte na stránce{' '}\n <Button \n as=\"a\" \n href=\"/admin/videa\" \n variant=\"link\" \n colorScheme=\"blue\" \n size=\"sm\"\n fontWeight=\"bold\"\n >\n Videa\n </Button>\n . Zde nastavte zobrazení na titulní stránce.\n {(settings as any).youtube_url && (\n <Text as=\"span\" color=\"green.700\" fontWeight=\"semibold\" ml={1}>\n Sekce se automaticky aktivuje při vyplnění YouTube kanálu v tabě Sociální sítě.\n </Text>\n )}\n </Text>\n </Box>\n \n <FormControl display=\"flex\" alignItems=\"center\">\n <FormLabel mb={0}>Zobrazit sekci Videa na titulní stránce</FormLabel>\n <Switch isChecked={!!(settings as any).videos_module_enabled} onChange={handleBoolChange('videos_module_enabled')} colorScheme=\"green\" />\n </FormControl>\n \n <FormControl>\n <FormLabel>Zdroj videí</FormLabel>\n <Select value={(settings as any).videos_source || 'auto'} onChange={handleSelectChange('videos_source')}>\n <option value=\"auto\">Automaticky (YouTube kanál)</option>\n <option value=\"manual\">Ručně (správa v sekci Videa)</option>\n </Select>\n <FormHelperText>Pro automatický zdroj vyplňte v tabě „Sociální sítě\" pole YouTube URL.</FormHelperText>\n </FormControl>\n\n <HStack>\n <Button onClick={handleSave} isLoading={saving} bg=\"brand.primary\" color=\"text.onPrimary\" _hover={{ filter: 'brightness(0.95)' }}>Uložit nastavení</Button>\n </HStack>\n </VStack>\n </TabPanel>\n\n <TabPanel>\n <VStack align=\"stretch\" spacing={4}>\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={4}>\n <FormControl>\n <FormLabel>SMTP Host</FormLabel>\n <Input\n value={(settings as any).smtp_host || ''}\n onChange={handleChange('smtp_host' as any)}\n placeholder=\"smtp.seznam.cz nebo smtp.gmail.com\"\n />\n <FormHelperText>\n Adresa SMTP serveru. Příklad: smtp.seznam.cz, smtp.gmail.com, smtp.office365.com\n </FormHelperText>\n </FormControl>\n <FormControl>\n <FormLabel>SMTP Port</FormLabel>\n <Input\n type=\"number\"\n value={(settings as any).smtp_port ?? ''}\n onChange={handleNumChange('smtp_port' as any)}\n placeholder=\"587 pro TLS, 465 pro SSL, 25 bez šifrování\"\n />\n <FormHelperText>\n Nejčastěji 587 (TLS/STARTTLS) nebo 465 (SSL). Port 25 je bez šifrování a často blokovaný.\n </FormHelperText>\n </FormControl>\n <FormControl>\n <FormLabel>SMTP Uživatel</FormLabel>\n <Input\n value={(settings as any).smtp_user || ''}\n onChange={handleChange('smtp_user' as any)}\n placeholder=\"většinou celá emailová adresa\"\n />\n <FormHelperText>\n Přihlašovací jméno k SMTP (obvykle emailová adresa). Nechte prázdné, pokud server nevyžaduje přihlášení.\n </FormHelperText>\n </FormControl>\n <FormControl>\n <FormLabel>SMTP Heslo</FormLabel>\n <Input\n type=\"password\"\n value={(settings as any).smtp_password || ''}\n onChange={handleChange('smtp_password' as any)}\n placeholder=\"heslo nebo aplikační heslo\"\n />\n <FormHelperText>\n Heslo k účtu nebo aplikační heslo (Gmail/Seznam/Office 365 často vyžadují). Vkládejte bez mezer.\n </FormHelperText>\n </FormControl>\n <FormControl>\n <FormLabel>From email</FormLabel>\n <Input\n value={(settings as any).smtp_from || ''}\n onChange={handleChange('smtp_from' as any)}\n placeholder=\"noreply@vasklub.cz\"\n />\n <FormHelperText>\n Adresa odesílatele uvedená v emailech. Ideálně existující schránka na vašem SMTP serveru.\n </FormHelperText>\n </FormControl>\n <FormControl>\n <FormLabel>From jméno</FormLabel>\n <Input\n value={(settings as any).smtp_from_name || ''}\n onChange={handleChange('smtp_from_name' as any)}\n placeholder=\"FK Váš Klub\"\n />\n <FormHelperText>\n Zobrazované jméno odesílatele (např. FK Váš Klub).\n </FormHelperText>\n </FormControl>\n <FormControl>\n <FormLabel>Šifrování</FormLabel>\n <Select value={(settings as any).smtp_encryption || 'none'} onChange={handleSelectChange('smtp_encryption' as any)}>\n <option value=\"none\">Žádné</option>\n <option value=\"ssl\">SSL</option>\n <option value=\"tls\">TLS</option>\n </Select>\n <FormHelperText>\n SSL = implicitní šifrování (obvykle port 465). TLS/STARTTLS = šifrování po navázání spojení (obvykle port 587).\n </FormHelperText>\n </FormControl>\n <FormControl>\n <FormLabel>Autentizace</FormLabel>\n <Select value={(settings as any).smtp_auth || 'plain'} onChange={handleSelectChange('smtp_auth' as any)}>\n <option value=\"plain\">PLAIN</option>\n <option value=\"login\">LOGIN</option>\n <option value=\"cram-md5\">CRAMMD5</option>\n </Select>\n <FormHelperText>\n Mechanismus přihlášení k SMTP. Pokud si nejste jisti, zvolte PLAIN nebo LOGIN. Někteří poskytovatelé vyžadují konkrétní metodu.\n </FormHelperText>\n </FormControl>\n </SimpleGrid>\n <FormControl display=\"flex\" alignItems=\"center\">\n <FormLabel\n mb={0}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n flex=\"1\"\n >\n <Box>Přeskočit ověření certifikátu</Box>\n <HelpTooltipCard\n label=\"Bezpečnost\"\n title=\"Kdy (ne) přeskakovat ověření certifikátu\"\n items={[\n 'Standardně ponechte kontrolu certifikátu zapnutou chrání spojení se SMTP serverem.',\n 'Volbu zapněte jen při testování na serverech se selfsigned nebo neplatným certifikátem.',\n 'V produkci je přeskakování ověření certifikátu nedoporučené zvyšuje riziko MITM útoků.',\n ]}\n />\n </FormLabel>\n <Switch isChecked={!!(settings as any).smtp_skip_verify} onChange={handleBoolChange('smtp_skip_verify' as any)} />\n <FormHelperText ml={{ base: 0, md: 4 }}>\n Pokročilé: povolte pouze při chybách certifikátu (selfsigned apod.). Nedoporučeno v produkci snižuje bezpečnost.\n </FormHelperText>\n </FormControl>\n\n <Divider />\n <HStack justify=\"space-between\" align=\"center\">\n <Heading size=\"sm\">Test email</Heading>\n <HelpTooltipCard\n label=\"Jak funguje test\"\n title=\"Co dělá testovací email\"\n items={[\n 'Odešle krátký email pomocí aktuálně vyplněného SMTP nastavení.',\n 'Můžete zadat libovolnou platnou adresu; pokud ji necháte prázdnou, použije se výchozí administrátorský email z nastavení.',\n 'Hodí se pro rychlé ověření správnosti hosta, portu, šifrování a přihlašovacích údajů.',\n ]}\n />\n </HStack>\n <HStack>\n <Input placeholder=\"test@example.com (volitelné)\" value={testEmail} onChange={(e)=> setTestEmail(e.target.value)} maxW={{ base: '100%', md: '320px' }} />\n <Button onClick={sendSmtpTest} isLoading={testing}>Odeslat test</Button>\n </HStack>\n\n <Divider />\n <HStack>\n <Button onClick={handleSave} isLoading={saving} bg=\"brand.primary\" color=\"text.onPrimary\" _hover={{ filter: 'brightness(0.95)' }}>Uložit nastavení</Button>\n </HStack>\n </VStack>\n </TabPanel>\n\n <TabPanel>\n <VStack align=\"stretch\" spacing={4}>\n <Heading size=\"sm\">Webová analytika</Heading>\n <Text fontSize=\"sm\" color=\"gray.600\">\n Nastavení sledování návštěvnosti webu pomocí open-source nástroje pro webovou analytiku.\n </Text>\n \n {umamiConfig?.enabled && umamiConfig?.website_id ? (\n <Box p={4} borderWidth=\"1px\" borderRadius=\"md\" bg=\"green.50\" borderColor=\"green.200\">\n <HStack spacing={2} mb={2}>\n <Text fontWeight=\"bold\" color=\"green.700\">✓ Analytika je aktivní</Text>\n </HStack>\n <Text fontSize=\"sm\" color=\"gray.700\">Website ID: <strong>{umamiConfig.website_id}</strong></Text>\n </Box>\n ) : (\n <Box p={4} borderWidth=\"1px\" borderRadius=\"md\" bg=\"yellow.50\" borderColor=\"yellow.200\">\n <Text fontWeight=\"bold\" color=\"yellow.700\">⚠ Analytika není nakonfigurována</Text>\n <Text fontSize=\"sm\" color=\"gray.700\" mt={1}>Vytvořte webovou stránku pro aktivaci sledování.</Text>\n </Box>\n )}\n\n <Divider />\n\n <Heading size=\"sm\">Vytvořit novou webovou stránku</Heading>\n <FormControl>\n <FormLabel>Název webové stránky</FormLabel>\n <Input \n value={umamiName} \n onChange={(e) => setUmamiName(e.target.value)} \n placeholder={settings.club_name || 'Fotbal Club'}\n />\n <FormHelperText>Název, který se zobrazí v dashboardu analytiky</FormHelperText>\n </FormControl>\n\n <FormControl>\n <FormLabel>Doména</FormLabel>\n <Input \n value={umamiDomain} \n onChange={(e) => setUmamiDomain(e.target.value)} \n placeholder={window.location.hostname}\n />\n <FormHelperText>Doména vašeho webu (např. fotbal.example.com)</FormHelperText>\n </FormControl>\n\n <HStack>\n <Button\n onClick={async () => {\n if (!umamiName || !umamiDomain) {\n toast({\n title: 'Chyba',\n description: 'Vyplňte název i doménu',\n status: 'error',\n });\n return;\n }\n setUmamiInitializing(true);\n try {\n const response = await api.post('/admin/insights/initialize', {\n name: umamiName,\n domain: umamiDomain,\n });\n setUmamiWebsiteId(response.data.website_id);\n toast({\n title: 'Úspěch',\n description: `Webová stránka pro analytiku vytvořena! ID: ${response.data.website_id}`,\n status: 'success',\n duration: 5000,\n });\n // Refresh config\n await fetchUmamiConfig();\n } catch (error: any) {\n const errorMsg = error?.response?.data?.error || error.message || 'Vytvoření selhalo';\n toast({\n title: 'Chyba',\n description: errorMsg,\n status: 'error',\n duration: 7000,\n });\n } finally {\n setUmamiInitializing(false);\n }\n }}\n isLoading={umamiInitializing}\n bg=\"brand.primary\"\n color=\"text.onPrimary\"\n _hover={{ filter: 'brightness(0.95)' }}\n >\n Vytvořit webovou stránku\n </Button>\n <Button\n onClick={fetchUmamiConfig}\n variant=\"outline\"\n >\n Aktualizovat stav\n </Button>\n </HStack>\n\n <Text fontSize=\"xs\" color=\"gray.500\" mt={2}>\n Poznámka: Pro aktivaci analytiky je nutné mít nastavené přihlašovací údaje v .env souboru.\n </Text>\n </VStack>\n </TabPanel>\n\n <TabPanel>\n <VStack align=\"stretch\" spacing={4}>\n <Heading size=\"sm\">SEO nastavení</Heading>\n <Text fontSize=\"sm\" color=\"gray.600\" mb={4}>\n Základní SEO nastavení pro lepší viditelnost ve vyhledávačích.\n </Text>\n\n <FormControl>\n <FormLabel>Titulek webu</FormLabel>\n <Input value={seo.site_title || ''} onChange={handleSeoChange('site_title')} />\n <FormHelperText>Hlavní název webu, zobrazí se v záložce prohlížeče a ve výsledcích vyhledávání</FormHelperText>\n </FormControl>\n\n <FormControl>\n <FormLabel>Popis webu</FormLabel>\n <Textarea \n value={(seo as any).site_description || ''} \n onChange={(e) => setSeo((prev) => ({ ...prev, site_description: e.target.value } as any))}\n rows={3}\n />\n <FormHelperText>Krátký popis webu pro vyhledávače (doporučeno 150-160 znaků)</FormHelperText>\n </FormControl>\n\n <FormControl>\n <FormLabel>Klíčová slova</FormLabel>\n <Input \n value={(seo as any).keywords || ''} \n onChange={(e) => setSeo((prev) => ({ ...prev, keywords: e.target.value } as any))}\n />\n <FormHelperText>Klíčová slova oddělená čárkou (např: fotbal, klub, sport)</FormHelperText>\n </FormControl>\n\n <Divider />\n\n <Heading size=\"sm\">Open Graph (sociální sítě)</Heading>\n \n <FormControl>\n <FormLabel>Výchozí OG obrázek (URL)</FormLabel>\n <Input value={seo.default_og_image_url || ''} onChange={handleSeoChange('default_og_image_url')} />\n <FormHelperText>Výchozí obrázek pro sdílení na sociálních sítích (doporučeno 1200x630px)</FormHelperText>\n </FormControl>\n\n <FormControl>\n <FormLabel>OG Type</FormLabel>\n <Select \n value={(seo as any).og_type || 'website'} \n onChange={(e) => setSeo((prev) => ({ ...prev, og_type: e.target.value } as any))}\n >\n <option value=\"website\">Website</option>\n <option value=\"article\">Article</option>\n <option value=\"profile\">Profile</option>\n </Select>\n <FormHelperText>Typ obsahu pro Open Graph</FormHelperText>\n </FormControl>\n\n <Divider />\n\n <Heading size=\"sm\">Twitter Card</Heading>\n \n <FormControl>\n <FormLabel>Twitter Card Type</FormLabel>\n <Select \n value={(seo as any).twitter_card || 'summary_large_image'} \n onChange={(e) => setSeo((prev) => ({ ...prev, twitter_card: e.target.value } as any))}\n >\n <option value=\"summary\">Summary</option>\n <option value=\"summary_large_image\">Summary Large Image</option>\n </Select>\n <FormHelperText>Typ karty pro Twitter</FormHelperText>\n </FormControl>\n\n <FormControl>\n <FormLabel>Twitter Site</FormLabel>\n <Input \n value={(seo as any).twitter_site || ''} \n onChange={(e) => setSeo((prev) => ({ ...prev, twitter_site: e.target.value } as any))}\n placeholder=\"@nazev_uctu\"\n />\n <FormHelperText>Twitter účet webu (např. @fotbalklub)</FormHelperText>\n </FormControl>\n\n <HStack>\n <Button onClick={saveSEO} bg=\"brand.primary\" color=\"text.onPrimary\" _hover={{ filter: 'brightness(0.95)' }}>Uložit SEO</Button>\n </HStack>\n </VStack>\n </TabPanel>\n </TabPanels>\n </Tabs>\n\n <Divider my={4} />\n <HStack>\n <Button onClick={handleSave} isLoading={saving} bg=\"brand.primary\" color=\"text.onPrimary\" _hover={{ filter: 'brightness(0.95)' }}>Uložit nastavení</Button>\n </HStack>\n </Box>\n </AdminLayout>\n );\n};\n\nexport default SettingsAdminPage;\n","import React, { useEffect, useMemo, useState } from 'react';\nimport {\n Box,\n Heading,\n Text,\n List,\n ListItem,\n Link,\n Divider,\n Code,\n OrderedList,\n HStack,\n IconButton,\n useColorModeValue,\n useToast,\n VStack,\n Badge,\n SimpleGrid,\n Icon,\n Accordion,\n AccordionItem,\n AccordionButton,\n AccordionPanel,\n AccordionIcon,\n Alert,\n AlertIcon,\n AlertTitle,\n AlertDescription,\n Button,\n Input,\n InputGroup,\n InputLeftElement,\n Spinner,\n Tabs,\n TabList,\n TabPanels,\n Tab,\n TabPanel,\n Container,\n} from '@chakra-ui/react';\nimport { useTranslation } from 'react-i18next';\nimport {\n FaLink,\n FaArrowUp,\n FaCog,\n FaNewspaper,\n FaFutbol,\n FaUsers,\n FaImage,\n FaPhotoVideo,\n FaFolderOpen,\n FaHandshake,\n FaEnvelope,\n FaAward,\n FaSyncAlt,\n FaVideo,\n FaCalendarAlt,\n FaPalette,\n FaCommentAlt,\n FaKey,\n FaSearch,\n FaBug,\n FaLightbulb,\n FaCheckCircle,\n FaExclamationTriangle,\n FaTachometerAlt,\n FaChartLine,\n FaAddressBook,\n FaChalkboard,\n FaMobileAlt,\n FaInfoCircle,\n FaListOl,\n FaBook,\n FaBookOpen,\n FaComments,\n FaClipboardList,\n FaBolt,\n FaEdit,\n FaPaintBrush,\n FaLifeRing,\n} from 'react-icons/fa';\nimport AdminLayout from '../../layouts/AdminLayout';\n\nconst AdminDocsPage: React.FC = () => {\n const { t } = useTranslation();\n const sections = useMemo(\n () => [\n { id: 'uvod', label: 'Úvod a přehled', icon: FaLightbulb },\n { id: 'nastaveni', label: 'Nastavení klubu', icon: FaCog },\n { id: 'dashboard', label: 'Dashboard a přehledy', icon: FaTachometerAlt },\n { id: 'clanky', label: 'Články a kategorie', icon: FaNewspaper },\n { id: 'zapasy', label: 'Zápasy a tabulky', icon: FaFutbol },\n { id: 'hraci-tymy', label: 'Hráči a týmy', icon: FaUsers },\n { id: 'media', label: 'Média a soubory', icon: FaPhotoVideo },\n { id: 'gallery', label: 'Galerie', icon: FaImage },\n { id: 'files', label: 'Správa souborů', icon: FaFolderOpen },\n { id: 'sponzori-bannery', label: 'Sponzoři a bannery', icon: FaHandshake },\n { id: 'newsletter', label: 'Newsletter a e-maily', icon: FaEnvelope },\n { id: 'aliasy', label: 'Alias soutěží', icon: FaAward },\n { id: 'prefetch', label: 'Prefetch a cache', icon: FaSyncAlt },\n { id: 'videa', label: 'Videa', icon: FaVideo },\n { id: 'aktivity', label: 'Aktivity', icon: FaCalendarAlt },\n { id: 'merch', label: 'Oblečení', icon: FaPalette },\n { id: 'zpravy', label: 'Zprávy', icon: FaCommentAlt },\n { id: 'contacts', label: 'Kontakty a formuláře', icon: FaAddressBook },\n { id: 'analytics', label: 'Analytics a reporty', icon: FaChartLine },\n { id: 'scoreboard', label: 'Tabule (Scoreboard)', icon: FaChalkboard },\n { id: 'mobile-scoreboard', label: 'Mobilní scoreboard', icon: FaMobileAlt },\n { id: 'uzivatele', label: 'Uživatelé a přístupy', icon: FaKey },\n { id: 'docs', label: 'Interní dokumentace', icon: FaInfoCircle },\n { id: 'checklist', label: 'Checklisty a postupy', icon: FaListOl },\n { id: 'seo', label: 'SEO a metadata', icon: FaSearch },\n { id: 'troubleshooting', label: 'Řešení problémů', icon: FaBug },\n ],\n []\n );\n\n const [activeId, setActiveId] = useState<string>('');\n const toast = useToast();\n\n useEffect(() => {\n const observer = new IntersectionObserver(\n (entries) => {\n const visible = entries\n .filter((e) => e.isIntersecting)\n .sort((a, b) => (a.boundingClientRect.top > b.boundingClientRect.top ? 1 : -1));\n if (visible[0]) {\n setActiveId(visible[0].target.id);\n }\n },\n { rootMargin: '-20% 0px -60% 0px', threshold: [0, 0.25, 0.5, 0.75, 1] }\n );\n const els = sections.map((s) => document.getElementById(s.id)).filter(Boolean) as Element[];\n els.forEach((el) => observer.observe(el));\n return () => observer.disconnect();\n }, [sections]);\n\n useEffect(() => {\n if (activeId) {\n try {\n localStorage.setItem('adminDocs:lastAnchor', activeId);\n } catch {}\n }\n }, [activeId]);\n\n useEffect(() => {\n const t = setTimeout(() => {\n const hash = (window.location.hash || '').replace('#', '').trim();\n let targetId = hash;\n if (!targetId) {\n try {\n targetId = localStorage.getItem('adminDocs:lastAnchor') || '';\n } catch {}\n }\n if (targetId) {\n const el = document.getElementById(targetId);\n if (el) {\n el.scrollIntoView({ behavior: 'smooth', block: 'start' });\n setActiveId(targetId);\n }\n }\n }, 50);\n return () => clearTimeout(t);\n }, []);\n\n const copyDeepLink = async (id: string) => {\n try {\n const url = `${window.location.origin}${window.location.pathname}#${id}`;\n await navigator.clipboard.writeText(url);\n toast({\n title: 'Odkaz zkopírován',\n status: 'success',\n duration: 1500,\n isClosable: true,\n });\n } catch {\n toast({\n title: 'Nelze zkopírovat odkaz',\n status: 'error',\n duration: 2000,\n isClosable: true,\n });\n }\n };\n\n const tocActiveColor = useColorModeValue('blue.700', 'blue.300');\n const tocActiveBg = useColorModeValue('blue.50', 'blue.900');\n const bgCard = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n\n const SectionHeader = ({ id, icon, title }: { id: string; icon: any; title: string }) => (\n <HStack align=\"center\" justify=\"space-between\" mb={4} id={id} scrollMarginTop=\"100px\">\n <HStack spacing={3}>\n <Box p={2} bg={useColorModeValue('blue.50', 'blue.900')} borderRadius=\"lg\">\n <Icon as={icon} color={useColorModeValue('blue.600', 'blue.300')} boxSize={5} />\n </Box>\n <Heading size=\"lg\" color={useColorModeValue('gray.800', 'white')}>\n {title}\n </Heading>\n </HStack>\n <IconButton\n aria-label=\"Zkopírovat odkaz\"\n variant=\"ghost\"\n size=\"sm\"\n icon={<FaLink />}\n onClick={() => copyDeepLink(id)}\n borderRadius=\"full\"\n />\n </HStack>\n );\n\n return (\n <AdminLayout>\n <Box maxW=\"1400px\" mx=\"auto\">\n <Box\n display={{ base: 'block', lg: 'grid' }}\n gridTemplateColumns={{ base: '1fr', lg: '280px 1fr' }}\n gap={8}\n >\n {/* Sticky TOC */}\n <Box display={{ base: 'none', lg: 'block' }}>\n <Box position=\"sticky\" top=\"100px\" maxH=\"calc(100vh - 120px)\" overflowY=\"auto\">\n <Box bg={bgCard} p={5} borderRadius=\"xl\" borderWidth=\"1px\" borderColor={borderColor} shadow=\"md\">\n <HStack mb={4} spacing={2}>\n <Icon as={FaBook} color={useColorModeValue('blue.600', 'blue.300')} boxSize={4} />\n <Heading size=\"sm\" color={useColorModeValue('gray.700', 'gray.200')}>\n Rychlá navigace\n </Heading>\n </HStack>\n <VStack spacing={1.5} align=\"stretch\">\n {sections.map((s) => (\n <Link\n key={s.id}\n href={`#${s.id}`}\n display=\"flex\"\n alignItems=\"center\"\n px={3}\n py={2.5}\n borderRadius=\"lg\"\n bg={activeId === s.id ? tocActiveBg : 'transparent'}\n color={activeId === s.id ? tocActiveColor : 'inherit'}\n fontWeight={activeId === s.id ? 'semibold' : 'medium'}\n fontSize=\"sm\"\n _hover={{ bg: tocActiveBg, textDecoration: 'none' }}\n transition=\"all 0.2s\"\n onClick={(e) => {\n e.preventDefault();\n try {\n localStorage.setItem('adminDocs:lastAnchor', s.id);\n } catch {}\n const el = document.getElementById(s.id);\n if (el) {\n el.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n window.history.pushState(null, '', `#${s.id}`);\n }\n }}\n >\n <Icon as={s.icon} mr={2.5} boxSize={4} />\n <Text flex={1}>{s.label}</Text>\n </Link>\n ))}\n </VStack>\n </Box>\n </Box>\n </Box>\n\n {/* Main content */}\n <Box>\n <Box bg={bgCard} p={8} borderRadius=\"xl\" borderWidth=\"1px\" borderColor={borderColor} shadow=\"sm\">\n <Box id=\"top\" mb={4} />\n <Box mb={8}>\n <HStack mb={3} spacing={3}>\n <Icon as={FaBookOpen} color={useColorModeValue('blue.600', 'blue.400')} boxSize={10} />\n <Heading size=\"2xl\">Dokumentace</Heading>\n </HStack>\n <Text color=\"gray.600\" fontSize=\"lg\" mb={6}>\n Kompletní průvodce administrací vašeho klubového webu - vytvořeno pro každého, i bez technických znalostí\n </Text>\n\n <Alert status=\"info\" borderRadius=\"lg\" variant=\"left-accent\" mb={4}>\n <AlertIcon />\n <Box>\n <AlertTitle fontSize=\"md\">Vítejte v admin panelu!</AlertTitle>\n <AlertDescription fontSize=\"sm\">\n Tato dokumentace vás krok za krokem provede všemi funkcemi systému. Pro rychlý start\n doporučujeme začít{' '}\n <Link href=\"#nastaveni\" color=\"blue.600\" fontWeight=\"semibold\">\n nastavením klubu\n </Link>\n .\n </AlertDescription>\n </Box>\n </Alert>\n\n <Alert status=\"success\" borderRadius=\"lg\" variant=\"left-accent\">\n <AlertIcon />\n <Box>\n <AlertTitle fontSize=\"md\">\n <HStack spacing={2} display=\"inline-flex\">\n <Icon as={FaComments} boxSize={4} />\n <Text as=\"span\">Potřebujete pomoc nebo vlastní úpravy?</Text>\n </HStack>\n </AlertTitle>\n <AlertDescription fontSize=\"sm\">\n <strong>Technická podpora:</strong> Máte-li jakékoli dotazy nebo narazíte na problém, napište nám na{' '}\n <Link href=\"mailto:help@tdvorak.dev\" color=\"blue.600\" fontWeight=\"bold\">\n help@tdvorak.dev\n </Link>\n {' '}— odpovídáme do 24 hodin.\n <br />\n <strong>Vlastní úpravy:</strong> Hledáte specifické funkce nebo přizpůsobení webu vašim potřebám? \n Kontaktujte nás a společně zjistíme, zda je vaše představa realizovatelná. \n Rádi vám pomůžeme!\n </AlertDescription>\n </Box>\n </Alert>\n </Box>\n\n <Divider my={8} />\n\n {/* ÚVOD Section */}\n <Box id=\"uvod\" scrollMarginTop=\"100px\">\n <SectionHeader id=\"uvod\" icon={FaLightbulb} title=\"Úvod a přehled\" />\n \n <VStack align=\"stretch\" spacing={4} mb={8}>\n <Text fontSize=\"md\" color=\"gray.700\">\n Tento administrační systém vám umožňuje jednoduše spravovat kompletní klubový web — od článků, přes\n zápasy a výsledky, až po newsletter a galerie. <strong>Není potřeba žádné programování ani technické znalosti.</strong> Vše je navrženo tak, aby to zvládl každý člen klubu.\n </Text>\n\n <Box\n p={4}\n bg={useColorModeValue('blue.50', 'blue.900')}\n borderRadius=\"lg\"\n borderLeftWidth=\"4px\"\n borderLeftColor=\"blue.500\"\n >\n <Text fontSize=\"md\" color=\"blue.800\" fontWeight=\"medium\">\n <strong>Co můžete dělat:</strong> Přidávat články, spravovat zápasy, nahrávat fotky do galerie, \n posílat newslettery fanouškům, upravovat vzhled webu a mnoho dalšího. Vše přehledně na jednom místě.\n </Text>\n </Box>\n\n <HStack mt={4} mb={2} spacing={2}>\n <Icon as={FaBolt} color={useColorModeValue('orange.500', 'orange.300')} boxSize={4} />\n <Heading size=\"sm\">Rychlé odkazy na nejpoužívanější sekce</Heading>\n </HStack>\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={3}>\n {[\n { icon: FaNewspaper, title: 'Články', desc: 'Publikujte novinky a reportáže', link: '/admin/clanky' },\n { icon: FaFutbol, title: 'Zápasy', desc: 'Automatické načítání z FAČR', link: '/admin/zapasy' },\n { icon: FaUsers, title: 'Hráči a týmy', desc: 'Správa soupisek', link: '/admin/hraci' },\n { icon: FaImage, title: 'Galerie', desc: `${t('homepage.gallery')} a alba`, link: '/admin/galerie' },\n { icon: FaPhotoVideo, title: 'Média', desc: 'Nahrávání obrázků a souborů', link: '/admin/soubory' },\n { icon: FaEnvelope, title: 'Newsletter', desc: 'E-mailové kampaně', link: '/admin/newsletter' },\n { icon: FaCog, title: 'Nastavení klubu', desc: 'Logo, barvy, kontakty', link: '/admin/nastaveni' },\n { icon: FaHandshake, title: 'Sponzoři', desc: 'Správa partnerů klubu', link: '/admin/sponzori' },\n { icon: FaVideo, title: 'Videa', desc: 'YouTube a další videa', link: '/admin/videa' },\n { icon: FaCalendarAlt, title: 'Aktivity', desc: 'Kalendář akcí', link: '/admin/aktivity' },\n { icon: FaChartLine, title: 'Analytics', desc: 'Statistiky návštěvnosti', link: '/admin/analytika' },\n { icon: FaSyncAlt, title: 'Prefetch', desc: 'Aktualizace dat z FAČR', link: '/admin/prefetch' },\n ].map((item, idx) => (\n <Link\n key={idx}\n href={item.link}\n _hover={{ textDecoration: 'none' }}\n >\n <HStack\n p={4}\n bg={useColorModeValue('gray.50', 'gray.700')}\n borderRadius=\"lg\"\n borderWidth=\"1px\"\n borderColor={borderColor}\n _hover={{ shadow: 'md', transform: 'translateY(-2px)', borderColor: 'blue.400' }}\n transition=\"all 0.2s\"\n cursor=\"pointer\"\n >\n <Box p={2} bg=\"blue.50\" borderRadius=\"md\">\n <Icon as={item.icon} color=\"blue.600\" boxSize={5} />\n </Box>\n <VStack align=\"start\" spacing={0} flex={1}>\n <Text fontWeight=\"semibold\" fontSize=\"sm\">\n {item.title}\n </Text>\n <Text fontSize=\"xs\" color=\"gray.500\">\n {item.desc}\n </Text>\n </VStack>\n </HStack>\n </Link>\n ))}\n </SimpleGrid>\n\n <Alert status=\"info\" borderRadius=\"lg\" mt={4}>\n <AlertIcon />\n <Box>\n <AlertTitle fontSize=\"sm\">\n <HStack spacing={2} display=\"inline-flex\">\n <Icon as={FaLightbulb} boxSize={3} />\n <Text as=\"span\">Tip pro začátečníky</Text>\n </HStack>\n </AlertTitle>\n <AlertDescription fontSize=\"sm\">\n Pokud jste zde poprvé, začněte v pořadí: <strong>1) Nastavení</strong> (vyplňte název klubu a logo), \n <strong>2) Média</strong> (nahrajte pár obrázků), <strong>3) Články</strong> (vytvořte první příspěvek). \n Zbytek můžete prozkoumávat postupně!\n </AlertDescription>\n </Box>\n </Alert>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* NASTAVENÍ Section */}\n <Box>\n <SectionHeader id=\"nastaveni\" icon={FaCog} title=\"Nastavení klubu\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Alert status=\"warning\" borderRadius=\"lg\">\n <AlertIcon />\n <Text fontSize=\"sm\">\n <strong><Icon as={FaExclamationTriangle} boxSize={3} display=\"inline\" mr={1} />Začněte zde!</strong> Nastavení je první, co byste měli vyplnit. Ovlivňuje\n vzhled webu, e-maily, načítání zápasů a další funkce. Bez správného nastavení web nebude fungovat optimálně.\n </Text>\n </Alert>\n\n <Link href=\"/admin/nastaveni\" isExternal>\n <HStack\n p={3}\n bg={useColorModeValue('blue.50', 'blue.900')}\n borderRadius=\"lg\"\n _hover={{ bg: useColorModeValue('blue.100', 'blue.800') }}\n transition=\"all 0.2s\"\n >\n <Icon as={FaCog} color=\"blue.600\" boxSize={5} />\n <Text fontWeight=\"bold\" color=\"blue.700\">\n → Otevřít Nastavení klubu\n </Text>\n </HStack>\n </Link>\n\n <HStack mt={2} spacing={2}>\n <Icon as={FaClipboardList} color={useColorModeValue('blue.600', 'blue.300')} boxSize={4} />\n <Heading size=\"sm\">Co nastavit? (Krok za krokem)</Heading>\n </HStack>\n <OrderedList spacing={3} pl={5}>\n <ListItem>\n <strong>Název klubu</strong> — Plný název vašeho fotbalového klubu (zobrazuje se v záhlaví webu, e-mailech a všude na stránkách)\n </ListItem>\n <ListItem>\n <strong>Logo klubu</strong> — Nejdříve nahrajte logo do sekce{' '}\n <Link href=\"/admin/soubory\" color=\"blue.600\" fontWeight=\"bold\">\n Média\n </Link>\n , poté zkopírujte adresu obrázku (URL) a vložte ji sem\n </ListItem>\n <ListItem>\n <strong>Barvy</strong> — Primární barva (hlavní barva klubu) a sekundární barva (doplňková). Použijte barevné kódy jako např. #FF0000 pro červenou\n </ListItem>\n <ListItem>\n <strong>SMTP nastavení (pro e-maily)</strong> — Nutné pro odesílání newsletterů a automatických e-mailů. Potřebujete: \n adresu serveru (host), port (465 nebo 587), uživatelské jméno a heslo\n </ListItem>\n <ListItem>\n <strong>FAČR údaje</strong> — Club ID a Club Type získáte z{' '}\n <Link href=\"https://is.fotbal.cz\" color=\"blue.600\" isExternal>\n is.fotbal.cz\n </Link>\n . Tyto údaje slouží k automatickému načítání zápasů a tabulek\n </ListItem>\n <ListItem>\n <strong>Sociální sítě</strong> — Vložte odkazy na Facebook, Instagram, YouTube profily klubu. Ikony se zobrazí v patičce webu\n </ListItem>\n <ListItem>\n <strong>Kontaktní údaje</strong> — E-mail, telefon a adresa klubu pro kontaktní stránku\n </ListItem>\n </OrderedList>\n\n <Box\n p={4}\n bg={useColorModeValue('blue.50', 'blue.900')}\n borderRadius=\"lg\"\n borderLeftWidth=\"4px\"\n borderLeftColor=\"blue.500\"\n >\n <HStack spacing={2} mb={2}>\n <Icon as={FaLightbulb} color=\"blue.600\" />\n <Text fontWeight=\"semibold\" color=\"blue.800\">\n Tip pro SMTP (e-mailové nastavení)\n </Text>\n </HStack>\n <Text fontSize=\"sm\" color=\"blue.700\" mb={2}>\n <strong>Port 465</strong> používá SSL zabezpečení, <strong>port 587</strong> používá STARTTLS. \n </Text>\n <Text fontSize=\"sm\" color=\"blue.700\">\n <strong>Používáte Gmail?</strong> Gmail vyžaduje „App Password\" (heslo aplikace), ne vaše běžné heslo! \n Nastavte si ho v Google Account → Security → 2-Step Verification → App passwords.\n </Text>\n </Box>\n\n <Box\n p={4}\n bg={useColorModeValue('green.50', 'green.900')}\n borderRadius=\"lg\"\n borderLeftWidth=\"4px\"\n borderLeftColor=\"green.500\"\n >\n <HStack spacing={2} mb={2}>\n <Icon as={FaLightbulb} color=\"green.600\" />\n <Text fontWeight=\"semibold\" color=\"green.800\">\n Nejste si jistí některým nastavením?\n </Text>\n </HStack>\n <Text fontSize=\"sm\" color=\"green.700\">\n Žádný problém! Napište nám na{' '}\n <Link href=\"mailto:help@tdvorak.dev\" color=\"green.600\" fontWeight=\"bold\">\n help@tdvorak.dev\n </Link>\n {' '}a pomůžeme vám se vším nastavit. Odpovídáme do 24 hodin.\n </Text>\n </Box>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* DASHBOARD Section */}\n <Box>\n <SectionHeader id=\"dashboard\" icon={FaTachometerAlt} title=\"Dashboard a přehledy\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Hned po přihlášení najdete v sekci{' '}\n <Link href=\"/admin\" color=\"blue.600\">Dashboard</Link> souhrn nejdůležitějších informací o webu a klubu.\n </Text>\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={4}>\n {[{\n title: 'Rychlý přehled',\n desc: 'Poslední články, plán zápasů, e-mailové statistiky.'\n }, {\n title: 'Akční dlaždice',\n desc: 'Tlačítka pro vytvoření článku, spuštění prefetch nebo import aliasů.'\n }, {\n title: 'Notifikace',\n desc: 'Varování na chybějící nastavení nebo neúspěšné importy.'\n }, {\n title: 'Widget aktivit',\n desc: 'Seznam nejbližších akcí z kalendáře aktivit.'\n }].map((item, idx) => (\n <Box\n key={idx}\n p={4}\n borderWidth=\"1px\"\n borderColor={borderColor}\n borderRadius=\"lg\"\n bg={useColorModeValue('gray.50', 'gray.700')}\n >\n <Heading size=\"sm\" mb={2}>{item.title}</Heading>\n <Text fontSize=\"sm\" color=\"gray.600\">{item.desc}</Text>\n </Box>\n ))}\n </SimpleGrid>\n <Alert status=\"info\" borderRadius=\"lg\">\n <AlertIcon />\n <Text fontSize=\"sm\">\n Dashboard vychází z real-time dat. Pokud něco chybí, spusťte{' '}\n <Link href=\"/admin/prefetch\" color=\"blue.600\">Prefetch</Link> nebo obnovte stránku.\n </Text>\n </Alert>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* ČLÁNKY Section */}\n <Box>\n <SectionHeader id=\"clanky\" icon={FaNewspaper} title=\"Články a kategorie\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Články jsou hlavní způsob, jak komunikovat s fanoušky. Můžete publikovat novinky,\n reportáže, rozhovory a další obsah. Je to jednoduché jako psaní příspěvku na Facebook!\n </Text>\n\n <Link href=\"/admin/clanky\" isExternal>\n <HStack\n p={3}\n bg={useColorModeValue('blue.50', 'blue.900')}\n borderRadius=\"lg\"\n _hover={{ bg: useColorModeValue('blue.100', 'blue.800') }}\n transition=\"all 0.2s\"\n >\n <Icon as={FaNewspaper} color=\"blue.600\" boxSize={5} />\n <Text fontWeight=\"bold\" color=\"blue.700\">\n → Otevřít Články\n </Text>\n </HStack>\n </Link>\n\n <Accordion allowToggle>\n <AccordionItem borderColor={borderColor}>\n <h3>\n <AccordionButton _expanded={{ bg: 'blue.50', color: 'blue.700' }}>\n <HStack flex=\"1\" textAlign=\"left\" fontWeight=\"semibold\">\n <Icon as={FaEdit} boxSize={4} />\n <Text>Jak vytvořit článek? (Krok za krokem)</Text>\n </HStack>\n <AccordionIcon />\n </AccordionButton>\n </h3>\n <AccordionPanel pb={4}>\n <OrderedList spacing={2}>\n <ListItem>\n Otevřete sekci{' '}\n <Link href=\"/admin/clanky\" color=\"blue.600\" fontWeight=\"bold\">\n Články\n </Link>\n </ListItem>\n <ListItem>Klikněte na zelené tlačítko „Vytvořit článek\" (vpravo nahoře)</ListItem>\n <ListItem>\n <strong>Vyplňte název článku</strong> — např. \"Vítězství 3:1 proti Sokolu\"\n </ListItem>\n <ListItem>\n <strong>Napište obsah</strong> — Můžete psát normální text. Pro pokročilé: podporován HTML/Markdown formát\n </ListItem>\n <ListItem>\n <strong>Vyberte kategorii</strong> — např. \"Zápasy\", \"Aktuality\", \"Rozhovory\". Pokud kategorie neexistuje, vytvořte novou\n </ListItem>\n <ListItem>\n <strong>Přidejte hlavní obrázek</strong> — Nejprve nahrajte obrázek do{' '}\n <Link href=\"/admin/soubory\" color=\"blue.600\" fontWeight=\"bold\">Média</Link>, \n poté zkopírujte jeho adresu (URL) a vložte ji do pole \"Obrázek\"\n </ListItem>\n <ListItem>\n <strong>Vyplňte SEO titulek a popis</strong> — Pomáhá návštěvníkům najít článek přes Google\n </ListItem>\n <ListItem>\n <strong>Zaškrtněte „Publikovat\"</strong> pokud chcete článek hned zveřejnit. Pokud ne, můžete ho uložit jako koncept\n </ListItem>\n <ListItem>Klikněte na „Uložit\" — Hotovo! <Icon as={FaCheckCircle} boxSize={3} display=\"inline\" color=\"green.500\" /></ListItem>\n </OrderedList>\n </AccordionPanel>\n </AccordionItem>\n\n <AccordionItem borderColor={borderColor}>\n <h3>\n <AccordionButton>\n <HStack flex=\"1\" textAlign=\"left\" fontWeight=\"semibold\">\n <Icon as={FaPaintBrush} boxSize={4} />\n <Text>Jak přidat obrázky a videa do článku?</Text>\n </HStack>\n <AccordionIcon />\n </AccordionButton>\n </h3>\n <AccordionPanel pb={4}>\n <Text mb={2} fontSize=\"sm\">\n <strong>Pro obrázky:</strong>\n </Text>\n <OrderedList spacing={2} fontSize=\"sm\">\n <ListItem>Nahrajte obrázek v sekci <Link href=\"/admin/soubory\" color=\"blue.600\">Média</Link></ListItem>\n <ListItem>Zkopírujte adresu obrázku (např. <Code>/uploads/2025/01/foto.jpg</Code>)</ListItem>\n <ListItem>V editoru článku použijte HTML: <Code>&lt;img src=\"/uploads/2025/01/foto.jpg\" alt=\"Popis\" /&gt;</Code></ListItem>\n </OrderedList>\n <Text mt={3} mb={2} fontSize=\"sm\">\n <strong>Pro YouTube videa:</strong>\n </Text>\n <Text fontSize=\"sm\">\n Zkopírujte YouTube odkaz a vložte přímo do obsahu, nebo použijte HTML embed kód z YouTube.\n </Text>\n </AccordionPanel>\n </AccordionItem>\n\n <AccordionItem borderColor={borderColor}>\n <h3>\n <AccordionButton>\n <HStack flex=\"1\" textAlign=\"left\" fontWeight=\"semibold\">\n <Icon as={FaSearch} boxSize={4} />\n <Text>SEO optimalizace (pro lepší viditelnost)</Text>\n </HStack>\n <AccordionIcon />\n </AccordionButton>\n </h3>\n <AccordionPanel pb={4}>\n <Text fontSize=\"sm\" mb={3}>\n SEO pomáhá lidem najít vaše články přes Google. Vyplňte tyto pole:\n </Text>\n <List spacing={2} styleType=\"disc\" pl={5}>\n <ListItem>\n <strong>SEO Titulek:</strong> 50-60 znaků, obsahuje klíčová slova (např. \"FK Dvorinka zvítězil 3:1 - reportáž ze zápasu\")\n </ListItem>\n <ListItem>\n <strong>SEO Popis:</strong> 150-160 znaků, krátké shrnutí článku pro Google výsledky\n </ListItem>\n <ListItem>\n <strong>URL Slug:</strong> Krátký text bez diakritiky, s pomlčkami (např. \"vitezstvi-3-1-sokol\")\n </ListItem>\n <ListItem>\n <strong>Obrázek:</strong> Optimalizujte velikost (max 1MB, ideálně 1200x630 px)\n </ListItem>\n </List>\n </AccordionPanel>\n </AccordionItem>\n </Accordion>\n\n <Alert status=\"success\" borderRadius=\"lg\" mt={2}>\n <AlertIcon />\n <Box>\n <AlertTitle fontSize=\"sm\">\n <HStack spacing={2} display=\"inline-flex\">\n <Icon as={FaLightbulb} boxSize={3} />\n <Text as=\"span\">Tip: Kategorie</Text>\n </HStack>\n </AlertTitle>\n <AlertDescription fontSize=\"sm\">\n Vytvořte si kategorie jako \"Zápasy\", \"Aktuality\", \"Mládež\", \"Rozhovory\" atd. \n Pomohou fanouškům rychle najít konkrétní typ obsahu!\n </AlertDescription>\n </Box>\n </Alert>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* ZÁPASY Section */}\n <Box>\n <SectionHeader id=\"zapasy\" icon={FaFutbol} title=\"Zápasy a tabulky\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Veškerá data o zápasech, tabulkách a výsledcích se <strong>automaticky načítají z FAČR</strong> (Fotbalová asociace ČR). \n Nemusíte nic zadávat ručně — stačí správné nastavení a systém vše stáhne sám!\n </Text>\n\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={3}>\n <Link href=\"/admin/zapasy\" isExternal>\n <HStack\n p={3}\n bg={useColorModeValue('blue.50', 'blue.900')}\n borderRadius=\"lg\"\n _hover={{ bg: useColorModeValue('blue.100', 'blue.800') }}\n transition=\"all 0.2s\"\n >\n <Icon as={FaFutbol} color=\"blue.600\" boxSize={5} />\n <Text fontWeight=\"bold\" color=\"blue.700\">\n → Zobrazit zápasy\n </Text>\n </HStack>\n </Link>\n <Link href=\"/admin/prefetch\" isExternal>\n <HStack\n p={3}\n bg={useColorModeValue('green.50', 'green.900')}\n borderRadius=\"lg\"\n _hover={{ bg: useColorModeValue('green.100', 'green.800') }}\n transition=\"all 0.2s\"\n >\n <Icon as={FaSyncAlt} color=\"green.600\" boxSize={5} />\n <Text fontWeight=\"bold\" color=\"green.700\">\n → Aktualizovat data (Prefetch)\n </Text>\n </HStack>\n </Link>\n </SimpleGrid>\n\n <HStack mt={2} spacing={2}>\n <Icon as={FaCog} color={useColorModeValue('blue.600', 'blue.300')} boxSize={4} />\n <Heading size=\"sm\">Jak nastavit automatické načítání zápasů?</Heading>\n </HStack>\n <OrderedList spacing={2} pl={5}>\n <ListItem>\n Přejděte do{' '}\n <Link href=\"/admin/nastaveni\" color=\"blue.600\" fontWeight=\"bold\">Nastavení</Link> klubu\n </ListItem>\n <ListItem>\n Najděte sekci <strong>\"FAČR údaje\"</strong>\n </ListItem>\n <ListItem>\n Vyplňte <strong>Club ID</strong> a <strong>Club Type</strong> (získáte z{' '}\n <Link href=\"https://is.fotbal.cz\" color=\"blue.600\" isExternal>is.fotbal.cz</Link>)\n </ListItem>\n <ListItem>\n Uložte nastavení a spusťte{' '}\n <Link href=\"/admin/prefetch\" color=\"blue.600\" fontWeight=\"bold\">Prefetch</Link> pro načtení dat\n </ListItem>\n <ListItem>\n Hotovo! Zápasy a tabulky se budou automaticky aktualizovat <Icon as={FaCheckCircle} boxSize={3} display=\"inline\" color=\"green.500\" />\n </ListItem>\n </OrderedList>\n\n <Box\n p={4}\n bg={useColorModeValue('blue.50', 'blue.900')}\n borderRadius=\"lg\"\n borderLeftWidth=\"4px\"\n borderLeftColor=\"blue.500\"\n >\n <HStack spacing={2} mb={2}>\n <Icon as={FaLightbulb} color=\"blue.600\" />\n <Text fontWeight=\"semibold\" color={useColorModeValue('blue.800', 'blue.200')}>\n Co jsou aliasy soutěží?\n </Text>\n </HStack>\n <Text fontSize=\"sm\" color={useColorModeValue('blue.700', 'blue.200')} mb={2}>\n Z FAČR někdy přicházejí dlouhé a nepřehledné názvy soutěží. V sekci{' '}\n <Link href=\"/admin/aliasy-soutezi\" color=\"blue.600\" fontWeight=\"bold\">\n Alias soutěží\n </Link>{' '}\n si můžete názvy zkrátit a upravit, jak se mají zobrazovat na webu.\n </Text>\n <Text fontSize=\"xs\" color={useColorModeValue('blue.600', 'blue.300')}>\n Příklad: \"I. A třída skupina B - muži\" → \"I.A třída\"\n </Text>\n </Box>\n\n <Alert status=\"info\" borderRadius=\"lg\">\n <AlertIcon />\n <Box>\n <AlertTitle fontSize=\"sm\">\n <HStack spacing={2} display=\"inline-flex\">\n <Icon as={FaSyncAlt} boxSize={3} />\n <Text as=\"span\">Aktualizace dat</Text>\n </HStack>\n </AlertTitle>\n <AlertDescription fontSize=\"sm\">\n Data se automaticky aktualizují pravidelně. Pokud potřebujete aktualizovat hned, \n použijte tlačítko v sekci{' '}\n <Link href=\"/admin/prefetch\" color=\"blue.600\" fontWeight=\"bold\">Prefetch</Link>.\n </AlertDescription>\n </Box>\n </Alert>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* HRÁČI A TÝMY Section */}\n <Box>\n <SectionHeader id=\"hraci-tymy\" icon={FaUsers} title=\"Hráči a týmy\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Udržujte seznam týmů a hráčů aktuální, aby fanoušci i trenéři měli okamžitý\n přehled o soupisce.\n </Text>\n <List spacing={2} styleType=\"disc\" pl={5}>\n <ListItem>\n V sekci{' '}\n <Link href=\"/admin/tymy\" color=\"blue.600\">Týmy</Link> spravujete základní údaje a\n fotografie.\n </ListItem>\n <ListItem>\n Hráče přiřazujte k týmům, doplňte čísla dresů, pozice a profilové obrázky.\n </ListItem>\n <ListItem>\n V případě chybně načtených log či názvů využijte{' '}\n <Link href=\"/admin/aliasy-soutezi\" color=\"blue.600\">aliasy soutěží</Link> nebo manuální\n úpravy týmů.\n </ListItem>\n </List>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* MÉDIA Section */}\n <Box>\n <SectionHeader id=\"media\" icon={FaPhotoVideo} title=\"Média a soubory\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Sekce Média je vaše <strong>centrální úložiště pro všechny obrázky, loga a soubory</strong>. \n Vše, co nahrajete zde, můžete pak použít v článcích, bannerech, newsletterech nebo na stránce O klubu.\n </Text>\n\n <Link href=\"/admin/soubory\" isExternal>\n <HStack\n p={3}\n bg={useColorModeValue('blue.50', 'blue.900')}\n borderRadius=\"lg\"\n _hover={{ bg: useColorModeValue('blue.100', 'blue.800') }}\n transition=\"all 0.2s\"\n >\n <Icon as={FaPhotoVideo} color=\"blue.600\" boxSize={5} />\n <Text fontWeight=\"bold\" color=\"blue.700\">\n → Otevřít Média\n </Text>\n </HStack>\n </Link>\n\n <HStack mt={2} spacing={2}>\n <Icon as={FaPhotoVideo} color={useColorModeValue('blue.600', 'blue.300')} boxSize={4} />\n <Heading size=\"sm\">Jak nahrát obrázek nebo soubor?</Heading>\n </HStack>\n <OrderedList spacing={2} pl={5}>\n <ListItem>\n Otevřete sekci{' '}\n <Link href=\"/admin/soubory\" color=\"blue.600\" fontWeight=\"bold\">Média</Link>\n </ListItem>\n <ListItem>\n Klikněte na tlačítko <strong>\"Nahrát soubor\"</strong> nebo <strong>\"Upload\"</strong>\n </ListItem>\n <ListItem>\n Vyberte obrázek ze svého počítače (doporučené formáty: JPG, PNG, max 5 MB)\n </ListItem>\n <ListItem>\n Po nahrání se zobrazí <strong>adresa souboru</strong> (URL) — např. <Code>/uploads/2025/01/foto.jpg</Code>\n </ListItem>\n <ListItem>\n <strong>Zkopírujte tuto adresu</strong> a použijte ji tam, kde potřebujete (články, nastavení loga atd.)\n </ListItem>\n </OrderedList>\n\n <Box\n p={4}\n bg={useColorModeValue('blue.50', 'blue.900')}\n borderRadius=\"lg\"\n borderLeftWidth=\"4px\"\n borderLeftColor=\"blue.500\"\n >\n <HStack spacing={2} mb={2}>\n <Icon as={FaLightbulb} color=\"blue.600\" />\n <Text fontWeight=\"semibold\" color={useColorModeValue('blue.800', 'blue.200')}>\n Tipy pro práci s obrázky\n </Text>\n </HStack>\n <List spacing={1} styleType=\"disc\" pl={5} fontSize=\"sm\" color={useColorModeValue('blue.700', 'blue.200')}>\n <ListItem>\n <strong>Optimalizujte velikost:</strong> Ideální šířka 1200-2000 px, velikost souboru max 1 MB\n </ListItem>\n <ListItem>\n <strong>Používejte popisné názvy:</strong> např. \"zapas-sokol-2025-01.jpg\" místo \"IMG_1234.jpg\"\n </ListItem>\n <ListItem>\n <strong>Formáty:</strong> JPG pro fotky, PNG pro loga s průhledností\n </ListItem>\n <ListItem>\n <strong>Záloha:</strong> Důležité fotky si uchovávejte i lokálně na počítači\n </ListItem>\n </List>\n </Box>\n\n <Alert status=\"warning\" borderRadius=\"lg\">\n <AlertIcon />\n <Box>\n <AlertTitle fontSize=\"sm\">\n <HStack spacing={2} display=\"inline-flex\">\n <Icon as={FaExclamationTriangle} boxSize={3} />\n <Text as=\"span\">Pozor při mazání souborů!</Text>\n </HStack>\n </AlertTitle>\n <AlertDescription fontSize=\"sm\">\n Než smažete obrázek, ověřte, že ho nepoužíváte v článcích, bannerech nebo jinde na webu. \n Po smazání se místo obrázku zobrazí chybová hlášká (404).\n </AlertDescription>\n </Box>\n </Alert>\n\n <Alert status=\"info\" borderRadius=\"lg\">\n <AlertIcon />\n <Box>\n <AlertTitle fontSize=\"sm\">\n <HStack spacing={2} display=\"inline-flex\">\n <Icon as={FaFolderOpen} boxSize={3} />\n <Text as=\"span\">Správa souborů</Text>\n </HStack>\n </AlertTitle>\n <AlertDescription fontSize=\"sm\">\n Pro pokročilou správu všech nahraných souborů použijte sekci{' '}\n <Link href=\"/admin/files\" color=\"blue.600\" fontWeight=\"bold\">Soubory</Link>, \n kde vidíte celkový přehled, velikosti a můžete je filtrovat.\n </AlertDescription>\n </Box>\n </Alert>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* GALLERY Section */}\n <Box>\n <SectionHeader id=\"gallery\" icon={FaImage} title=\"Galerie\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n V sekci Galerie spravujete fotografie z akcí, zápasů a dalších klubových událostí. \n Můžete využít propojení se službou Zonerama nebo nahrávat fotky přímo.\n </Text>\n\n <Link href=\"/admin/gallery\" isExternal>\n <HStack\n p={3}\n bg={useColorModeValue('blue.50', 'blue.900')}\n borderRadius=\"lg\"\n _hover={{ bg: useColorModeValue('blue.100', 'blue.800') }}\n transition=\"all 0.2s\"\n >\n <Icon as={FaImage} color=\"blue.600\" boxSize={5} />\n <Text fontWeight=\"bold\" color=\"blue.700\">\n → Otevřít Galerii\n </Text>\n </HStack>\n </Link>\n\n <HStack mt={2} spacing={2}>\n <Icon as={FaImage} color={useColorModeValue('blue.600', 'blue.300')} boxSize={4} />\n <Heading size=\"sm\">Jak přidat fotogalerii?</Heading>\n </HStack>\n <OrderedList spacing={2} pl={5}>\n <ListItem>\n Otevřete sekci{' '}\n <Link href=\"/admin/gallery\" color=\"blue.600\" fontWeight=\"bold\">Galerie</Link>\n </ListItem>\n <ListItem>Klikněte na „Přidat album\" nebo „Vytvořit galerii\"</ListItem>\n <ListItem>\n <strong>Vyplňte název alba</strong> — např. \"Zápas proti Spartaku 15.10.2025\"\n </ListItem>\n <ListItem>\n <strong>Přidejte popis</strong> — krátký text, co fotky zobrazují\n </ListItem>\n <ListItem>\n <strong>Nahrajte náhledový obrázek</strong> — reprezentativní foto, které se zobrazí jako náhled\n </ListItem>\n <ListItem>\n <strong>Propojte se Zoneramou</strong> (volitelné) — Pokud máte fotky na Zonerama.cz, vložte odkaz na album\n </ListItem>\n <ListItem>Uložte album — zobrazí se fanouškům na webu! <Icon as={FaCheckCircle} boxSize={3} display=\"inline\" color=\"green.500\" /></ListItem>\n </OrderedList>\n\n <Box\n p={4}\n bg={useColorModeValue('purple.50', 'purple.900')}\n borderRadius=\"lg\"\n borderLeftWidth=\"4px\"\n borderLeftColor=\"purple.500\"\n >\n <HStack spacing={2} mb={2}>\n <Icon as={FaInfoCircle} color=\"purple.600\" />\n <Text fontWeight=\"semibold\" color={useColorModeValue('purple.800', 'purple.200')}>\n Co je Zonerama?\n </Text>\n </HStack>\n <Text fontSize=\"sm\" color={useColorModeValue('purple.700', 'purple.200')}>\n Zonerama je český fotoserver, kde můžete zdarma ukládat fotky. Pokud tam už máte {t('homepage.gallery').toLowerCase()}, \n můžete je propojit s vaším webem a nemusíte je nahrávat znovu! Stačí vložit odkaz.\n </Text>\n </Box>\n\n <Alert status=\"info\" borderRadius=\"lg\">\n <AlertIcon />\n <Box>\n <AlertTitle fontSize=\"sm\">\n <HStack spacing={2} display=\"inline-flex\">\n <Icon as={FaLightbulb} boxSize={3} />\n <Text as=\"span\">Tip pro organizaci</Text>\n </HStack>\n </AlertTitle>\n <AlertDescription fontSize=\"sm\">\n Vytvářejte alba systematicky: \"Sezóna 2024/25 - Domácí zápasy\", \"Letní soustředění 2025\" atd. \n Fanouškům se pak lépe hledají konkrétní fotky!\n </AlertDescription>\n </Box>\n </Alert>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* FILES Section */}\n <Box>\n <SectionHeader id=\"files\" icon={FaFolderOpen} title=\"Správa souborů\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Sekce <Link href=\"/admin/files\" color=\"blue.600\">Soubory</Link> nabízí přehled všech nahraných položek včetně velikosti\n a data nahrání.\n </Text>\n <OrderedList spacing={2} pl={5}>\n <ListItem>Filtrujte podle typu souboru nebo názvu snadno najdete starší materiály.</ListItem>\n <ListItem>Stáhněte soubor přímo z administrace pro lokální zálohu.</ListItem>\n <ListItem>Při hromadném úklidu postupujte opatrně a držte se doporučení v `FILES_MANAGEMENT_SYSTEM.md`.</ListItem>\n </OrderedList>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* SPONZOŘI Section */}\n <Box>\n <SectionHeader id=\"sponzori-bannery\" icon={FaHandshake} title=\"Sponzoři a bannery\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Zobrazujte partnery klubu a spravujte reklamní plochy na webu i v newsletterech.\n </Text>\n <List spacing={2} styleType=\"disc\" pl={5}>\n <ListItem>\n V sekci{' '}\n <Link href=\"/admin/sponzori\" color=\"blue.600\">Sponzoři</Link> přidejte logo, odkaz a\n pořadí zobrazení.\n </ListItem>\n <ListItem>\n Bannery vkládejte přes{' '}\n <Link href=\"/admin/bannery\" color=\"blue.600\">Bannery</Link>; nastavte cílovou URL a\n období platnosti.\n </ListItem>\n <ListItem>\n Statistiky prokliku sledujte v sekci{' '}\n <Link href=\"/admin/analytics\" color=\"blue.600\">Analytics</Link>.\n </ListItem>\n </List>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* NEWSLETTER Section */}\n <Box>\n <SectionHeader id=\"newsletter\" icon={FaEnvelope} title=\"Newsletter a e-maily\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Newsletter vám umožňuje posílat hromadné e-maily všem fanouškům, kteří se k odběru přihlásili. \n Ideální pro oznámení o zápasech, akcích nebo důležité informace o klubu.\n </Text>\n\n <Link href=\"/admin/newsletter\" isExternal>\n <HStack\n p={3}\n bg={useColorModeValue('blue.50', 'blue.900')}\n borderRadius=\"lg\"\n _hover={{ bg: useColorModeValue('blue.100', 'blue.800') }}\n transition=\"all 0.2s\"\n >\n <Icon as={FaEnvelope} color=\"blue.600\" boxSize={5} />\n <Text fontWeight=\"bold\" color=\"blue.700\">\n → Otevřít Newsletter\n </Text>\n </HStack>\n </Link>\n\n <Alert status=\"warning\" borderRadius=\"lg\">\n <AlertIcon />\n <Box>\n <AlertTitle fontSize=\"sm\">\n <HStack spacing={2} display=\"inline-flex\">\n <Icon as={FaExclamationTriangle} boxSize={3} />\n <Text as=\"span\">Před odesláním newsletteru</Text>\n </HStack>\n </AlertTitle>\n <AlertDescription fontSize=\"sm\">\n <strong>Vždy nejprve otestujte e-mail na své adrese!</strong> Zkontrolujte, že vše vypadá dobře, \n že nejsou překlepy a že obrázky se zobrazují správně. Až pak odešlete všem.\n </AlertDescription>\n </Box>\n </Alert>\n\n <HStack spacing={2}>\n <Icon as={FaEnvelope} color={useColorModeValue('blue.600', 'blue.300')} boxSize={4} />\n <Heading size=\"sm\">Postup: Jak odeslat newsletter?</Heading>\n </HStack>\n <OrderedList spacing={2} pl={5}>\n <ListItem>\n <strong>Zkontrolujte SMTP nastavení</strong> — Musí být správně vyplněné v{' '}\n <Link href=\"/admin/nastaveni\" color=\"blue.600\" fontWeight=\"bold\">Nastavení</Link>. \n Bez něj e-maily nepůjdou odeslat!\n </ListItem>\n <ListItem>\n Otevřete{' '}\n <Link href=\"/admin/newsletter\" color=\"blue.600\" fontWeight=\"bold\">\n Newsletter\n </Link>\n </ListItem>\n <ListItem>\n <strong>Vyplňte předmět e-mailu</strong> — např. \"Pozvánka na zápas s Technikou Brno\"\n </ListItem>\n <ListItem>\n <strong>Napište obsah</strong> — Můžete použít normální text nebo HTML formátování pro hezčí vzhled\n </ListItem>\n <ListItem>\n <strong>DŮLEŽITÉ: Pošlete testovací e-mail</strong> — Klikněte na „Odeslat test\" a zadejte svou e-mailovou adresu. \n Zkontrolujte, jak e-mail vypadá\n </ListItem>\n <ListItem>\n Pokud vše vypadá dobře, klikněte na <strong>„Odeslat všem\"</strong> — e-mail se rozešle všem přihlášeným\n </ListItem>\n </OrderedList>\n\n <Box\n p={4}\n bg={useColorModeValue('blue.50', 'blue.900')}\n borderRadius=\"lg\"\n borderLeftWidth=\"4px\"\n borderLeftColor=\"blue.500\"\n >\n <HStack spacing={2} mb={2}>\n <Icon as={FaLightbulb} color=\"blue.600\" />\n <Text fontWeight=\"semibold\" color={useColorModeValue('blue.800', 'blue.200')}>\n Tipy pro úspěšný newsletter\n </Text>\n </HStack>\n <List spacing={1} styleType=\"disc\" pl={5} fontSize=\"sm\" color={useColorModeValue('blue.700', 'blue.200')}>\n <ListItem>Pište stručně a jasně — čtenáři mají málo času</ListItem>\n <ListItem>Používejte poutavý předmět — zvýší to šanci, že e-mail otevřou</ListItem>\n <ListItem>Přidávejte odkazy na web pro více informací</ListItem>\n <ListItem>Neposílejte newslettery příliš často (doporučeno: max 1-2x týdně)</ListItem>\n </List>\n </Box>\n\n <Box\n p={4}\n bg={useColorModeValue('orange.50', 'orange.900')}\n borderRadius=\"lg\"\n borderLeftWidth=\"4px\"\n borderLeftColor=\"orange.500\"\n >\n <HStack spacing={2} mb={2}>\n <Icon as={FaExclamationTriangle} color=\"orange.600\" />\n <Text fontWeight=\"semibold\" color={useColorModeValue('orange.800', 'orange.200')}>\n Problém s odesíláním?\n </Text>\n </HStack>\n <Text fontSize=\"sm\" color={useColorModeValue('orange.700', 'orange.200')}>\n Pokud e-maily nejdou odeslat nebo padají do spamu, napište nám na{' '}\n <Link href=\"mailto:help@tdvorak.dev\" color=\"orange.600\" fontWeight=\"bold\">\n help@tdvorak.dev\n </Link>\n {' '}a pomůžeme vám nastavit SMTP a další pokročilé věci (SPF, DKIM záznamy).\n </Text>\n </Box>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* ALIASY Section */}\n <Box>\n <SectionHeader id=\"aliasy\" icon={FaAward} title=\"Alias soutěží\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Alias správa slouží pro přejmenování soutěží importovaných z FAČR tak, aby byly na\n webu srozumitelné a jednotné.\n </Text>\n <OrderedList spacing={2} pl={5}>\n <ListItem>\n Otevřete{' '}\n <Link href=\"/admin/aliasy-soutezi\" color=\"blue.600\">Alias soutěží</Link>.\n </ListItem>\n <ListItem>\n Využijte automatický import ze souborů cache (tlačítko „Importovat ze soutěží\").\n </ListItem>\n <ListItem>\n Upravte aliasy ručně nebo přetáhněte pořadí pro prioritní soutěže.\n </ListItem>\n </OrderedList>\n <Alert status=\"info\" borderRadius=\"lg\">\n <AlertIcon />\n <Text fontSize=\"sm\">\n Každá změna se propíše na front-end během několika sekund po uložení.\n </Text>\n </Alert>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* PREFETCH Section */}\n <Box>\n <SectionHeader id=\"prefetch\" icon={FaSyncAlt} title=\"Prefetch a cache\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Prefetch vytváří lokální cache dat (zápasy, videa, články) a výrazně zrychluje\n načítání webu.\n </Text>\n <OrderedList spacing={2} pl={5}>\n <ListItem>\n V sekci{' '}\n <Link href=\"/admin/prefetch\" color=\"blue.600\">Prefetch</Link> zkontrolujte poslední běh\n a stav jednotlivých modulů.\n </ListItem>\n <ListItem>\n Spusťte ručně po větších obsahových změnách nebo při neaktuálních datech.\n </ListItem>\n <ListItem>\n Sledujte upozornění na chybějící tokeny či API klíče (např. YouTube). Bez nich se data\n neobnoví.\n </ListItem>\n </OrderedList>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* VIDEA Section */}\n <Box>\n <SectionHeader id=\"videa\" icon={FaVideo} title=\"Videa\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Integrace s YouTube a dalšími platformami umožňuje vkládat playlisty i jednotlivá\n videa.\n </Text>\n <List spacing={2} styleType=\"disc\" pl={5}>\n <ListItem>\n Přidávejte videa v sekci{' '}\n <Link href=\"/admin/videa\" color=\"blue.600\">Videa</Link> pomocí URL nebo ID videa.\n </ListItem>\n <ListItem>\n Aktivujte automatický import playlistu přes{' '}\n <Link href=\"/admin/prefetch\" color=\"blue.600\">Prefetch</Link>.\n </ListItem>\n <ListItem>\n Náhledy se ukládají do cache; při problémech spusťte znovu Prefetch modul Videa.\n </ListItem>\n </List>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* AKTIVITY Section */}\n <Box>\n <SectionHeader id=\"aktivity\" icon={FaCalendarAlt} title=\"Aktivity\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Klubové akce, tréninky a mimo-soutěžní události můžete prezentovat v kalendáři i na\n úvodní stránce.\n </Text>\n <OrderedList spacing={2} pl={5}>\n <ListItem>\n V sekci{' '}\n <Link href=\"/admin/aktivity\" color=\"blue.600\">Aktivity</Link> nastavte datum, místo a\n krátký popis.\n </ListItem>\n <ListItem>\n Přidejte obrázek nebo ikonu pro lepší vizuální zobrazení.\n </ListItem>\n <ListItem>\n Aktivitu označte jako veřejnou, chcete-li ji zobrazit na webu.\n </ListItem>\n </OrderedList>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* MERCH Section */}\n <Box>\n <SectionHeader id=\"merch\" icon={FaPalette} title=\"Oblečení\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Spravujte položky klubového merche a informujte fanoušky o dostupnosti zboží.\n </Text>\n <List spacing={2} styleType=\"disc\" pl={5}>\n <ListItem>\n Přidejte položky v{' '}\n <Link href=\"/admin/merch\" color=\"blue.600\">Oblečení</Link> s popisem, cenou a fotkou.\n </ListItem>\n <ListItem>\n Využijte štítky pro kategorizaci (např. \"dresy\", \"fan shop\").\n </ListItem>\n <ListItem>\n Sledujte zájem fanoušků přes kontaktní formulář nebo dedikovaný e-shop.\n </ListItem>\n </List>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* ZPRÁVY Section */}\n <Box>\n <SectionHeader id=\"zpravy\" icon={FaCommentAlt} title=\"Zprávy\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Zprávy zahrnují kontaktní formuláře, přihlášky a další komunikaci směrem ke klubu.\n </Text>\n <List spacing={2} styleType=\"disc\" pl={5}>\n <ListItem>\n V{' '}\n <Link href=\"/admin/zpravy\" color=\"blue.600\">Zprávách</Link> vidíte přijaté zprávy a jejich\n stav.\n </ListItem>\n <ListItem>\n Odpovídejte z vlastní e-mailové schránky; systém uchovává historii pouze informativně.\n </ListItem>\n <ListItem>\n Označte vyřízené zprávy pro přehlednost týmu.\n </ListItem>\n </List>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* CONTACTS Section */}\n <Box>\n <SectionHeader id=\"contacts\" icon={FaAddressBook} title=\"Kontakty a formuláře\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n V sekci{' '}\n <Link href=\"/admin/kontakty\" color=\"blue.600\">Kontakty</Link> spravujete kontaktní údaje klubu a odpovědné osoby pro\n jednotlivé typy dotazů.\n </Text>\n <OrderedList spacing={2} pl={5}>\n <ListItem>Zadejte telefon, e-mail a roli pro každého kontaktního pracovníka.</ListItem>\n <ListItem>\n U formulářů lze nastavit cílovou e-mailovou adresu a potvrzovací zprávu.\n </ListItem>\n <ListItem>\n Zkontrolujte oddíl <Link href=\"/admin/zpravy\" color=\"blue.600\">Zprávy</Link>, zda se odesílané formuláře ukládají správně.\n </ListItem>\n </OrderedList>\n <Alert status=\"info\" borderRadius=\"lg\">\n <AlertIcon />\n <Text fontSize=\"sm\">\n Kontaktní údaje se propisují do patičky webu i do automatických e-mailů.\n </Text>\n </Alert>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* ANALYTICS Section */}\n <Box>\n <SectionHeader id=\"analytics\" icon={FaChartLine} title=\"Analytics a reporty\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Sekce{' '}\n <Link href=\"/admin/analytika\" color=\"blue.600\">Analytics</Link> kombinuje statistiky z Umami a interních metrik systému.\n Sledujte návštěvnost, interakce a výkon jednotlivých stránek.\n </Text>\n <List spacing={2} styleType=\"disc\" pl={5}>\n <ListItem>Přehled návštěv podle časového období a zdrojů.</ListItem>\n <ListItem>Top články, nejčtenější kategorie a popularita videí.</ListItem>\n <ListItem>Informace o přihláškách k newsletteru a konverzích formulářů.</ListItem>\n </List>\n <Box\n p={4}\n bg={useColorModeValue('green.50', 'green.900')}\n borderRadius=\"lg\"\n borderLeftWidth=\"4px\"\n borderLeftColor=\"green.500\"\n >\n <Text fontSize=\"sm\" color={useColorModeValue('green.700', 'green.200')}>\n Podrobný postup integrace najdete v souboru `UMAMI_SETUP_WITH_CLUB_NAME.md`. Doporučujeme\n nastavit i `UMAMI_ADMIN_EXCLUSION.md`, aby se nezapočítávaly administrátorské návštěvy.\n </Text>\n </Box>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* SCOREBOARD Section */}\n <Box>\n <SectionHeader id=\"scoreboard\" icon={FaChalkboard} title=\"Tabule (Scoreboard)\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Scoreboard v{' '}\n <Link href=\"/admin/scoreboard\" color=\"blue.600\">Tabuli</Link> používá data ze zápasů a umožňuje připravit grafiku na\n klubové obrazovky.\n </Text>\n <OrderedList spacing={2} pl={5}>\n <ListItem>Vyberte soutěž a konkrétní zápas pro zobrazení.</ListItem>\n <ListItem>Nastavte barevné téma v souladu s brandingem klubu.</ListItem>\n <ListItem>Exportujte URL pro sdílení na velkoplošných displejích.</ListItem>\n </OrderedList>\n <Alert status=\"warning\" borderRadius=\"lg\">\n <AlertIcon />\n <Text fontSize=\"sm\">\n Scoreboard vyžaduje aktuální data z FAČR. Pokud se zápas nezobrazuje, ověřte nastavení v\n sekci <Link href=\"/admin/aliasy-soutezi\" color=\"blue.600\">Alias soutěží</Link> a spusťte Prefetch.\n </Text>\n </Alert>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* MOBILE SCOREBOARD Section */}\n <Box>\n <SectionHeader id=\"mobile-scoreboard\" icon={FaMobileAlt} title=\"Mobilní scoreboard\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Pro ovládání tabule na dálku použijte{' '}\n <Link href=\"/admin/scoreboard/remote\" color=\"blue.600\">Mobilní scoreboard</Link>. Umožňuje aktualizovat skóre v průběhu\n utkání přímo z telefonu.\n </Text>\n <List spacing={2} styleType=\"disc\" pl={5}>\n <ListItem>Přihlaste se stejným účtem jako v administraci.</ListItem>\n <ListItem>Vyberte zápas, který sledujete, a nastavte skóre i čas.</ListItem>\n <ListItem>\n Ověřte internetové připojení změny se synchronizují okamžitě na veřejné tabuli.\n </ListItem>\n </List>\n <Alert status=\"success\" borderRadius=\"lg\">\n <AlertIcon />\n <Text fontSize=\"sm\">\n Funkce je optimalizovaná pro PWA. Přidejte si ji na domovskou obrazovku pro rychlý přístup.\n </Text>\n </Alert>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* UŽIVATELÉ Section */}\n <Box>\n <SectionHeader id=\"uzivatele\" icon={FaKey} title=\"Uživatelé a přístupy\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Spravujte přístupy administrátorů i redaktorů, nastavujte role a resetujte hesla.\n </Text>\n <OrderedList spacing={2} pl={5}>\n <ListItem>\n V{' '}\n <Link href=\"/admin/uzivatele\" color=\"blue.600\">Uživatelích</Link> přidejte nové účty a\n přidělte roli <Code>admin</Code> nebo <Code>user</Code>.\n </ListItem>\n <ListItem>\n Pro reset hesla využijte nástroj{' '}\n <Link href=\"/admin/users/send-reset\" color=\"blue.600\">Odeslat reset</Link>.\n </ListItem>\n <ListItem>\n Doporučujeme zapnout dvoufaktorové ověření na e-mailových účtech administrátorů.\n </ListItem>\n </OrderedList>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* DOCS Section */}\n <Box>\n <SectionHeader id=\"docs\" icon={FaInfoCircle} title=\"Interní dokumentace\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n V repozitáři najdete rozsáhlé manuály k jednotlivým oblastem. Doporučujeme projít alespoň tyto:\n </Text>\n <List spacing={2} styleType=\"disc\" pl={5}>\n <ListItem>\n <Code>FRONTEND_FUNCTIONALITY_REPORT.md</Code> podrobný popis veřejného webu.\n </ListItem>\n <ListItem>\n <Code>BACKEND_FUNCTIONALITY_REPORT.md</Code> vysvětlení API a datových toků.\n </ListItem>\n <ListItem>\n <Code>NEWSLETTER_SYSTEM.md</Code> a <Code>FILES_MANAGEMENT_SYSTEM.md</Code> detailní pracovní postupy.\n </ListItem>\n </List>\n <Alert status=\"info\" borderRadius=\"lg\">\n <AlertIcon />\n <Text fontSize=\"sm\">\n Kompletní seznam manuálů najdete v adresáři `docs/` (kořen projektu). Dokumenty jsou průběžně\n aktualizované sledujte datum poslední revize.\n </Text>\n </Alert>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* CHECKLIST Section */}\n <Box>\n <SectionHeader id=\"checklist\" icon={FaListOl} title=\"Checklisty a postupy\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Pro rychlé spuštění nových funkcí využijte připravené checklisty. Najdete je v kořenovém adresáři\n projektu a v administraci slouží jako doplněk k této dokumentaci.\n </Text>\n <OrderedList spacing={2} pl={5}>\n <ListItem>\n <Code>NEWSLETTER_FEATURE_CHECKLIST.md</Code> krok za krokem konfigurace newsletteru.\n </ListItem>\n <ListItem>\n <Code>FILES_MANAGEMENT_TESTING.md</Code> co ověřit, než nasadíte novou sadu souborů.\n </ListItem>\n <ListItem>\n <Code>MAP_IMPORT_COMPLETE_IMPLEMENTATION.md</Code> a související checklisty pro import mapových dat.\n </ListItem>\n </OrderedList>\n <Alert status=\"success\" borderRadius=\"lg\">\n <AlertIcon />\n <Text fontSize=\"sm\">\n Checklisty si můžete stáhnout jako PDF a sdílet v rámci klubu usnadníte tak zaškolení nových\n členů týmu.\n </Text>\n </Alert>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* SEO Section */}\n <Box>\n <SectionHeader id=\"seo\" icon={FaSearch} title=\"SEO a Analytics\" />\n <VStack align=\"stretch\" spacing={4} mb={6}>\n <Text>\n Správné SEO nastavení a analytika vám pomůžou sledovat návštěvnost webu a\n optimalizovat obsah.\n </Text>\n <List spacing={2} styleType=\"disc\" pl={5}>\n <ListItem>\n U každého článku vyplňte <strong>SEO titulek</strong>, <strong>SEO popis</strong> a slug\n bez diakritiky.\n </ListItem>\n <ListItem>\n Integrujte službu{' '}\n <Link href=\"/admin/analytics\" color=\"blue.600\">Umami Analytics</Link> dle průvodce v\n souboru `UMAMI_SETUP_WITH_CLUB_NAME.md`.\n </ListItem>\n <ListItem>\n Pro sociální sítě doplňte Open Graph a Twitter metatagy v nastavení.\n </ListItem>\n </List>\n <Alert status=\"success\" borderRadius=\"lg\">\n <AlertIcon />\n <Text fontSize=\"sm\">\n Auditujte SEO pravidelně — jednoduché úpravy nadpisů a popisů výrazně zlepší dosah.\n </Text>\n </Alert>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* TROUBLESHOOTING Section */}\n <Box>\n <SectionHeader id=\"troubleshooting\" icon={FaBug} title=\"Řešení problémů\" />\n <VStack align=\"stretch\" spacing={6} mb={6}>\n <Accordion allowMultiple>\n <AccordionItem borderColor={borderColor}>\n <h3>\n <AccordionButton>\n <HStack flex=\"1\" textAlign=\"left\" fontWeight=\"semibold\">\n <Icon as={FaExclamationTriangle} boxSize={4} />\n <Text>E-maily se neodesílají</Text>\n </HStack>\n <AccordionIcon />\n </AccordionButton>\n </h3>\n <AccordionPanel pb={4}>\n <OrderedList spacing={2} pl={5}>\n <ListItem>\n Zkontrolujte SMTP nastavení v{' '}\n <Link href=\"/admin/nastaveni\" color=\"blue.600\">\n Nastavení\n </Link>\n </ListItem>\n <ListItem>\n Ověřte port: 465 = SSL, 587 = STARTTLS\n </ListItem>\n <ListItem>\n Gmail vyžaduje „App Password\", ne běžné heslo\n </ListItem>\n <ListItem>\n Zkuste odeslat testovací e-mail z Newsletteru\n </ListItem>\n <ListItem>\n Zkontrolujte serverové logy pro chybové hlášky\n </ListItem>\n </OrderedList>\n </AccordionPanel>\n </AccordionItem>\n\n <AccordionItem borderColor={borderColor}>\n <h3>\n <AccordionButton>\n <HStack flex=\"1\" textAlign=\"left\" fontWeight=\"semibold\">\n <Icon as={FaImage} boxSize={4} />\n <Text>Obrázky se nezobrazují</Text>\n </HStack>\n <AccordionIcon />\n </AccordionButton>\n </h3>\n <AccordionPanel pb={4}>\n <List spacing={2} styleType=\"disc\" pl={5}>\n <ListItem>\n Nahrajte obrázek do{' '}\n <Link href=\"/admin/soubory\" color=\"blue.600\">\n Média\n </Link>\n </ListItem>\n <ListItem>\n Použijte relativní cestu: <Code>/uploads/2025/01/obrazek.jpg</Code>\n </ListItem>\n <ListItem>\n Pro externí zdroje použijte proxy: <Code>/api/v1/proxy/image?url=...</Code>\n </ListItem>\n <ListItem>\n Zkontrolujte, že soubor existuje a je veřejně přístupný\n </ListItem>\n </List>\n </AccordionPanel>\n </AccordionItem>\n\n <AccordionItem borderColor={borderColor}>\n <h3>\n <AccordionButton>\n <HStack flex=\"1\" textAlign=\"left\" fontWeight=\"semibold\">\n <Icon as={FaFutbol} boxSize={4} />\n <Text>FAČR data nejsou aktuální</Text>\n </HStack>\n <AccordionIcon />\n </AccordionButton>\n </h3>\n <AccordionPanel pb={4}>\n <OrderedList spacing={2} pl={5}>\n <ListItem>\n Spusťte{' '}\n <Link href=\"/admin/prefetch\" color=\"blue.600\">\n Prefetch\n </Link>{' '}\n ručně\n </ListItem>\n <ListItem>Zkontrolujte Club ID a Club Type v Nastavení</ListItem>\n <ListItem>\n Ověřte čas posledního běhu v Prefetch statusu\n </ListItem>\n <ListItem>\n Zkontrolujte internetové připojení serveru\n </ListItem>\n </OrderedList>\n </AccordionPanel>\n </AccordionItem>\n\n <AccordionItem borderColor={borderColor}>\n <h3>\n <AccordionButton>\n <HStack flex=\"1\" textAlign=\"left\" fontWeight=\"semibold\">\n <Icon as={FaKey} boxSize={4} />\n <Text>Nelze se přihlásit</Text>\n </HStack>\n <AccordionIcon />\n </AccordionButton>\n </h3>\n <AccordionPanel pb={4}>\n <List spacing={2} styleType=\"disc\" pl={5}>\n <ListItem>\n Ověřte e-mail a heslo (hesla jsou case-sensitive)\n </ListItem>\n <ListItem>\n Použijte „Zapomenuté heslo\" pro reset\n </ListItem>\n <ListItem>\n Zkontrolujte, že účet má roli <Code>admin</Code>\n </ListItem>\n <ListItem>\n Vyčkejte 5 minut po několika neúspěšných pokusech (ochrana proti brute-force)\n </ListItem>\n </List>\n </AccordionPanel>\n </AccordionItem>\n </Accordion>\n\n <Box\n p={5}\n bg={useColorModeValue('green.50', 'green.900')}\n borderRadius=\"lg\"\n borderWidth=\"2px\"\n borderColor={useColorModeValue('green.300', 'green.600')}\n >\n <HStack spacing={2} mb={3}>\n <Icon as={FaLifeRing} color=\"green.600\" boxSize={5} />\n <Text fontWeight=\"bold\" color={useColorModeValue('green.800', 'green.200')} fontSize=\"lg\">\n Potřebujete pomoc?\n </Text>\n </HStack>\n <Text fontSize=\"sm\" color={useColorModeValue('green.700', 'green.200')} mb={3}>\n Pokud problém přetrvává nebo si nevíte rady, zkuste nejprve tyto kroky:\n </Text>\n <List spacing={2} styleType=\"disc\" pl={5} fontSize=\"sm\" color={useColorModeValue('green.700', 'green.200')} mb={4}>\n <ListItem>Vymažte cache (mezipaměť) prohlížeče a obnovte stránku (Ctrl+F5)</ListItem>\n <ListItem>Zkuste jiný prohlížeč (Chrome, Firefox, Edge)</ListItem>\n <ListItem>Odhlaste se a přihlaste znovu</ListItem>\n <ListItem>Zkontrolujte internetové připojení</ListItem>\n </List>\n <Divider borderColor={useColorModeValue('green.300', 'green.600')} mb={3} />\n <HStack spacing={2} mb={2}>\n <Icon as={FaEnvelope} color={useColorModeValue('green.600', 'green.300')} boxSize={4} />\n <Text fontSize=\"md\" fontWeight=\"bold\" color={useColorModeValue('green.800', 'green.100')}>\n Stále nefunguje? Ozvěte se nám!\n </Text>\n </HStack>\n <Text fontSize=\"sm\" color={useColorModeValue('green.700', 'green.200')} mb={2}>\n Napište nám na{' '}\n <Link href=\"mailto:help@tdvorak.dev\" color=\"green.600\" fontWeight=\"bold\" fontSize=\"md\">\n help@tdvorak.dev\n </Link>\n {' '}a popište problém. Odpovídáme do 24 hodin a rádi vám pomůžeme!\n </Text>\n <Text fontSize=\"xs\" color={useColorModeValue('green.600', 'green.300')} fontStyle=\"italic\">\n Tip: Do e-mailu přiložte screenshot problému, urychlíte tím řešení.\n </Text>\n </Box>\n </VStack>\n <Link href=\"#top\" color=\"blue.600\" fontSize=\"sm\">\n <HStack as=\"span\" spacing={1}>\n <Icon as={FaArrowUp} boxSize={3} />\n <Text>Zpět na začátek</Text>\n </HStack>\n </Link>\n </Box>\n\n <Divider my={8} />\n\n {/* SUPPORT SECTION */}\n <Box\n p={6}\n bg={useColorModeValue('purple.50', 'purple.900')}\n borderRadius=\"xl\"\n borderWidth=\"2px\"\n borderColor={useColorModeValue('purple.200', 'purple.700')}\n textAlign=\"center\"\n mb={6}\n >\n <Icon as={FaEnvelope} boxSize={12} color=\"purple.500\" mb={3} />\n <Heading size=\"lg\" mb={3} color={useColorModeValue('purple.800', 'purple.200')}>\n Potřebujete pomoc?\n </Heading>\n <Text fontSize=\"md\" mb={4} color={useColorModeValue('purple.700', 'purple.300')}>\n Máte dotazy, narazili jste na problém nebo hledáte vlastní úpravy a rozšíření systému?\n </Text>\n <VStack spacing={3}>\n <Box>\n <HStack spacing={2} justify=\"center\" mb={2}>\n <Icon as={FaEnvelope} color=\"purple.600\" boxSize={5} />\n <Text fontWeight=\"bold\" fontSize=\"lg\" color={useColorModeValue('purple.900', 'purple.100')}>\n Technická podpora\n </Text>\n </HStack>\n <Link \n href=\"mailto:help@tdvorak.dev\" \n fontSize=\"xl\" \n color=\"purple.600\" \n fontWeight=\"bold\"\n _hover={{ color: 'purple.700', textDecoration: 'underline' }}\n >\n help@tdvorak.dev\n </Link>\n <Text fontSize=\"sm\" color={useColorModeValue('purple.600', 'purple.400')} mt={1}>\n Odpovídáme do 24 hodin\n </Text>\n </Box>\n <Divider borderColor={useColorModeValue('purple.300', 'purple.600')} />\n <Box>\n <HStack spacing={2} justify=\"center\" mb={2}>\n <Icon as={FaLightbulb} color=\"purple.600\" boxSize={4} />\n <Text fontWeight=\"bold\" fontSize=\"md\" color={useColorModeValue('purple.900', 'purple.100')}>\n Vlastní úpravy a implementace\n </Text>\n </HStack>\n <Text fontSize=\"sm\" color={useColorModeValue('purple.700', 'purple.300')}>\n Chcete přidat nové funkce nebo přizpůsobit systém vašim specifickým potřebám?<br />\n Kontaktujte nás a společně zjistíme, zda je vaše představa realizovatelná.<br />\n <strong>Rádi vám pomůžeme rozšířit systém dle vašich požadavků!</strong>\n </Text>\n </Box>\n </VStack>\n </Box>\n\n {/* FOOTER */}\n <Box textAlign=\"center\" py={6} color=\"gray.500\">\n <HStack spacing={2} justify=\"center\">\n <Icon as={FaBookOpen} color=\"gray.500\" boxSize={4} />\n <Text fontSize=\"sm\" fontWeight=\"medium\">\n Dokumentace administračního systému • Verze 1.0\n </Text>\n </HStack>\n <Text fontSize=\"xs\" mt={1}>\n Poslední aktualizace: {new Date().toLocaleDateString('cs-CZ')}\n </Text>\n <Text fontSize=\"xs\" mt={3} color=\"gray.400\">\n Vytvořeno pro snadnou správu klubových webů • Žádné technické znalosti nejsou nutné\n </Text>\n </Box>\n </Box>\n </Box>\n </Box>\n </Box>\n </AdminLayout>\n );\n};\n\nexport default AdminDocsPage;\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { sanitizeClubName } from '../../utils/url';\nimport { TeamLogo } from '../common/TeamLogo';\n\nexport interface StandingRow {\n position?: number;\n pos?: number;\n rank?: number;\n team?: any;\n team_id?: string | number;\n team_logo_url?: string;\n club?: string;\n points?: number | string;\n pts?: number | string;\n played?: number | string;\n matches?: number | string;\n wins?: number | string;\n win?: number | string;\n draws?: number | string;\n draw?: number | string;\n losses?: number | string;\n loss?: number | string;\n score?: string;\n}\n\n \nfunction deriveTeamIdFromLogoUrl(url?: string): string | undefined {\n try {\n const u = String(url || '');\n if (!u) return undefined;\n const m = u.match(/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}/);\n return m ? m[0].toLowerCase() : undefined;\n } catch {\n return undefined;\n }\n}\n\ntype TeamOverrides = { by_id?: Record<string, { name?: string; logo_url?: string }>; by_name?: Record<string, string> };\n\nconst StandingsCard: React.FC<{ rows: StandingRow[]; onRowClick?: (row: StandingRow, index: number) => void; variant?: 'logos' | 'plain' }>= ({ rows, onRowClick, variant = 'logos' }) => {\n const { t } = useTranslation();\n const safe = Array.isArray(rows) ? rows : [];\n const [sortKey, setSortKey] = useState<'rank' | 'team' | 'played' | 'wins' | 'draws' | 'losses' | 'score' | 'points' | null>(null);\n const [sortOrder, setSortOrder] = useState<'desc' | 'asc' | null>(null);\n const [overrides, setOverrides] = useState<TeamOverrides>({});\n const toNumber = (v: any): number => {\n if (typeof v === 'number') return v;\n const n = parseFloat(String(v ?? '').replace(/[^0-9\\-\\.]/g, ''));\n return isNaN(n) ? 0 : n;\n };\n const scoreDiff = (s: any): number => {\n const str = String(s ?? '').trim();\n const m = str.match(/(-?\\d+)\\s*[:\\-]\\s*(-?\\d+)/);\n if (m) return Number(m[1]) - Number(m[2]);\n return toNumber(str);\n };\n const normalize = (s: string) => String(s || '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[\\u2012\\u2013\\u2014\\u2015\\u2212]/g, '-')\n .replace(/[.,!;:()\\[\\]{}]/g, ' ')\n .replace(/[\\s,]*(z\\.?\\s*s\\.?|o\\.?\\s*s\\.?)\\s*$/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\n\n const byIdMap = useMemo(() => (overrides?.by_id || {}) as Record<string, { name?: string; logo_url?: string }>, [overrides]);\n const overridesNameIndex = useMemo(() => {\n const idx: Record<string, { id: string; name: string }> = {};\n try {\n for (const [id, v] of Object.entries(byIdMap)) {\n const nm = String((v as any)?.name || '').trim();\n if (!nm) continue;\n const key = normalize(nm);\n if (!key) continue;\n idx[key] = { id, name: nm };\n }\n } catch {}\n return idx;\n }, [byIdMap]);\n\n const pickName = (teamId?: string | number, original?: string, logoUrl?: string): string => {\n const id = String(teamId || '') || deriveTeamIdFromLogoUrl(logoUrl) || '';\n const v = id ? (byIdMap[id]?.name || '') : '';\n if (v && v.trim().length > 0) return v;\n if (original) {\n const n = normalize(original);\n let hit = overridesNameIndex[n];\n if (!hit) {\n for (const [k, val] of Object.entries(overridesNameIndex)) {\n if (!k) continue;\n if (n.endsWith(k) || k.endsWith(n)) { hit = val as any; break; }\n }\n }\n if (hit?.name) return hit.name;\n }\n return original || '';\n };\n\n useEffect(() => {\n let mounted = true;\n (async () => {\n const now = Date.now();\n let data: any = null;\n try {\n const res = await fetch(`/api/v1/public/team-logo-overrides?t=${now}`, { cache: 'no-cache' });\n if (res.ok) data = await res.json();\n } catch {}\n if (!data) {\n try {\n const res2 = await fetch('/cache/prefetch/team_logo_overrides.json', { cache: 'no-cache' });\n if (res2.ok) data = await res2.json();\n } catch {}\n }\n if (mounted) setOverrides(data || { by_id: {}, by_name: {} });\n })();\n return () => { mounted = false; };\n }, []);\n\n const getTeam = (r: any): string => sanitizeClubName(pickName(r?.team_id, r?.team?.name ?? r?.team ?? r?.club ?? '', r?.team_logo_url));\n const getRank = (r: any): number => toNumber(r?.rank ?? r?.pos ?? r?.position);\n const toggleSort = (key: 'rank' | 'team' | 'played' | 'wins' | 'draws' | 'losses' | 'score' | 'points') => {\n if (sortKey !== key) { setSortKey(key); setSortOrder('desc'); return; }\n if (sortOrder === 'desc') { setSortOrder('asc'); return; }\n setSortKey(null); setSortOrder(null);\n };\n const sorted = useMemo(() => {\n if (!sortKey || !sortOrder) return safe;\n const arr = [...safe];\n arr.sort((a: any, b: any) => {\n let va: any; let vb: any; let isText = false;\n switch (sortKey) {\n case 'team': va = getTeam(a); vb = getTeam(b); isText = true; break;\n case 'rank': va = getRank(a); vb = getRank(b); break;\n case 'played': va = toNumber(a?.played ?? a?.matches); vb = toNumber(b?.played ?? b?.matches); break;\n case 'wins': va = toNumber(a?.wins ?? a?.win); vb = toNumber(b?.wins ?? b?.win); break;\n case 'draws': va = toNumber(a?.draws ?? a?.draw); vb = toNumber(b?.draws ?? b?.draw); break;\n case 'losses': va = toNumber(a?.losses ?? a?.loss); vb = toNumber(b?.losses ?? b?.loss); break;\n case 'score': va = scoreDiff(a?.score); vb = scoreDiff(b?.score); break;\n case 'points': va = toNumber(a?.points ?? a?.pts); vb = toNumber(b?.points ?? b?.pts); break;\n default: va = 0; vb = 0;\n }\n let res = isText ? String(va).localeCompare(String(vb)) : (va as number) - (vb as number);\n if (sortOrder === 'desc') res = -res;\n if (res === 0) {\n const ra = getRank(a); const rb = getRank(b);\n res = ra - rb;\n }\n return res;\n });\n return arr;\n }, [safe, sortKey, sortOrder]);\n const arrow = (key: 'rank' | 'team' | 'played' | 'wins' | 'draws' | 'losses' | 'score' | 'points') => sortKey === key ? (sortOrder === 'desc' ? ' ▼' : ' ▲') : '';\n return (\n <div className=\"table-card\">\n <div className=\"standings-table-wrapper\" style={{ overflowX: 'auto' }}>\n <table className=\"standings-table-compact\" style={{ width: '100%', borderCollapse: 'separate', borderSpacing: '0 4px' }}>\n <thead>\n <tr style={{ fontSize: '0.75rem', color: 'var(--dark-gray)', textTransform: 'uppercase' }}>\n <th onClick={() => toggleSort('rank')} style={{ padding: '6px 8px', textAlign: 'left', fontWeight: 600, cursor: 'pointer', userSelect: 'none' }}># {arrow('rank')}</th>\n <th onClick={() => toggleSort('team')} style={{ padding: '6px 8px', textAlign: 'left', fontWeight: 600, cursor: 'pointer', userSelect: 'none' }}>{t('homepage.team')}{arrow('team')}</th>\n <th onClick={() => toggleSort('played')} style={{ padding: '6px 4px', textAlign: 'center', fontWeight: 600, cursor: 'pointer', userSelect: 'none' }}>{t('homepage.played')}{arrow('played')}</th>\n <th onClick={() => toggleSort('wins')} style={{ padding: '6px 4px', textAlign: 'center', fontWeight: 600, cursor: 'pointer', userSelect: 'none' }}>{t('homepage.won')}{arrow('wins')}</th>\n <th onClick={() => toggleSort('draws')} style={{ padding: '6px 4px', textAlign: 'center', fontWeight: 600, cursor: 'pointer', userSelect: 'none' }}>{t('homepage.drawn')}{arrow('draws')}</th>\n <th onClick={() => toggleSort('losses')} style={{ padding: '6px 4px', textAlign: 'center', fontWeight: 600, cursor: 'pointer', userSelect: 'none' }}>{t('homepage.lost')}{arrow('losses')}</th>\n <th onClick={() => toggleSort('score')} style={{ padding: '6px 4px', textAlign: 'center', fontWeight: 600, display: 'none', cursor: 'pointer', userSelect: 'none' }} className=\"hide-mobile\">{t('homepage.goals')}{arrow('score')}</th>\n <th onClick={() => toggleSort('points')} style={{ padding: '6px 8px', textAlign: 'center', fontWeight: 600, cursor: 'pointer', userSelect: 'none' }}>{t('homepage.points')}{arrow('points')}</th>\n </tr>\n </thead>\n <tbody>\n {sorted.slice(0, 8).map((row, idx) => {\n const teamNameRaw = (row as any).team?.name ?? (row as any).team ?? (row as any).club ?? '-';\n const teamName = sanitizeClubName(pickName((row as any).team_id, teamNameRaw, (row as any).team_logo_url));\n const tid = (row as any).team_id || deriveTeamIdFromLogoUrl((row as any).team_logo_url);\n return (\n <tr\n key={idx}\n onClick={() => onRowClick?.(row, idx)}\n style={{\n cursor: onRowClick ? 'pointer' : 'default',\n background: 'var(--card-bg)',\n border: '1px solid var(--card-border)',\n borderRadius: '8px',\n transition: 'all 0.2s ease',\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLTableRowElement).style.boxShadow = '0 4px 12px rgba(0,0,0,0.08)';\n (e.currentTarget as HTMLTableRowElement).style.borderColor = 'var(--primary)';\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLTableRowElement).style.boxShadow = 'none';\n (e.currentTarget as HTMLTableRowElement).style.borderColor = 'var(--card-border)';\n }}\n >\n <td style={{ padding: '10px 8px', fontWeight: 700, color: 'var(--secondary)' }}>{row.position ?? row.pos ?? row.rank ?? idx + 1}</td>\n <td style={{ padding: '10px 8px', fontWeight: 600 }}>\n {variant === 'logos' ? (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 8, minWidth: 0 }}>\n <TeamLogo\n teamId={tid}\n teamName={teamName}\n facrLogo={(row as any).team_logo_url}\n size=\"small\"\n alt={teamName || t('homepage.team')}\n borderRadius=\"full\"\n />\n <span style={{ whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{teamName}</span>\n </span>\n ) : (\n teamName\n )}\n </td>\n <td style={{ padding: '10px 4px', textAlign: 'center' }}>{(row as any).played ?? (row as any).matches ?? '-'}</td>\n <td style={{ padding: '10px 4px', textAlign: 'center' }}>{(row as any).wins ?? (row as any).win ?? '-'}</td>\n <td style={{ padding: '10px 4px', textAlign: 'center' }}>{(row as any).draws ?? (row as any).draw ?? '-'}</td>\n <td style={{ padding: '10px 4px', textAlign: 'center' }}>{(row as any).losses ?? (row as any).loss ?? '-'}</td>\n <td style={{ padding: '10px 4px', textAlign: 'center', display: 'none' }} className=\"hide-mobile\">{(row as any).score ?? '-'}</td>\n <td style={{ padding: '10px 8px', textAlign: 'center', fontWeight: 800 }}>{(row as any).points ?? (row as any).pts ?? '-'}</td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n );\n};\n\nexport default StandingsCard;\n","import api from './api';\n\nexport type CompetitionAlias = {\n code: string;\n alias: string;\n original_name?: string;\n display_order?: number;\n};\n\n// Public: fetch all aliases\nexport async function getCompetitionAliasesPublic(): Promise<CompetitionAlias[]> {\n const res = await api.get<CompetitionAlias[] | { data: CompetitionAlias[] }>(\n '/competition-aliases'\n );\n return Array.isArray(res.data) ? res.data : (res.data as any).data;\n}\n\n// Admin: list all aliases\nexport async function getCompetitionAliasesAdmin(): Promise<CompetitionAlias[]> {\n const res = await api.get<CompetitionAlias[] | { data: CompetitionAlias[] }>(\n '/admin/competition-aliases'\n );\n return Array.isArray(res.data) ? res.data : (res.data as any).data;\n}\n\n// Admin: upsert alias by code\nexport async function upsertCompetitionAlias(code: string, payload: { alias: string; original_name?: string; display_order?: number }): Promise<CompetitionAlias> {\n const res = await api.put<CompetitionAlias | { data: CompetitionAlias }>(\n `/admin/competition-aliases/${encodeURIComponent(code)}`,\n payload\n );\n return (res.data as any).code ? (res.data as any) : (res.data as any).data;\n}\n\n// Admin: delete alias by code\nexport async function deleteCompetitionAlias(code: string): Promise<{ ok: boolean } | void> {\n const res = await api.delete<{ ok: boolean } | any>(\n `/admin/competition-aliases/${encodeURIComponent(code)}`\n );\n return (res.data && typeof res.data.ok !== 'undefined') ? res.data : undefined;\n}\n\n// Admin: reorder competition aliases\nexport async function reorderCompetitionAliases(items: Array<{ code: string; display_order: number }>): Promise<{ ok: boolean; updated: number }> {\n const res = await api.post<{ ok: boolean; updated: number }>(\n '/admin/competition-aliases/reorder',\n { items }\n );\n return res.data;\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, HStack, IconButton, Heading, useColorModeValue } from '@chakra-ui/react';\nimport { ChevronLeftIcon, ChevronRightIcon } from '@chakra-ui/icons';\nimport { useClubTheme } from '../../contexts/ClubThemeContext';\n\ninterface HorizontalScrollerProps {\n title?: string;\n rightAction?: React.ReactNode;\n children: React.ReactNode;\n // Enhancements (all optional; defaults keep legacy behavior)\n draggable?: boolean; // enable mouse/touch drag scrolling\n autoScroll?: boolean; // enable continuous auto-scroll\n autoSpeed?: number; // pixels per frame (~60fps). default 1.2\n rewindLoop?: boolean; // if true, jump to start when reaching end (instead of stopping)\n pauseOnHover?: boolean; // pause auto-scroll on hover\n infiniteScroll?: boolean; // duplicate children for seamless infinite loop\n}\n\nconst SCROLL_AMOUNT = 0.7; // 70% of viewport width per click\n\nconst HorizontalScroller: React.FC<HorizontalScrollerProps> = ({ title, rightAction, children, draggable = false, autoScroll = false, autoSpeed = 1.2, rewindLoop = true, pauseOnHover = true, infiniteScroll = false }) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const theme = useClubTheme();\n const cardBg = useColorModeValue('white', 'gray.800');\n const [isHovering, setIsHovering] = useState(false);\n const isPointerDownRef = useRef(false);\n const startXRef = useRef(0);\n const startScrollLeftRef = useRef(0);\n const hasDraggedRef = useRef(false);\n const rafIdRef = useRef<number | null>(null);\n\n const scrollBy = (dir: 1 | -1) => {\n const el = containerRef.current;\n if (!el) return;\n // Use the container width rather than window width for more accurate scrolling\n const amount = Math.floor(el.clientWidth * SCROLL_AMOUNT) * dir;\n el.scrollBy({ left: amount, behavior: 'smooth' });\n };\n\n // Mouse/touch drag handlers\n const onPointerDown = (clientX: number) => {\n const el = containerRef.current;\n if (!el) return;\n isPointerDownRef.current = true;\n hasDraggedRef.current = false;\n startXRef.current = clientX;\n startScrollLeftRef.current = el.scrollLeft;\n // while dragging, disable smooth scroll behavior and selection\n el.style.scrollSnapType = 'none';\n el.style.cursor = 'grabbing';\n (document.body as any).style.userSelect = 'none';\n };\n const onPointerMove = (clientX: number) => {\n const el = containerRef.current;\n if (!el || !isPointerDownRef.current) return;\n const dx = clientX - startXRef.current;\n if (Math.abs(dx) > 3) hasDraggedRef.current = true;\n el.scrollLeft = startScrollLeftRef.current - dx;\n };\n const onPointerUp = () => {\n const el = containerRef.current;\n isPointerDownRef.current = false;\n if (el) {\n el.style.cursor = 'grab';\n }\n (document.body as any).style.userSelect = '';\n if (el) {\n // restore snap a moment later for a natural feel\n setTimeout(() => { if (el) el.style.scrollSnapType = 'x mandatory'; }, 100);\n }\n };\n\n // Auto-scroll implementation with infinite scroll support\n useEffect(() => {\n const el = containerRef.current;\n if (!autoScroll || !el) return;\n\n // For infinite scroll, set initial position to middle of duplicated content\n if (infiniteScroll) {\n const halfWidth = el.scrollWidth / 2;\n el.scrollLeft = halfWidth;\n }\n\n let running = true;\n const step = () => {\n if (!running || !el) return;\n \n const scrollLeft = el.scrollLeft;\n const scrollWidth = el.scrollWidth;\n const clientWidth = el.clientWidth;\n \n const shouldPause = (pauseOnHover && isHovering) || isPointerDownRef.current;\n \n if (!shouldPause) {\n if (infiniteScroll) {\n // Seamless infinite loop by resetting when reaching halfway\n const halfWidth = scrollWidth / 2;\n if (scrollLeft >= halfWidth) {\n el.scrollLeft = 0;\n } else {\n el.scrollLeft += autoSpeed;\n }\n } else {\n // Original rewind behavior\n const atEnd = scrollLeft + clientWidth >= scrollWidth - 2;\n if (atEnd && rewindLoop) {\n el.scrollLeft = 0;\n } else if (!atEnd) {\n el.scrollLeft += autoSpeed;\n }\n }\n }\n \n rafIdRef.current = requestAnimationFrame(step);\n };\n \n // Start the animation loop\n rafIdRef.current = requestAnimationFrame(step);\n \n return () => {\n running = false;\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n };\n }, [autoScroll, autoSpeed, pauseOnHover, isHovering, rewindLoop, infiniteScroll]);\n\n return (\n <Box position=\"relative\">\n {(title || rightAction) && (\n <HStack justify=\"space-between\" mb={3}>\n {title && (\n <Heading size=\"lg\" letterSpacing=\"0.04em\" style={{ textTransform: 'uppercase' }}>\n {title}\n </Heading>\n )}\n {rightAction}\n </HStack>\n )}\n\n {/* gradient masks for fancy edges */}\n <Box\n pointerEvents=\"none\"\n position=\"absolute\"\n left={0}\n top={0}\n bottom={0}\n w={{ base: 16, md: 24 }}\n bgGradient={useColorModeValue(\n 'linear(to-r, white, rgba(255,255,255,0.9), rgba(255,255,255,0.4), transparent)',\n 'linear(to-r, gray.900, rgba(17,25,40,0.9), rgba(17,25,40,0.4), transparent)'\n )}\n zIndex={1}\n />\n <Box\n pointerEvents=\"none\"\n position=\"absolute\"\n right={0}\n top={0}\n bottom={0}\n w={{ base: 16, md: 24 }}\n bgGradient={useColorModeValue(\n 'linear(to-l, white, rgba(255,255,255,0.9), rgba(255,255,255,0.4), transparent)',\n 'linear(to-l, gray.900, rgba(17,25,40,0.9), rgba(17,25,40,0.4), transparent)'\n )}\n zIndex={1}\n />\n\n {/* scroll area */}\n <HStack\n ref={containerRef}\n spacing={4}\n overflowX=\"auto\"\n py={2}\n px={1}\n cursor={draggable ? 'grab' : 'default'}\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label={title ? `Posuvník: ${title}` : 'Posuvník obsahu'}\n tabIndex={0}\n onKeyDown={(e) => {\n const el = containerRef.current;\n if (!el) return;\n if (e.key === 'ArrowLeft') {\n e.preventDefault();\n scrollBy(-1);\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n scrollBy(1);\n } else if (e.key === 'Home') {\n e.preventDefault();\n el.scrollTo({ left: 0, behavior: 'smooth' });\n } else if (e.key === 'End') {\n e.preventDefault();\n el.scrollTo({ left: el.scrollWidth, behavior: 'smooth' });\n }\n }}\n onMouseEnter={() => setIsHovering(true)}\n onMouseLeave={() => { setIsHovering(false); if (draggable) onPointerUp(); }}\n onMouseDown={(e) => { if (!draggable) return; e.preventDefault(); onPointerDown(e.clientX); }}\n onMouseMove={(e) => { if (!draggable) return; onPointerMove(e.clientX); }}\n onMouseUp={() => { if (!draggable) return; onPointerUp(); }}\n onTouchStart={(e) => { if (!draggable) return; if (e.touches[0]) onPointerDown(e.touches[0].clientX); }}\n onTouchMove={(e) => { if (!draggable) return; if (e.touches[0]) onPointerMove(e.touches[0].clientX); }}\n onTouchEnd={() => { if (!draggable) return; onPointerUp(); }}\n css={{\n scrollSnapType: infiniteScroll ? 'none' : 'x proximity',\n scrollBehavior: 'smooth',\n WebkitOverflowScrolling: 'touch',\n '&::-webkit-scrollbar': {\n height: '6px',\n },\n '&::-webkit-scrollbar-track': {\n background: 'transparent',\n },\n '&::-webkit-scrollbar-thumb': {\n background: useColorModeValue('rgba(0,0,0,0.15)', 'rgba(255,255,255,0.15)'),\n borderRadius: '3px',\n },\n '&::-webkit-scrollbar-thumb:hover': {\n background: useColorModeValue('rgba(0,0,0,0.25)', 'rgba(255,255,255,0.25)'),\n },\n }}\n >\n {children}\n {infiniteScroll && children}\n </HStack>\n\n {/* navigation buttons - must be above gradient masks */}\n <IconButton\n aria-label=\"Posunout doleva\"\n icon={<ChevronLeftIcon boxSize={6} />}\n onClick={(e) => { \n e.preventDefault(); \n e.stopPropagation(); \n scrollBy(-1); \n }}\n onMouseDown={(e) => { e.preventDefault(); e.stopPropagation(); }}\n onTouchStart={(e) => { e.preventDefault(); e.stopPropagation(); }}\n position=\"absolute\"\n top=\"50%\"\n transform=\"translateY(-50%)\"\n left={{ base: 1, md: 2 }}\n size=\"lg\"\n colorScheme=\"blackAlpha\"\n bg={useColorModeValue('rgba(255,255,255,0.95)', 'rgba(45,55,72,0.95)')}\n color={useColorModeValue('gray.800', 'white')}\n boxShadow=\"xl\"\n _hover={{ bg: useColorModeValue('white', 'gray.600'), transform: 'translateY(-50%) scale(1.15)', boxShadow: '2xl' }}\n _active={{ transform: 'translateY(-50%) scale(0.95)' }}\n transition=\"all 0.2s\"\n zIndex={30}\n borderRadius=\"full\"\n pointerEvents=\"auto\"\n />\n <IconButton\n aria-label=\"Posunout doprava\"\n icon={<ChevronRightIcon boxSize={6} />}\n onClick={(e) => { \n e.preventDefault(); \n e.stopPropagation(); \n scrollBy(1); \n }}\n onMouseDown={(e) => { e.preventDefault(); e.stopPropagation(); }}\n onTouchStart={(e) => { e.preventDefault(); e.stopPropagation(); }}\n position=\"absolute\"\n top=\"50%\"\n transform=\"translateY(-50%)\"\n right={{ base: 1, md: 2 }}\n size=\"lg\"\n colorScheme=\"blackAlpha\"\n bg={useColorModeValue('rgba(255,255,255,0.95)', 'rgba(45,55,72,0.95)')}\n color={useColorModeValue('gray.800', 'white')}\n boxShadow=\"xl\"\n _hover={{ bg: useColorModeValue('white', 'gray.600'), transform: 'translateY(-50%) scale(1.15)', boxShadow: '2xl' }}\n _active={{ transform: 'translateY(-50%) scale(0.95)' }}\n transition=\"all 0.2s\"\n zIndex={30}\n borderRadius=\"full\"\n pointerEvents=\"auto\"\n />\n\n {/* bottom accent line */}\n <Box mt={2} h=\"2px\" bg={theme.primary} borderRadius=\"full\" />\n </Box>\n );\n};\n\nexport default HorizontalScroller;\n","import React from 'react';\nimport PremiumLayout from './PremiumLayout';\nimport { useInfiniteQuery, useQuery } from '@tanstack/react-query';\nimport { getArticles, Article, Paginated, getFeaturedArticles } from '../../services/articles';\nimport { assetUrl } from '../../utils/url';\nimport { Box, Heading, Text, Grid, GridItem, Skeleton, LinkBox, Image } from '@chakra-ui/react';\nimport { Link as RouterLink } from 'react-router-dom';\n\nconst BlogCard: React.FC<{ article: Article; variant?: 'large' | 'small' }> = ({ article, variant }) => {\n const link = article.slug ? `/news/${article.slug}` : `/articles/${article.id}`;\n const imageH =\n variant === 'large'\n ? ({ base: '260px', md: '360px' } as const)\n : variant === 'small'\n ? ({ base: '160px', md: '200px' } as const)\n : ({ base: '220px', md: '240px' } as const);\n\n return (\n <LinkBox\n as={RouterLink}\n to={link}\n borderRadius=\"lg\"\n overflow=\"hidden\"\n bg=\"rgba(0,0,0,0.4)\"\n _hover={{ transform: 'translateY(-4px)', boxShadow: 'xl', bg: 'rgba(0,0,0,0.6)' }}\n transition=\"all 0.25s ease\"\n >\n <Box position=\"relative\">\n <Image\n src={assetUrl(article.image_url) || '/stadium-placeholder.jpg'}\n alt={article.title}\n w=\"100%\"\n h={imageH}\n objectFit=\"cover\"\n />\n <Box position=\"absolute\" inset={0} bgGradient=\"linear(to-t, rgba(0,0,0,0.7), rgba(0,0,0,0.15))\" />\n <Heading\n as=\"h3\"\n fontSize={variant === 'large' ? { base: 'xl', md: '2xl' } : { base: 'lg', md: 'xl' }}\n fontWeight=\"800\"\n letterSpacing=\"0.3px\"\n textTransform=\"uppercase\"\n position=\"absolute\"\n bottom={3}\n left={4}\n right={4}\n color=\"white\"\n noOfLines={2}\n >\n {article.title}\n </Heading>\n </Box>\n </LinkBox>\n );\n};\n\nconst PremiumBlogPage: React.FC = () => {\n const pageSize = 18;\n const featuredQ = useQuery<Paginated<Article>>(\n ['articles-featured', { page_size: 3 }],\n () => getFeaturedArticles({ page_size: 3 }),\n { staleTime: 5 * 60 * 1000 }\n );\n const {\n data,\n isLoading,\n isFetchingNextPage,\n hasNextPage,\n fetchNextPage,\n } = useInfiniteQuery<Paginated<Article>>(\n ['articles-public', { page_size: pageSize, published: true }],\n ({ pageParam = 1 }) => getArticles({ page: pageParam, page_size: pageSize, published: true }),\n {\n getNextPageParam: (lastPage, allPages) => {\n const loaded = allPages.reduce((sum, p) => sum + (p?.data?.length || 0), 0);\n if (!lastPage) return undefined;\n if (loaded < (lastPage.total || 0)) return allPages.length + 1;\n return undefined;\n },\n }\n );\n const articles = data?.pages?.flatMap((p) => p?.data || []) || [];\n const featured = featuredQ.data?.data || [];\n const rest = articles.filter((a) => !featured.some((f) => f.id === a.id));\n\n const sentinelRef = React.useRef<HTMLDivElement | null>(null);\n React.useEffect(() => {\n if (!hasNextPage || !sentinelRef.current) return;\n const el = sentinelRef.current;\n const io = new IntersectionObserver(\n (entries) => {\n const first = entries[0];\n if (first.isIntersecting && hasNextPage && !isFetchingNextPage) {\n fetchNextPage();\n }\n },\n { rootMargin: '400px' }\n );\n io.observe(el);\n return () => io.disconnect();\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n const primaryFeatured = featured[0];\n const secondaryFeatured = featured.slice(1, 3);\n\n return (\n <PremiumLayout>\n <Box className=\"sparta-container sparta-section\" mb={4}>\n <Heading as=\"h1\" size=\"2xl\" textTransform=\"uppercase\">\n Blog\n </Heading>\n <Text mt={2} opacity={0.8}>\n Nejnovější články, rozhovory a zprávy z klubu.\n </Text>\n </Box>\n\n {primaryFeatured && (\n <Box className=\"sparta-container sparta-section\" mb={6}>\n <Grid templateColumns={{ base: '1fr', md: '2fr 1fr' }} gap={6}>\n <GridItem>\n <BlogCard article={primaryFeatured} variant=\"large\" />\n </GridItem>\n {secondaryFeatured.length > 0 && (\n <GridItem>\n <Grid templateRows=\"repeat(2, minmax(0, 1fr))\" gap={4}>\n {secondaryFeatured.map((a) => (\n <BlogCard key={a.id} article={a} variant=\"small\" />\n ))}\n </Grid>\n </GridItem>\n )}\n </Grid>\n </Box>\n )}\n\n <Box className=\"sparta-container sparta-section\">\n <Grid templateColumns={{ base: '1fr', md: 'repeat(3, 1fr)' }} gap={6}>\n {isLoading &&\n Array.from({ length: 9 }).map((_, i) => (\n <Skeleton key={i} h={{ base: '260px', md: '280px' }} borderRadius=\"lg\" />\n ))}\n {!isLoading &&\n rest.map((a) => (\n <GridItem key={a.id}>\n <BlogCard article={a} />\n </GridItem>\n ))}\n </Grid>\n {isFetchingNextPage && (\n <Box mt={4} textAlign=\"center\">\n <Text opacity={0.8}>Načítání…</Text>\n </Box>\n )}\n <Box ref={sentinelRef} h=\"1px\" />\n </Box>\n </PremiumLayout>\n );\n};\n\nexport default PremiumBlogPage;\n","import api from './api';\n\nexport type PollStyle = 'auto' | 'rating-stars' | 'rating-scale' | 'choices-list' | 'choices-chips' | 'choices-cards';\n\nexport interface Poll {\n id: number;\n title: string;\n description: string;\n type: 'single' | 'multiple' | 'rating';\n style: PollStyle;\n status: 'draft' | 'active' | 'closed' | 'archived';\n start_date?: string;\n end_date?: string;\n allow_multiple: boolean;\n max_choices: number;\n show_results: 'always' | 'after_vote' | 'after_end' | 'never';\n require_auth: boolean;\n allow_guest_vote: boolean;\n featured: boolean;\n category_id?: number;\n category?: {\n id: number;\n name: string;\n slug: string;\n };\n related_match_id?: number;\n related_article_id?: number;\n related_article?: {\n id: number;\n title: string;\n slug: string;\n };\n related_event_id?: number;\n related_event?: {\n id: number;\n title: string;\n start_time: string;\n };\n related_video_url?: string;\n image_url?: string;\n total_votes: number;\n options: PollOption[];\n created_by: number;\n creator?: {\n id: number;\n email: string;\n username?: string;\n };\n created_at: string;\n updated_at: string;\n}\n\nexport interface PollOption {\n id: number;\n poll_id: number;\n text: string;\n description?: string;\n image_url?: string;\n display_order: number;\n vote_count: number;\n player_id?: number;\n player?: {\n id: number;\n first_name: string;\n last_name: string;\n jersey_number?: number;\n image_url?: string;\n };\n created_at: string;\n updated_at: string;\n}\n\nexport interface PollVoteRequest {\n option_ids: number[];\n session_token?: string;\n voter_name?: string;\n voter_email?: string;\n}\n\nexport interface PollResult {\n option_id: number;\n text: string;\n vote_count: number;\n percentage: number;\n image_url?: string;\n player_id?: number;\n}\n\nexport interface PollResultsResponse {\n poll_id: number;\n title: string;\n total_votes: number;\n results: PollResult[];\n}\n\nexport interface PollResponse {\n poll: Poll;\n has_voted: boolean;\n is_active: boolean;\n can_show_results: boolean;\n}\n\nexport interface CreatePollRequest {\n title: string;\n description?: string;\n type?: 'single' | 'multiple' | 'rating';\n style?: PollStyle;\n status?: 'draft' | 'active' | 'closed' | 'archived';\n start_date?: string;\n end_date?: string;\n allow_multiple?: boolean;\n max_choices?: number;\n show_results?: 'always' | 'after_vote' | 'after_end' | 'never';\n require_auth?: boolean;\n allow_guest_vote?: boolean;\n featured?: boolean;\n category_id?: number;\n related_match_id?: number;\n related_article_id?: number;\n related_event_id?: number;\n related_video_url?: string;\n image_url?: string;\n options: {\n text: string;\n description?: string;\n image_url?: string;\n display_order?: number;\n player_id?: number;\n }[];\n}\n\nexport interface UpdatePollRequest {\n title?: string;\n description?: string;\n type?: 'single' | 'multiple' | 'rating';\n style?: PollStyle;\n status?: 'draft' | 'active' | 'closed' | 'archived';\n start_date?: string;\n end_date?: string;\n allow_multiple?: boolean;\n max_choices?: number;\n show_results?: 'always' | 'after_vote' | 'after_end' | 'never';\n require_auth?: boolean;\n allow_guest_vote?: boolean;\n featured?: boolean;\n category_id?: number;\n related_match_id?: number;\n related_article_id?: number;\n related_event_id?: number;\n related_video_url?: string;\n image_url?: string;\n}\n\nexport interface PollStats {\n poll: Poll;\n votes_by_day: {\n date: string;\n count: number;\n }[];\n authenticated_votes: number;\n guest_votes: number;\n}\n\nexport interface PollVote {\n id: number;\n poll_id: number;\n option_id: number;\n option_text: string;\n user_id?: number;\n user_email?: string;\n user_first_name?: string;\n user_last_name?: string;\n voter_name?: string;\n voter_email?: string;\n session_token?: string;\n created_at: string;\n}\n\n// Public API\n\nexport const getPolls = async (params?: {\n featured?: boolean;\n status?: string;\n article_id?: number;\n event_id?: number;\n video_url?: string;\n}): Promise<Poll[]> => {\n const response = await api.get('/polls', {\n params,\n headers: { 'X-Session-Token': generateSessionToken() },\n });\n return response.data;\n};\n\nexport const getPoll = async (id: number): Promise<PollResponse> => {\n const token = generateSessionToken();\n const response = await api.get(`/polls/${id}`, {\n headers: { 'X-Session-Token': token },\n });\n return response.data;\n};\n\nexport const votePoll = async (\n id: number,\n data: PollVoteRequest\n): Promise<{ message: string; poll: Poll }> => {\n const token = data.session_token || generateSessionToken();\n const response = await api.post(\n `/polls/${id}/vote`,\n { ...data, session_token: token },\n { headers: { 'X-Session-Token': token } }\n );\n return response.data;\n};\n\nexport const getPollResults = async (id: number): Promise<PollResultsResponse> => {\n const token = generateSessionToken();\n const response = await api.get(`/polls/${id}/results`, {\n headers: { 'X-Session-Token': token },\n });\n return response.data;\n};\n\n// Admin API\n\nexport const getAdminPolls = async (params?: {\n status?: string;\n}): Promise<Poll[]> => {\n const response = await api.get('/admin/polls', { params });\n return response.data;\n};\n\nexport const getAdminPoll = async (id: number): Promise<PollResponse> => {\n const response = await api.get(`/admin/polls/${id}`);\n return response.data;\n};\n\nexport const createPoll = async (data: CreatePollRequest): Promise<Poll> => {\n const response = await api.post('/admin/polls', data);\n return response.data;\n};\n\nexport const updatePoll = async (\n id: number,\n data: UpdatePollRequest\n): Promise<Poll> => {\n const response = await api.put(`/admin/polls/${id}`, data);\n return response.data;\n};\n\nexport const deletePoll = async (id: number): Promise<void> => {\n await api.delete(`/admin/polls/${id}`);\n};\n\nexport const getPollStats = async (id: number): Promise<PollStats> => {\n const response = await api.get(`/admin/polls/${id}/stats`);\n return response.data;\n};\n\nexport const getPollVotes = async (id: number): Promise<PollVote[]> => {\n const response = await api.get(`/admin/polls/${id}/votes`);\n return response.data.votes as PollVote[];\n};\n\n// Helper to generate a session token for guest voting\nexport const generateSessionToken = (): string => {\n const stored = localStorage.getItem('poll_session_token');\n if (stored) {\n return stored;\n }\n \n const token = `guest_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n localStorage.setItem('poll_session_token', token);\n return token;\n};\n","import { triggerPrefetch } from './admin/prefetch';\nimport { Article, CreateArticlePayload, UpdateArticlePayload, createArticle, updateArticle } from './articles';\n\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nfunction normStr(v: any): string {\n return String(v ?? '').trim();\n}\n\nfunction normalizeAttachments(aRaw: any): Array<{ name: string; url: string; mime_type?: string; size?: number }> | undefined {\n try {\n const arr = Array.isArray(aRaw) ? aRaw : (typeof aRaw === 'string' ? JSON.parse(aRaw) : []);\n if (!Array.isArray(arr) || arr.length === 0) return undefined;\n return arr.map((it: any) => {\n if (typeof it === 'string') {\n const name = it.split('/').pop() || 'soubor';\n return { name, url: it };\n }\n const name = it?.name || (String(it?.url || '').split('/').pop() || 'soubor');\n const url = String(it?.url || '');\n const mime_type = it?.mime_type || it?.type;\n const size = typeof it?.size === 'number' ? it.size : undefined;\n return { name, url, mime_type, size };\n });\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeGalleryIds(raw: any): string[] | undefined {\n if (Array.isArray(raw)) return raw.map(String);\n if (typeof raw === 'string') {\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) return parsed.map(String);\n } catch {}\n return raw.split(',').map((s) => s.trim()).filter(Boolean);\n }\n return undefined;\n}\n\nfunction buildUpdatePayload(editing: Partial<Article>): UpdateArticlePayload {\n const attachments = normalizeAttachments((editing as any)?.attachments);\n const galleryIds = normalizeGalleryIds((editing as any)?.gallery_photo_ids);\n return {\n title: normStr((editing as any)?.title),\n content: typeof (editing as any)?.content === 'string' ? (editing as any).content : '',\n image_url: normStr((editing as any)?.image_url),\n ...(typeof (editing as any)?.category_id === 'number' ? { category_id: (editing as any).category_id } : {}),\n category_name: normStr((editing as any)?.category_name),\n slug: normStr((editing as any)?.slug),\n seo_title: normStr((editing as any)?.seo_title),\n seo_description: normStr((editing as any)?.seo_description),\n og_image_url: normStr((editing as any)?.og_image_url),\n featured: !!(editing as any)?.featured,\n // Gallery\n gallery_album_id: normStr((editing as any)?.gallery_album_id),\n gallery_album_url: normStr((editing as any)?.gallery_album_url),\n ...(galleryIds ? { gallery_photo_ids: galleryIds } : {}),\n // YouTube\n youtube_video_id: normStr((editing as any)?.youtube_video_id),\n youtube_video_title: normStr((editing as any)?.youtube_video_title),\n youtube_video_url: normStr((editing as any)?.youtube_video_url),\n youtube_video_thumbnail: normStr((editing as any)?.youtube_video_thumbnail),\n // Attachments\n ...(attachments ? { attachments } : {}),\n } as UpdateArticlePayload;\n}\n\nfunction buildCreatePayload(editing: Partial<Article>): CreateArticlePayload {\n const u = buildUpdatePayload(editing);\n return u as unknown as CreateArticlePayload;\n}\n\nexport async function saveArticleReliable(editing: Partial<Article>): Promise<Article> {\n const id = (editing as any)?.id;\n const isUpdate = !!id;\n const payloadU = buildUpdatePayload(editing);\n const payloadC = buildCreatePayload(editing);\n\n const maxAttempts = 3;\n let lastErr: any;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n let saved: Article;\n if (isUpdate) {\n try {\n saved = await updateArticle(id as any, payloadU);\n } catch (e: any) {\n if (e?.response?.status === 404) {\n saved = await createArticle(payloadC);\n } else {\n throw e;\n }\n }\n } else {\n saved = await createArticle(payloadC);\n }\n\n if (saved?.published) {\n try { await triggerPrefetch(); } catch {}\n }\n return saved;\n } catch (e) {\n lastErr = e;\n if (attempt < maxAttempts) {\n await sleep(attempt * 400);\n continue;\n }\n throw e;\n }\n }\n throw lastErr;\n}\n","import React, { useState } from 'react';\nimport {\n Box,\n Button,\n VStack,\n HStack,\n Input,\n Text,\n SimpleGrid,\n Image,\n Checkbox,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalBody,\n ModalFooter,\n ModalCloseButton,\n useToast,\n Spinner,\n Badge,\n FormControl,\n FormLabel,\n FormHelperText,\n} from '@chakra-ui/react';\nimport { ExternalLink, Download } from 'lucide-react';\nimport { getZoneramaAlbum } from '../../services/zonerama';\n\ninterface Photo {\n id: string;\n page_url: string;\n image_1500: string;\n}\n\ninterface Album {\n id: string;\n title: string;\n url: string;\n date: string;\n photos_count: number;\n photos: Photo[];\n}\n\ninterface AlbumPhotoPickerProps {\n isOpen: boolean;\n onClose: () => void;\n onPhotosSelected: (photos: Photo[], albumInfo: Album) => void;\n}\n\nconst AlbumPhotoPicker: React.FC<AlbumPhotoPickerProps> = ({\n isOpen,\n onClose,\n onPhotosSelected,\n}) => {\n const [albumLink, setAlbumLink] = useState('');\n const [loading, setLoading] = useState(false);\n const [album, setAlbum] = useState<Album | null>(null);\n const [selectedPhotos, setSelectedPhotos] = useState<Set<string>>(new Set());\n const [visibleCount, setVisibleCount] = useState<number>(60);\n const toast = useToast();\n\n const handleFetchAlbum = async () => {\n if (!albumLink.trim()) {\n toast({\n title: 'Zadejte URL alba',\n status: 'warning',\n duration: 3000,\n });\n return;\n }\n\n if (!albumLink.includes('/Album/')) {\n toast({\n title: 'Neplatný odkaz',\n description: 'URL musí obsahovat \"/Album/\"',\n status: 'error',\n duration: 3000,\n });\n return;\n }\n\n setLoading(true);\n try {\n const result = await getZoneramaAlbum(albumLink, { photo_limit: 100 }) as any;\n \n // Handle both response formats: { album, photos } and { albums: [{ photos }] }\n let albumData: any = null;\n let photos: any[] = [];\n \n if (result.albums && Array.isArray(result.albums) && result.albums.length > 0) {\n // New format: { albums: [{ id, title, url, date, photos }] }\n albumData = result.albums[0];\n photos = albumData.photos || [];\n } else if (result.album && result.photos) {\n // Old format: { album: {...}, photos: [...] }\n albumData = result.album;\n photos = result.photos;\n } else {\n throw new Error('Album nenalezeno - neplatná odpověď ze serveru');\n }\n \n if (!albumData) {\n throw new Error('Album nenalezeno');\n }\n \n const mappedPhotos = photos.map(p => ({\n id: p.id,\n page_url: p.page_url,\n image_1500: p.image_1500 || '',\n }));\n \n setAlbum({\n id: albumData.id || '',\n title: albumData.title || '',\n url: albumData.url || albumLink,\n date: albumData.date || '', // Now properly extracting date\n photos_count: mappedPhotos.length,\n photos: mappedPhotos,\n });\n setSelectedPhotos(new Set());\n setVisibleCount(60);\n \n toast({\n title: 'Album načteno',\n description: `${mappedPhotos.length} fotografií`,\n status: 'success',\n duration: 2000,\n });\n } catch (error: any) {\n console.error('Album fetch error:', error);\n toast({\n title: 'Chyba načítání alba',\n description: error.message || 'Nepodařilo se načíst album',\n status: 'error',\n duration: 5000,\n });\n } finally {\n setLoading(false);\n }\n };\n\n const togglePhoto = (photoId: string) => {\n const newSelected = new Set(selectedPhotos);\n if (newSelected.has(photoId)) {\n newSelected.delete(photoId);\n } else {\n newSelected.add(photoId);\n }\n setSelectedPhotos(newSelected);\n };\n\n const handleSelectAll = () => {\n if (album) {\n if (selectedPhotos.size === album.photos.length) {\n setSelectedPhotos(new Set());\n } else {\n setSelectedPhotos(new Set(album.photos.map(p => p.id)));\n }\n }\n };\n\n const handleConfirm = () => {\n if (!album || selectedPhotos.size === 0) {\n toast({\n title: 'Vyberte fotografie',\n status: 'warning',\n duration: 3000,\n });\n return;\n }\n\n const selected = album.photos.filter(p => selectedPhotos.has(p.id));\n onPhotosSelected(selected, album);\n handleClose();\n };\n\n const handleClose = () => {\n setAlbumLink('');\n setAlbum(null);\n setSelectedPhotos(new Set());\n setVisibleCount(60);\n onClose();\n };\n\n return (\n <Modal isOpen={isOpen} onClose={handleClose} size=\"6xl\">\n <ModalOverlay />\n <ModalContent maxH=\"90vh\">\n <ModalHeader>Vybrat fotografie z alba</ModalHeader>\n <ModalCloseButton />\n <ModalBody overflowY=\"auto\">\n <VStack align=\"stretch\" spacing={4}>\n {/* Album URL Input */}\n <FormControl>\n <FormLabel>URL Zonerama alba</FormLabel>\n <HStack>\n <Input\n value={albumLink}\n onChange={(e) => setAlbumLink(e.target.value)}\n placeholder=\"https://eu.zonerama.com/Account/Album/12345\"\n onKeyPress={(e) => e.key === 'Enter' && handleFetchAlbum()}\n />\n <Button\n onClick={handleFetchAlbum}\n isLoading={loading}\n colorScheme=\"blue\"\n leftIcon={<Download size={18} />}\n >\n Načíst\n </Button>\n </HStack>\n <FormHelperText>\n Vložte odkaz na Zonerama album (musí obsahovat /Album/)\n </FormHelperText>\n </FormControl>\n\n {/* Loading State */}\n {loading && (\n <VStack py={8}>\n <Spinner size=\"xl\" color=\"blue.500\" />\n <Text color=\"gray.600\">Načítám album...</Text>\n </VStack>\n )}\n\n {/* Album Info & Photos */}\n {album && !loading && (\n <>\n {/* Album Header */}\n <Box\n p={4}\n bg=\"blue.50\"\n borderRadius=\"md\"\n borderWidth=\"1px\"\n borderColor=\"blue.200\"\n >\n <VStack align=\"start\" spacing={2}>\n <HStack justify=\"space-between\" w=\"full\">\n <Text fontWeight=\"bold\" fontSize=\"lg\">\n {album.title}\n </Text>\n <Button\n as=\"a\"\n href={album.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n size=\"sm\"\n variant=\"ghost\"\n rightIcon={<ExternalLink size={14} />}\n >\n Zonerama\n </Button>\n </HStack>\n <HStack spacing={4} fontSize=\"sm\" color=\"gray.700\">\n {album.date && <Text>📅 {album.date}</Text>}\n <Badge colorScheme=\"blue\">{album.photos.length} fotografií</Badge>\n </HStack>\n </VStack>\n </Box>\n\n {/* Select All */}\n <HStack justify=\"space-between\">\n <Checkbox\n isChecked={selectedPhotos.size === album.photos.length}\n isIndeterminate={\n selectedPhotos.size > 0 && selectedPhotos.size < album.photos.length\n }\n onChange={handleSelectAll}\n >\n Vybrat vše ({selectedPhotos.size}/{album.photos.length})\n </Checkbox>\n </HStack>\n\n {/* Photos Grid */}\n <SimpleGrid columns={{ base: 3, md: 4, lg: 5 }} spacing={3}>\n {album.photos.slice(0, visibleCount).map((photo) => (\n <Box\n key={photo.id}\n position=\"relative\"\n cursor=\"pointer\"\n onClick={() => togglePhoto(photo.id)}\n borderRadius=\"md\"\n overflow=\"hidden\"\n borderWidth=\"2px\"\n borderColor={selectedPhotos.has(photo.id) ? 'blue.500' : 'transparent'}\n transition=\"all 0.2s\"\n _hover={{ transform: 'scale(1.05)' }}\n >\n <Image\n src={photo.image_1500}\n alt={photo.id}\n w=\"100%\"\n h=\"150px\"\n objectFit=\"cover\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n <Checkbox\n position=\"absolute\"\n top={2}\n right={2}\n isChecked={selectedPhotos.has(photo.id)}\n pointerEvents=\"none\"\n bg=\"white\"\n borderRadius=\"sm\"\n />\n </Box>\n ))}\n </SimpleGrid>\n {album.photos.length > visibleCount && (\n <HStack justify=\"center\" pt={2}>\n <Button size=\"sm\" onClick={() => setVisibleCount((c) => c + 60)}>Načíst další</Button>\n </HStack>\n )}\n </>\n )}\n </VStack>\n </ModalBody>\n <ModalFooter>\n <HStack spacing={3}>\n <Button variant=\"ghost\" onClick={handleClose}>\n Zrušit\n </Button>\n <Button\n colorScheme=\"blue\"\n onClick={handleConfirm}\n isDisabled={!album || selectedPhotos.size === 0}\n >\n Vybrat ({selectedPhotos.size})\n </Button>\n </HStack>\n </ModalFooter>\n </ModalContent>\n </Modal>\n );\n};\n\nexport default AlbumPhotoPicker;\n","import React from 'react';\nimport {\n Button,\n Box,\n Text,\n Alert,\n AlertIcon,\n AlertTitle,\n AlertDescription,\n Spinner,\n HStack,\n VStack,\n Divider,\n} from '@chakra-ui/react';\nimport { useBlogTranslation } from '../../hooks/useBlogTranslation';\nimport { FaLanguage, FaCheck, FaExclamationTriangle } from 'react-icons/fa';\n\ninterface BlogTranslatorProps {\n title: string;\n content: string;\n onTranslationComplete: (translatedTitle: string, translatedContent: string) => void;\n disabled?: boolean;\n}\n\nexport const BlogTranslator: React.FC<BlogTranslatorProps> = ({\n title,\n content,\n onTranslationComplete,\n disabled = false,\n}) => {\n const { translateBlog, isTranslating, translationError, detectSourceLanguage, getTargetLanguage } = useBlogTranslation();\n\n const handleTranslate = async () => {\n try {\n const result = await translateBlog(title, content);\n onTranslationComplete(result.title, result.content);\n } catch (error) {\n // Error is handled by the hook\n }\n };\n\n const sourceLang = detectSourceLanguage(title + ' ' + content);\n const targetLang = getTargetLanguage();\n const shouldTranslate = sourceLang !== targetLang && title && content;\n\n if (!shouldTranslate) {\n return (\n <Alert status=\"info\" borderRadius=\"md\">\n <AlertIcon as={FaLanguage} />\n <Box>\n <AlertTitle>Translation not needed</AlertTitle>\n <AlertDescription>\n Content is already in {sourceLang === 'cs' ? 'Czech' : 'English'} or the target language is the same.\n </AlertDescription>\n </Box>\n </Alert>\n );\n }\n\n return (\n <VStack spacing={3} align=\"stretch\">\n <Box>\n <HStack spacing={2} mb={2}>\n <FaLanguage />\n <Text fontWeight=\"medium\">\n Translate from {sourceLang === 'cs' ? 'Czech' : 'English'} to {targetLang === 'cs' ? 'Czech' : 'English'}\n </Text>\n </HStack>\n \n <Button\n colorScheme=\"blue\"\n onClick={handleTranslate}\n isLoading={isTranslating}\n loadingText=\"Translating...\"\n leftIcon={<FaLanguage />}\n disabled={disabled || isTranslating}\n size=\"sm\"\n >\n {isTranslating ? 'Translating...' : 'Translate Blog'}\n </Button>\n </Box>\n\n {translationError && (\n <Alert status=\"error\" borderRadius=\"md\">\n <AlertIcon as={FaExclamationTriangle} />\n <Box>\n <AlertTitle>Translation Failed</AlertTitle>\n <AlertDescription>{translationError}</AlertDescription>\n </Box>\n </Alert>\n )}\n\n {!isTranslating && !translationError && (\n <Alert status=\"success\" borderRadius=\"md\">\n <AlertIcon as={FaCheck} />\n <Box>\n <AlertTitle>Ready to Translate</AlertTitle>\n <AlertDescription>\n Click the translate button to convert this blog content to {targetLang === 'cs' ? 'Czech' : 'English'}.\n </AlertDescription>\n </Box>\n </Alert>\n )}\n\n <Divider />\n </VStack>\n );\n};\n","import React from 'react';\nimport { \n Box, Button, HStack, IconButton, Image, Input, Modal, ModalOverlay, ModalContent, \n ModalHeader, ModalCloseButton, ModalBody, ModalFooter, FormControl, FormLabel, FormHelperText,\n useToast, VStack, Text, SimpleGrid, useColorModeValue, useDisclosure,\n Textarea, Icon, useBreakpointValue, InputGroup, InputLeftElement,\n ButtonGroup, Spinner, Heading, Td, Th, Thead, Tr, Tbody, Table, Switch,\n Select, Badge, Tabs, TabList, TabPanels, Tab, TabPanel, Accordion, AccordionItem,\n AccordionButton, AccordionPanel, AccordionIcon, AspectRatio, Link, Alert, AlertIcon, Checkbox\n} from '@chakra-ui/react';\nimport { FiEdit2, FiTrash2, FiPlus, FiSearch, FiUpload, FiExternalLink, FiVideo, FiX, FiRefreshCcw, FiLink, FiGlobe } from 'react-icons/fi';\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport { useAuth } from '../../contexts/AuthContext';\nimport { Article, deleteArticle, getArticles, createArticle, updateArticle, uploadFile, CreateArticlePayload, UpdateArticlePayload, getArticleMatchLink, putArticleMatchLink, deleteArticleMatchLink } from '../../services/articles';\nimport { generateBlogAI, generateMainImageAI } from '../../services/ai';\nimport { useState, useRef, useCallback, useMemo } from 'react';\nimport DOMPurify from 'dompurify';\nimport RichTextEditor from '../../components/common/RichTextEditor';\nimport { assetUrl } from '../../utils/url';\nimport { getPublicSettings } from '../../services/settings';\nimport { getZoneramaManifestWithFallbacks, getZoneramaAlbum, putZoneramaPick, saveAlbumToCache } from '../../services/zonerama';\nimport { facrApi } from '../../services/facr/facrApi';\nimport { API_URL } from '../../services/api';\nimport { triggerPrefetch } from '../../services/admin/prefetch';\nimport { saveArticleReliable } from '../../services/articleSave';\nimport AlbumPhotoPicker from '../../components/admin/AlbumPhotoPicker';\nimport PollLinker from '../../components/admin/PollLinker';\nimport ThumbnailPreview from '../../components/common/ThumbnailPreview';\nimport FilePreview from '../../components/common/FilePreview';\nimport SaveStatusIndicator from '../../components/common/SaveStatusIndicator';\nimport AILoadingModal from '../../components/common/AILoadingModal';\nimport UploadPanel, { UploadPanelFile } from '../../components/common/UploadPanel';\n \nimport { useAutoSave, loadDraft, getDraftMetadata } from '../../hooks/useAutoSave';\n\nimport { getCachedYouTube, YouTubeVideo } from '../../services/youtube';\nimport { createShortLink } from '../../services/shortlinks';\nimport AIPromptInput from '../../components/common/AIPromptInput';\nimport { AITextModelId, getDefaultTextModelId } from '../../utils/aiModels';\nimport { processAIContent, cleanAIText } from '../../utils/aiTextProcessing';\nimport { getCompetitionAliasesPublic } from '../../services/competitionAliases';\nimport { BlogTranslator } from '../../components/admin/BlogTranslator';\nimport { translateBlogContent, detectLanguage } from '../../services/translation';\n\n// Inline small component to show match link badge in list (with short label)\nconst MatchLinkBadge: React.FC<{ articleId: number }> = ({ articleId }) => {\n const linkQ = useQuery({\n queryKey: ['article-match-link', articleId],\n queryFn: () => getArticleMatchLink(articleId),\n enabled: typeof articleId !== 'undefined' && articleId !== null && (typeof articleId === 'number' ? articleId > 0 : String(articleId).trim() !== ''),\n staleTime: 60_000,\n retry: false,\n });\n \n const mid = (linkQ.data as any)?.external_match_id;\n\n const facrQ = useQuery({\n queryKey: ['facr-cached-match', mid],\n enabled: !!mid,\n staleTime: 60_000,\n retry: false,\n queryFn: async () => {\n try {\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n const url = `${origin}/cache/prefetch/facr_club_info.json`;\n const res = await fetch(url, { cache: 'no-cache' });\n if (!res.ok) return null;\n const json = await res.json();\n const comps = Array.isArray(json?.competitions) ? json.competitions : [];\n for (const c of comps) {\n const matches = Array.isArray(c.matches) ? c.matches : [];\n for (const m of matches) {\n const id = String(m.match_id || m.id);\n if (id === String(mid)) return { ...m, competitionName: c.name };\n }\n }\n return null;\n } catch (error) {\n console.error('Failed to fetch FACR match data:', error);\n return null;\n }\n }\n });\n\n // Show loading state while fetching (after hooks are declared to keep order consistent)\n if (linkQ.isLoading) {\n return <Badge colorScheme=\"gray\">Načítání...</Badge>;\n }\n \n if (!mid) return <Badge colorScheme=\"gray\">Nepropojeno</Badge>;\n\n // Guard against errors\n if (facrQ.isError || linkQ.isError) {\n return <Badge colorScheme=\"red\">Chyba načítání</Badge>;\n }\n\n const m: any = facrQ.data;\n const scoreText = m ? (m.score || (m.result_home!=null && m.result_away!=null ? `${m.result_home}:${m.result_away}` : 'vs')) : '';\n const hasScore = !!m && !!scoreText && scoreText !== 'vs';\n const color = hasScore ? 'green' : 'yellow';\n const label = m\n ? `${String(m.home || m.home_team || '')} ${String(scoreText)} ${String(m.away || m.away_team || '')}`\n : `ID: ${String(mid)}`;\n const linkHrefRaw = (m && (m.facr_link || m.report_url)) ? String(m.facr_link || m.report_url) : '';\n const normalizeFacrLink = (href: string): string => {\n try {\n const u = new URL(href, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000');\n if (u.hostname === 'is.fotbal.cz') {\n u.hostname = 'www.fotbal.cz';\n }\n return u.toString();\n } catch { return href; }\n };\n const linkHref = linkHrefRaw ? normalizeFacrLink(linkHrefRaw) : '';\n return (\n <HStack spacing={2}>\n <Badge colorScheme={color as any} title={m?.competitionName ? String(m.competitionName) : undefined}>Zápas: {label}</Badge>\n {linkHref ? (\n <IconButton\n aria-label=\"Otevřít zápas na fotbal.cz\"\n size=\"xs\"\n as=\"a\"\n href={linkHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n icon={<FiExternalLink />}\n variant=\"ghost\"\n />\n ) : null}\n </HStack>\n );\n};\n// Note: Image resize module removed due to incompatibility with Quill v2\n\nconst PAGE_SIZE = 10;\n\nconst inputBg = 'white'; // Temporary placeholder for dark mode support\n\nconst parseYoutubeVideoId = (raw: string): string => {\n const value = String(raw || '').trim();\n if (!value) return '';\n\n // Try to parse as URL first\n try {\n const url = new URL(value.startsWith('http') ? value : `https://${value}`);\n if (url.hostname.includes('youtu.be')) {\n const parts = url.pathname.split('/').filter(Boolean);\n if (parts.length > 0) {\n return parts[0];\n }\n }\n if (url.pathname.includes('/shorts/')) {\n const parts = url.pathname.split('/shorts/');\n if (parts.length > 1) {\n const idCandidate = parts[1].split(/[?&]/)[0];\n if (/^[0-9A-Za-z_-]{11}$/.test(idCandidate)) {\n return idCandidate;\n }\n }\n }\n const vParam = url.searchParams.get('v');\n if (vParam && /^[0-9A-Za-z_-]{11}$/.test(vParam)) {\n return vParam;\n }\n } catch {\n // ignore and fall back to regex parsing\n }\n\n const regex = /(?:v=|\\/)([0-9A-Za-z_-]{11})(?![0-9A-Za-z_-])/;\n const match = value.match(regex);\n if (match && match[1]) {\n return match[1];\n }\n\n if (/^[0-9A-Za-z_-]{11}$/.test(value)) {\n return value;\n }\n\n return '';\n};\n\nconst makeSlug = (text: string): string => {\n return String(text || '')\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '') // Remove diacritics\n .replace(/[^a-z0-9\\s-]/g, '') // Keep only letters, numbers, spaces, hyphens\n .replace(/\\s+/g, '-') // Replace spaces with hyphens\n .replace(/-+/g, '-') // Replace multiple hyphens with single hyphen\n .replace(/^-|-$/g, ''); // Remove leading/trailing hyphens\n};\n\nconst ArticlesAdminPage = () => {\n const { user } = useAuth();\n const isAdmin = (user as any)?.role === 'admin';\n const toast = useToast();\n const qc = useQueryClient();\n const [page, setPage] = useState(1);\n const [search, setSearch] = useState('');\n\n interface EditingArticle extends Partial<Article> {\n slug?: string;\n slugModified?: boolean;\n // category is inherited from Article, no need to redefine\n category_id?: number;\n category_name?: string;\n }\n\n const [editing, setEditing] = useState<EditingArticle | null>(null);\n const [showDraftRecovery, setShowDraftRecovery] = useState(false);\n const [draftKey, setDraftKey] = useState<string>('');\n const [localDraft, setLocalDraft] = useState<EditingArticle | null>(null);\n const [manualSaveInProgress, setManualSaveInProgress] = useState(false);\n const [lastContentChangeAt, setLastContentChangeAt] = useState<number | null>(null);\n const [isContentTyping, setIsContentTyping] = useState(false);\n\n // Load cached matches list for quick picker (from prefetch cache like MatchesAdminPage)\n React.useEffect(() => {\n (async () => {\n try {\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n const url = `${origin}/cache/prefetch/facr_club_info.json`;\n const res = await fetch(url, { headers: { 'Cache-Control': 'no-cache' } });\n if (!res.ok) return;\n const json = await res.json();\n const comps = Array.isArray(json?.competitions) ? json.competitions : [];\n const items: any[] = comps.flatMap((c: any) => (Array.isArray(c.matches) ? c.matches : []).map((m: any) => {\n const score = m.score || (m.result_home!=null&&m.result_away!=null?`${m.result_home}:${m.result_away}`:'vs');\n return {\n id: String(m.match_id || m.id || ''),\n date: m.date_time || m.date || '',\n label: `${m.date_time || m.date || ''} • ${m.home || m.home_team || ''} ${score} ${m.away || m.away_team || ''} ${c?.name ? '('+c.name+')' : ''}`.trim(),\n competition: c?.name || '',\n competition_code: c?.code || c?.id || '',\n home: m.home || m.home_team || '',\n away: m.away || m.away_team || '',\n score: score\n };\n }));\n // keep latest 200 for performance\n setMatchOptions(items.slice(-200).reverse());\n } catch { /* ignore */ }\n })();\n }, []);\n\n const { data, isLoading } = useQuery({\n queryKey: ['admin-articles', { page, page_size: PAGE_SIZE, q: search, published: false }],\n // Important: pass published=false to fetch ALL (backend defaults to only published when param missing)\n queryFn: () => getArticles({ page, page_size: PAGE_SIZE, published: false, q: search }),\n keepPreviousData: true,\n });\n\n // Settings for logo fetch (for placeholder image)\n const settingsQ = useQuery({\n queryKey: ['public-settings'],\n queryFn: getPublicSettings,\n staleTime: 5 * 60_000,\n });\n\n \n const { isOpen, onOpen, onClose } = useDisclosure();\n const [aiPrompt, setAiPrompt] = useState('');\n const [aiAudience, setAiAudience] = useState('Fanoušci klubu');\n const [aiMinWords, setAiMinWords] = useState<number>(500);\n const [aiMinWordsInput, setAiMinWordsInput] = useState<string>('500');\n const [aiProgress, setAiProgress] = useState<number | undefined>(undefined);\n const [aiStartTime, setAiStartTime] = useState<number | null>(null);\n const [aiModelId, setAiModelId] = useState<AITextModelId>(getDefaultTextModelId());\n const [featSwitchLoading, setFeatSwitchLoading] = useState<boolean>(false);\n const [competitions, setCompetitions] = useState<Array<{ code?: string; name: string }>>([]);\n const [aliasesMap, setAliasesMap] = useState<Record<string, string>>({});\n const [aliasesList, setAliasesList] = useState<Array<{ code: string; alias: string; original_name?: string }>>([]);\n // Match link state\n const [linkedMatchId, setLinkedMatchId] = useState<string>('');\n const [linkedMatchTitle, setLinkedMatchTitle] = useState<string>('');\n const [matchIdInput, setMatchIdInput] = useState<string>('');\n const [matchOptions, setMatchOptions] = useState<Array<{ id: string; label: string; date?: string; competition?: string; home?: string; away?: string; score?: string }>>([]);\n const [matchSearch, setMatchSearch] = useState('');\n const [activeTabIndex, setActiveTabIndex] = useState(0);\n const [matchDateFilter, setMatchDateFilter] = useState<string>('');\n const [tempMatchLink, setTempMatchLink] = useState<string>(''); // Temporary storage for new articles\n\n // Zonerama picker state\n const [zAlbumLink, setZAlbumLink] = useState<string>('');\n const [zAlbumPhotos, setZAlbumPhotos] = useState<Array<{ id: string; page_url: string; image_1500?: string; title?: string }>>([]);\n const [zLoading, setZLoading] = useState<boolean>(false);\n const [albumPickerOpen, setAlbumPickerOpen] = useState<boolean>(false);\n const { isOpen: isAlbumPickerOpen, onOpen: onAlbumPickerOpen, onClose: onAlbumPickerClose } = useDisclosure();\n const { isOpen: isGalleryPickerOpen, onOpen: onGalleryPickerOpen, onClose: onGalleryPickerClose } = useDisclosure();\n const [cachedAlbums, setCachedAlbums] = useState<Array<{ id: string; date: string; title?: string; photos: Array<{ id: string; image_1500: string; page_url: string }> }>>([]);\n const [galleryLoading, setGalleryLoading] = useState<boolean>(false);\n const [galleryExpandedAlbumId, setGalleryExpandedAlbumId] = useState<string | null>(null);\n const [galleryVisibleCount, setGalleryVisibleCount] = useState<number>(48);\n const [youtubeVideos, setYoutubeVideos] = useState<YouTubeVideo[]>([]);\n const [youtubeLoading, setYoutubeLoading] = useState<boolean>(false);\n const [youtubeSearch, setYoutubeSearch] = useState<string>('');\n const [youtubeManualInput, setYoutubeManualInput] = useState<string>('');\n const { isOpen: isYouTubeModalOpen, onOpen: onYouTubeModalOpen, onClose: onYouTubeModalClose } = useDisclosure();\n const { isOpen: isExistingAlbumsOpen, onOpen: onExistingAlbumsOpen, onClose: onExistingAlbumsClose } = useDisclosure();\n const [zVisibleCount, setZVisibleCount] = useState<number>(24);\n const [existingSelectedAlbum, setExistingSelectedAlbum] = useState<{ id: string; date: string; title?: string; photos: Array<{ id: string; image_1500: string; page_url: string }> } | null>(null);\n const [existingSelectedPhotos, setExistingSelectedPhotos] = useState<Set<string>>(new Set());\n const [existingVisibleCount, setExistingVisibleCount] = useState<number>(48);\n const [mainImageLoading, setMainImageLoading] = useState<boolean>(false);\n\n // Track when the user is actively typing in the rich text editor\n React.useEffect(() => {\n if (lastContentChangeAt == null) {\n setIsContentTyping(false);\n return;\n }\n setIsContentTyping(true);\n const timeout = window.setTimeout(() => {\n if (lastContentChangeAt && Date.now() - lastContentChangeAt >= 800) {\n setIsContentTyping(false);\n }\n }, 800);\n return () => window.clearTimeout(timeout);\n }, [lastContentChangeAt]);\n\n // Auto-save hook - saves draft automatically\n const autosaveData = React.useMemo(() => {\n if (!editing) return {} as any;\n // Attach a synthetic timestamp so that enabling/disabling does not skip the last change\n return { ...(editing as any), __autosaveTs: lastContentChangeAt || 0 } as any;\n }, [editing, lastContentChangeAt]);\n\n const { saveStatus, lastSaved, forceSave, clearDraft } = useAutoSave({\n data: autosaveData,\n storageKey: draftKey,\n onSave: async (data) => {\n // Use centralized reliable saver (normalizes payload, retries, triggers cache refresh when published)\n if ((data as any)?.id || (data as any)?.title?.trim()) {\n const saved: any = await saveArticleReliable(data as any);\n if (saved?.id && !(data as any)?.id) {\n setEditing(prev => ({ ...(prev as any), id: saved.id } as any));\n setDraftKey(`draft-article-${saved.id}`);\n try { localStorage.removeItem('draft-article-new'); } catch {}\n }\n return saved;\n }\n return {};\n },\n debounceMs: 2000,\n enabled: isOpen && editing !== null && !manualSaveInProgress && !isContentTyping,\n });\n\n // Load local new-draft and expose in list (no popup)\n const refreshLocalDraft = React.useCallback(() => {\n try {\n const key = 'draft-article-new';\n const metadata = getDraftMetadata(key);\n if (metadata && metadata.age < 1440) {\n const d = loadDraft<EditingArticle>(key);\n if (d) {\n const restored: any = { ...d };\n if (restored.id) delete restored.id;\n setLocalDraft(restored);\n return;\n }\n }\n } catch {}\n setLocalDraft(null);\n }, []);\n\n React.useEffect(() => {\n refreshLocalDraft();\n }, [refreshLocalDraft]);\n\n // Fetch cached Zonerama gallery from prefetch\n const fetchCachedGallery = useCallback(async () => {\n try {\n setGalleryLoading(true);\n // Resolve backend origin for cached files regardless of frontend origin\n let origin = '';\n try {\n const assetBase = (process.env.REACT_APP_ASSET_BASE_URL || '').trim();\n if (assetBase) {\n origin = new URL(assetBase, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n }\n } catch {}\n if (!origin) {\n try {\n const apiUrl = process.env.REACT_APP_API_URL || 'http://localhost:8080/api/v1';\n origin = new URL(apiUrl, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n } catch {}\n }\n const profileUrl = `${origin}/cache/prefetch/zonerama_profile.json`;\n const albumsUrl = `${origin}/cache/prefetch/zonerama_albums.json`;\n\n const [profileRes, albumsRes] = await Promise.allSettled([\n fetch(profileUrl, { cache: 'no-cache' }),\n fetch(albumsUrl, { cache: 'no-cache' }),\n ]);\n\n let albums: any[] = [];\n if (albumsRes.status === 'fulfilled' && albumsRes.value.ok) {\n const json = await albumsRes.value.json();\n albums = Array.isArray(json) ? json : [];\n if (Array.isArray(albums) && albums.length > 0) {\n const withPhotos = albums.filter((a: any) => Array.isArray(a?.photos) && a.photos.length > 0);\n albums = withPhotos.length > 0 ? withPhotos : [];\n }\n }\n // Legacy fallback: some caches might have { albums: [...] }\n if (albums.length === 0 && profileRes.status === 'fulfilled' && profileRes.value.ok) {\n const p = await profileRes.value.json();\n const arr = Array.isArray(p?.albums) ? p.albums : [];\n // Only keep entries that already include photos\n albums = arr.filter((a: any) => Array.isArray(a.photos) && a.photos.length > 0);\n }\n\n // Final fallback: synthesize from flat manifest/picks\n if (albums.length === 0) {\n try {\n const items = await getZoneramaManifestWithFallbacks();\n if (Array.isArray(items) && items.length > 0) {\n const byAlbum: Record<string, any[]> = {} as any;\n items.forEach((it: any) => {\n const aid = String(it.album_id || 'unknown');\n (byAlbum[aid] = byAlbum[aid] || []).push(it);\n });\n albums = Object.entries(byAlbum).map(([aid, arr]) => ({\n id: aid,\n title: 'Album',\n url: (arr[0] as any).page_url || '#',\n date: '',\n photos_count: (arr as any[]).length,\n photos: (arr as any[]).slice(0, 100).map((p: any) => ({ id: String(p.id || ''), image_1500: String(p.src || p.local || ''), page_url: String(p.page_url || '') })),\n }));\n }\n } catch { /* ignore */ }\n }\n\n // Normalize albums to ensure photos is always an array with required fields\n albums = albums.map((a: any) => {\n const p = Array.isArray(a.photos) ? a.photos : [];\n const normPhotos = p.map((ph: any) => ({\n id: String(ph.id || ''),\n image_1500: String(ph.image_1500 || ph.src || ph.local || ''),\n page_url: String(ph.page_url || ''),\n }));\n return { ...a, photos: normPhotos };\n });\n\n // Sort by date (desc). Support both ISO (yyyy-mm-dd) and Czech (dd.mm.yyyy)\n const parseDate = (s: string): number => {\n const str = String(s || '').trim();\n if (!str) return 0;\n const iso = Date.parse(str);\n if (!Number.isNaN(iso)) return iso;\n const m = str.match(/^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})$/);\n if (m) {\n const d = parseInt(m[1], 10);\n const mo = parseInt(m[2], 10) - 1;\n const y = parseInt(m[3], 10);\n return new Date(y, mo, d).getTime();\n }\n return 0;\n };\n const sorted = [...albums].sort((a, b) => parseDate(b.date) - parseDate(a.date));\n setCachedAlbums(sorted);\n if (sorted.length === 0) {\n toast({ title: 'Žádné alba nenalezena', description: 'Cache galerie je prázdná nebo neobsahuje fotografie.', status: 'info', duration: 4000 });\n }\n } catch (e: any) {\n toast({ title: 'Načtení galerie selhalo', description: e?.message || 'Zkuste to prosím znovu.', status: 'error' });\n } finally {\n setGalleryLoading(false);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Remove toast from dependencies to prevent infinite loops\n const fetchYouTubeVideos = useCallback(async () => {\n try {\n setYoutubeLoading(true);\n const payload = await getCachedYouTube();\n let videos: YouTubeVideo[] = [];\n if (payload && Array.isArray(payload.videos)) {\n videos = payload.videos;\n }\n setYoutubeVideos(videos);\n if (!payload || videos.length === 0) {\n toast({ title: 'YouTube videa nenalezena', description: 'Zkontrolujte nastavení YouTube kanálu nebo zkuste obnovit cache.', status: 'info', duration: 4000 });\n }\n } catch (e: any) {\n toast({ title: 'Načtení YouTube videí selhalo', description: e?.message || 'Zkuste to prosím znovu.', status: 'error' });\n } finally {\n setYoutubeLoading(false);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.useEffect(() => {\n if (isYouTubeModalOpen && youtubeVideos.length === 0 && !youtubeLoading) {\n fetchYouTubeVideos();\n }\n }, [isYouTubeModalOpen, youtubeVideos.length, youtubeLoading, fetchYouTubeVideos]);\n\n React.useEffect(() => {\n if (isGalleryPickerOpen && cachedAlbums.length === 0 && !galleryLoading) {\n fetchCachedGallery();\n }\n }, [isGalleryPickerOpen, cachedAlbums.length, galleryLoading, fetchCachedGallery]);\n\n React.useEffect(() => {\n if (isExistingAlbumsOpen && cachedAlbums.length === 0 && !galleryLoading) {\n fetchCachedGallery();\n }\n }, [isExistingAlbumsOpen, cachedAlbums.length, galleryLoading, fetchCachedGallery]);\n\n const filteredYoutubeVideos = useMemo(() => {\n const q = youtubeSearch.trim().toLowerCase();\n if (!q) return youtubeVideos;\n return youtubeVideos.filter((video) => {\n const title = (video.title || '').toLowerCase();\n return title.includes(q) || String(video.video_id || '').toLowerCase().includes(q);\n });\n }, [youtubeVideos, youtubeSearch]);\n\n const handleSelectYoutubeVideo = useCallback((video: YouTubeVideo) => {\n setEditing((prev) => ({\n ...(prev as any),\n youtube_video_id: video.video_id,\n youtube_video_title: video.title,\n youtube_video_url: `https://www.youtube.com/watch?v=${video.video_id}`,\n youtube_video_thumbnail: video.thumbnail_url,\n }));\n toast({ title: 'Video přidáno k článku', description: video.title, status: 'success' });\n onYouTubeModalClose();\n }, [toast, onYouTubeModalClose]);\n\n const handleClearYoutubeVideo = useCallback(() => {\n setEditing((prev) => ({\n ...(prev as any),\n youtube_video_id: '',\n youtube_video_title: '',\n youtube_video_url: '',\n youtube_video_thumbnail: '',\n }));\n toast({ title: 'Video odstraněno', status: 'info' });\n }, [toast]);\n\n const handleGenerateMainImage = useCallback(async () => {\n if (!editing || !editing.title || !editing.title.trim()) {\n toast({ title: 'Chybí titulek článku', description: 'Nejprve zadejte titulek, aby AI věděla, co má zobrazit.', status: 'warning', duration: 4000 });\n return;\n }\n try {\n setMainImageLoading(true);\n const categoryName = (editing as any)?.category_name || (editing as any)?.category?.name || '';\n const clubName = (settingsQ.data as any)?.club_name || '';\n const primaryColor = (settingsQ.data as any)?.primary_color || '';\n const secondaryColor = (settingsQ.data as any)?.secondary_color || '';\n const resp = await generateMainImageAI({\n subject: 'article',\n title: editing.title,\n category: categoryName,\n club_name: clubName,\n primary_color: primaryColor,\n secondary_color: secondaryColor,\n });\n if (!resp || !resp.url) {\n toast({ title: 'AI nevrátila obrázek', description: 'Zkuste to prosím znovu nebo nastavte obrázek ručně.', status: 'warning', duration: 5000 });\n return;\n }\n setEditing((prev) => ({ ...(prev as any), image_url: resp.url } as any));\n toast({ title: 'Titulní obrázek vygenerován', description: 'Obrázek byl nastaven k článku.', status: 'success', duration: 4000 });\n } catch (e: any) {\n toast({ title: 'Generování obrázku selhalo', description: e?.response?.data?.error || e?.message || 'Zkuste to prosím znovu.', status: 'error', duration: 5000 });\n } finally {\n setMainImageLoading(false);\n }\n }, [editing, toast]);\n\n const handleManualYoutubeSubmit = useCallback(() => {\n const id = parseYoutubeVideoId(youtubeManualInput);\n if (!id) {\n toast({ title: 'Neplatný YouTube odkaz', description: 'Zadejte prosím platné ID nebo odkaz na video.', status: 'warning' });\n return;\n }\n const existing = youtubeVideos.find((v) => v.video_id === id);\n const title = existing?.title || 'YouTube video';\n const thumbnail = existing?.thumbnail_url || `https://i.ytimg.com/vi/${id}/hqdefault.jpg`;\n setEditing((prev) => ({\n ...(prev as any),\n youtube_video_id: id,\n youtube_video_title: title,\n youtube_video_url: `https://www.youtube.com/watch?v=${id}`,\n youtube_video_thumbnail: thumbnail,\n }));\n toast({ title: 'Video nastaveno', description: title, status: 'success' });\n setYoutubeManualInput('');\n }, [youtubeManualInput, youtubeVideos, toast]);\n\n const pickZoneramaImage = useCallback(async (pick: { id: string; album_id?: string; album_url: string; page_url?: string; image_url: string; title?: string }) => {\n try {\n // Set cover image immediately and link the album to the article as well\n setEditing((prev) => {\n const current = (prev as any) || {};\n \n // Try to derive numeric album ID from URL when not provided\n let aid = String(pick.album_id || '').trim();\n if (!aid && pick.album_url) {\n try {\n const m = pick.album_url.match(/\\/Album\\/(\\d+)/i);\n if (m && m[1]) aid = m[1];\n } catch {}\n }\n \n // Only update gallery_album_url if it's not already set (preserve existing gallery connection)\n const shouldUpdateAlbumUrl = !current.gallery_album_url;\n \n return {\n ...current,\n image_url: pick.image_url,\n gallery_album_url: shouldUpdateAlbumUrl ? pick.album_url : current.gallery_album_url,\n ...(aid ? { gallery_album_id: aid } : {}),\n };\n });\n // Persist pick to unified cache (admin only)\n if (isAdmin) {\n await putZoneramaPick({\n id: pick.id,\n album_id: pick.album_id,\n album_url: pick.album_url,\n page_url: pick.page_url,\n image_url: pick.image_url,\n title: pick.title,\n } as any);\n toast({ title: 'Obrázek vybrán ze Zonerama', description: 'Album bylo také propojeno s článkem.', status: 'success' });\n } else {\n toast({ title: 'Obrázek nastaven', description: 'Album bylo také propojeno s článkem.', status: 'success' });\n }\n } catch (e: any) {\n toast({ title: 'Uložení výběru selhalo', description: e?.response?.data?.error || e?.message || 'Chyba', status: 'error' });\n }\n }, [toast]);\n\n // Handle album photo selection for blog content\n const handleAlbumPhotosSelected = useCallback(async (photos: Array<{ id: string; page_url: string; image_1500: string }>, albumInfo: any) => {\n try {\n // Check if this is selection from existing gallery (no URL means it's from cache)\n const isFromExistingGallery = !albumInfo?.url;\n \n // Save album to cache (admins only) only when adding new album via URL\n if (isAdmin && albumInfo?.url && !isFromExistingGallery) {\n toast({ title: 'Ukládám album...', status: 'info', duration: 2000 });\n const limit = Math.max(500, Number(albumInfo?.photos_count || 0) || photos.length || 100);\n await saveAlbumToCache(albumInfo.url, limit);\n }\n \n // Store album info with article and append images to content\n setEditing((prev) => {\n const currentContent = (prev as any)?.content || '';\n const photosHTML = photos\n .map(p => `<img src=\"${p.image_1500}\" alt=\"Gallery photo\" data-page-url=\"${p.page_url}\" data-img-id=\"${p.id}\" />`)\n .join('\\n');\n \n // For existing gallery, preserve the existing gallery_album_url and don't replace existing album data\n const finalAlbumUrl = isFromExistingGallery \n ? (prev as any)?.gallery_album_url // Keep existing URL\n : albumInfo.url; // Use new album URL\n \n // Only update album info if it's a new album or if no album exists\n const shouldUpdateAlbumInfo = !isFromExistingGallery || !(prev as any)?.gallery_album_id;\n \n const updates: any = {\n content: currentContent + '\\n' + photosHTML,\n };\n \n // Only update album info for new albums or when no album exists\n if (shouldUpdateAlbumInfo) {\n updates.gallery_album_id = albumInfo.id;\n updates.gallery_album_url = finalAlbumUrl;\n updates.gallery_photo_ids = photos.map(p => p.id);\n }\n \n return {\n ...(prev as any),\n ...updates,\n };\n });\n \n // Only populate album in Media tab when adding NEW album (not from existing gallery)\n if (!isFromExistingGallery) {\n // REUSE ALBUM: Also populate the album in Media tab so it doesn't need to be fetched twice\n // Map album photos to the format used in zAlbumPhotos state\n const mappedPhotos = albumInfo.photos?.map((p: any) => ({\n id: p.id,\n page_url: p.page_url,\n image_1500: p.image_1500 || '',\n title: p.title || '',\n })) || photos.map(p => ({\n id: p.id,\n page_url: p.page_url,\n image_1500: p.image_1500 || '',\n title: '',\n }));\n \n setZAlbumLink(albumInfo.url || '');\n setZAlbumPhotos(mappedPhotos);\n }\n\n toast({ \n title: isFromExistingGallery ? 'Fotografie propojeny s článkem' : 'Album přidáno', \n description: `${photos.length} fotografií vloženo do článku.`,\n status: 'success',\n duration: 4000 \n });\n } catch (error: any) {\n toast({\n title: 'Chyba',\n description: error.message || 'Nepodařilo se přidat album',\n status: 'error',\n duration: 5000,\n });\n }\n }, [toast]);\n\n const fetchAlbumByLink = useCallback(async () => {\n const link = zAlbumLink.trim();\n if (!link) return;\n try {\n setZLoading(true);\n // Use correct API endpoint format based on album-api.md\n const params = new URLSearchParams({\n link: link,\n photo_limit: '24',\n rendered: 'true'\n });\n const res = await fetch(`${API_URL}/zonerama-album?${params.toString()}`);\n if (!res.ok) throw new Error('Failed to fetch album');\n const data = await res.json();\n \n // Handle the response structure from API - it can be:\n // 1. { albums: [{ photos: [...] }] } - new format\n // 2. { album: {...}, photos: [...] } - direct format\n let photos: any[] = [];\n \n if (Array.isArray(data?.albums) && data.albums.length > 0) {\n // New format with albums array\n photos = data.albums[0]?.photos || [];\n } else if (Array.isArray(data?.photos)) {\n // Direct format with photos array\n photos = data.photos;\n }\n \n if (photos.length === 0) {\n toast({ title: 'Album načteno, ale neobsahuje žádné fotografie', status: 'info' });\n }\n \n setZAlbumPhotos(photos);\n } catch (e: any) {\n toast({ title: 'Načtení alba selhalo', description: e?.message || 'Chyba', status: 'error' });\n } finally {\n setZLoading(false);\n }\n }, [zAlbumLink, toast]);\n\n // Match link is now included in article data, no need to fetch separately\n // The openEdit function handles setting it from the article data\n\n const filteredMatchOptions = useMemo(() => {\n let opts = matchOptions;\n\n const normalize = (s?: string) => String(s || '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\n\n const toAlias = (compName?: string): string => {\n const n = normalize(compName);\n for (const a of aliasesList) {\n const aAlias = normalize(a.alias);\n const aOrig = normalize(a.original_name || '');\n if ((aOrig && (n === aOrig || n.includes(aOrig) || aOrig.includes(n))) ||\n (aAlias && (n === aAlias || n.includes(aAlias) || aAlias.includes(n)))) {\n return a.alias;\n }\n }\n return String(compName || '');\n };\n\n const catRaw = String((editing as any)?.category_name || '').trim();\n const cat = normalize(catRaw);\n if (cat) {\n const selectedCodes = new Set<string>();\n for (const a of aliasesList) {\n const aAlias = normalize(a.alias);\n const aOrig = normalize(a.original_name || '');\n if ((aAlias && aAlias === cat) || (aOrig && aOrig === cat)) {\n selectedCodes.add(a.code);\n }\n }\n\n opts = opts.filter(o => {\n const compName = String(o.competition || '');\n const compNorm = normalize(compName);\n const compAlias = normalize(toAlias(compName));\n const code = String((o as any).competition_code || '');\n const codeMatch = selectedCodes.size > 0 && code ? selectedCodes.has(code) : false;\n return codeMatch || compNorm === cat || compAlias === cat || compNorm.includes(cat) || compAlias.includes(cat);\n });\n }\n\n const q = matchSearch.trim().toLowerCase();\n if (q) {\n opts = opts.filter(o => o.label.toLowerCase().includes(q));\n }\n\n if (matchDateFilter) {\n opts = opts.filter(o => {\n const dateStr = o.date || '';\n return dateStr.includes(matchDateFilter);\n });\n }\n const now = Date.now();\n const parseTime = (s?: string): number => {\n if (!s) return Number.MAX_SAFE_INTEGER;\n const m = s.match(/^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})(?:\\s+(\\d{1,2}):(\\d{2}))?/);\n if (m) {\n const d = parseInt(m[1], 10);\n const mo = parseInt(m[2], 10) - 1;\n const y = parseInt(m[3], 10);\n const h = m[4] ? parseInt(m[4], 10) : 0;\n const mi = m[5] ? parseInt(m[5], 10) : 0;\n return new Date(y, mo, d, h, mi).getTime();\n }\n const t = Date.parse(s);\n return isNaN(t) ? Number.MAX_SAFE_INTEGER : t;\n };\n opts = opts.sort((a, b) => {\n const ta = parseTime(a.date);\n const tb = parseTime(b.date);\n const da = ta - now;\n const db = tb - now;\n const aUpcoming = da >= 0;\n const bUpcoming = db >= 0;\n if (aUpcoming !== bUpcoming) return aUpcoming ? -1 : 1;\n if (aUpcoming) return da - db;\n return Math.abs(da) - Math.abs(db);\n });\n\n return opts;\n }, [matchOptions, matchSearch, matchDateFilter, (editing as any)?.category_name, aliasesList]);\n\n // Load club competitions + aliases for quick category pick\n React.useEffect(() => {\n (async () => {\n try {\n const settings = await getPublicSettings();\n const clubId = (settings as any)?.club_id || '';\n const clubType = ((settings as any)?.club_type || 'football') as 'football' | 'futsal';\n\n // Aliases\n let amap: Record<string, string> = {};\n try {\n const list = await getCompetitionAliasesPublic();\n list.forEach((a) => { if (a.code && a.alias) amap[a.code] = a.alias; });\n setAliasesList(list as any);\n } catch {}\n\n // Try cached prefetch JSON first\n let comps: Array<{ code?: string; name: string }> = [];\n try {\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n const res = await fetch(`${origin}/cache/prefetch/facr_club_info.json`, { cache: 'no-cache' });\n if (res.ok) {\n const json = await res.json();\n const arr = Array.isArray((json as any)?.competitions) ? (json as any).competitions : [];\n comps = arr.map((c: any) => ({ code: c.code || c.id, name: c.name || c.code || c.id }));\n }\n } catch {}\n\n // Fallback to live FACR API if cache is empty/unavailable\n if (comps.length === 0 && clubId) {\n try {\n const club = await facrApi.getClub(String(clubId), clubType);\n comps = (club?.competitions || []).map((c: any) => ({ code: c.code, name: c.name || c.code }));\n } catch {}\n }\n\n // Apply aliases to names for display\n const withAliases = comps.map((c) => ({ code: c.code, name: (c.code && amap[c.code]) ? amap[c.code] : c.name }));\n setAliasesMap(amap);\n setCompetitions(withAliases);\n } catch {}\n })();\n }, []);\n\n const aiMut = useMutation({\n mutationFn: async () => {\n setAiProgress(0);\n setAiStartTime(Date.now());\n \n // Start progress simulation\n const progressInterval = setInterval(() => {\n setAiProgress(prev => {\n if (prev === undefined || prev >= 95) return prev;\n return Math.min(prev + Math.random() * 15 + 5, 95);\n });\n }, 2000);\n\n try {\n const parsed = parseInt(String(aiMinWordsInput || '').trim(), 10);\n const effective = Number.isFinite(parsed) && !isNaN(parsed) && parsed > 0 ? parsed : aiMinWords;\n const base = String(aiPrompt || '').trim();\n \n // Add club information to the prompt\n const clubName = settingsQ.data?.club_name || 'Fotbalový klub';\n const clubInfo = `\\n\\nInformace o klubu:\\nNázev klubu: ${clubName}.`;\n \n const htmlGuidelines = [\n 'Piš česky a strukturovaně pro blog fotbalového klubu.',\n 'Používej bohaté HTML prvky: rozděl článek do 24 sekcí s <h2>/<h3>, krátké odstavce <p>, alespoň jeden seznam <ul><li>, zvýraznění <strong>/<em>.',\n 'Pokud se to hodí, vlož krátký citát pomocí <blockquote>…</blockquote> (max. 1×).',\n 'Nevkládej <html>, <head> ani <body>. Vrať jen validní HTML části obsahu.',\n 'Zachovej fakta zadaná uživatelem, vyhýbej se hyperbolem a marketingovým frázím.',\n ].join(' ');\n const finalPrompt = `${base}${clubInfo}\\n\\n${htmlGuidelines}`.trim();\n const result = await generateBlogAI({\n prompt: finalPrompt,\n audience: aiAudience,\n min_words: effective,\n model: aiModelId,\n });\n \n clearInterval(progressInterval);\n setAiProgress(100);\n \n // Brief moment to show 100% completion\n await new Promise(resolve => setTimeout(resolve, 500));\n \n return result;\n } catch (error) {\n clearInterval(progressInterval);\n throw error;\n }\n },\n onSuccess: (res) => {\n console.log('AI blog response:', res);\n \n // Insert AI output into the editing state\n const aiTitle = cleanAIText(String(res?.title || '').trim());\n const aiSlug = String(res?.slug || '').trim();\n const aiHtml = processAIContent(String(res?.html || '').trim(), { cleanText: true, preserveHtmlTags: true });\n \n if (!aiTitle || !aiHtml) {\n console.error('AI response missing title or html:', res);\n toast({ title: 'AI odpověď neúplná', description: 'Chybí název nebo obsah článku', status: 'error' });\n return;\n }\n \n \n setEditing((prev) => ({\n ...(prev as any),\n title: aiTitle,\n slug: aiSlug,\n content: aiHtml,\n }));\n \n // Clear AI prompt and switch to Základní tab to show results\n setAiPrompt('');\n setActiveTabIndex(1); // Switch to \"Základní\" tab\n \n toast({ title: 'Článek hotov', description: 'AI rozvinula váš text a vyplnila název, slug a obsah. Zkontrolujte výsledek v záložce Základní.', status: 'success', duration: 5000 });\n },\n onError: (e: any) => {\n console.error('AI generation error:', e);\n toast({ title: 'Generování selhalo', description: e?.response?.data?.error || e?.message || 'Zkuste to prosím znovu.', status: 'error' });\n },\n onSettled: () => {\n setTimeout(() => {\n setAiProgress(undefined);\n setAiStartTime(null);\n }, 1000);\n },\n });\n\n const openCreate = () => {\n const key = 'draft-article-new';\n setDraftKey(key);\n // Reset match linking state for a brand new article\n setLinkedMatchId('');\n setMatchIdInput('');\n setTempMatchLink('');\n if (localDraft) {\n setEditing(localDraft);\n setActiveTabIndex(1);\n } else {\n setEditing({ title: '', content: '', featured: false, published: false } as any);\n setActiveTabIndex(0);\n }\n setAiPrompt('');\n onOpen();\n };\n\n const openEdit = (a: Article) => {\n // Set unique draft key for this article\n const key = `draft-article-${a.id}`;\n setDraftKey(key);\n \n setEditing({ \n ...a, \n category_name: a.category?.name || a.category_name || '' \n });\n \n // If match_link is already in the article data, set it immediately\n if ((a as any)?.match_link?.external_match_id) {\n const matchId = String((a as any).match_link.external_match_id);\n setLinkedMatchId(matchId);\n setMatchIdInput(matchId);\n } else {\n // Clear match link state if not present\n setLinkedMatchId('');\n setMatchIdInput('');\n }\n \n setActiveTabIndex(1); // Start on Základní tab for editing\n setAiPrompt(''); // Clear AI prompt\n onOpen();\n };\n\n const closeModal = () => {\n // Clear temporary match link if user backs out without saving\n setTempMatchLink('');\n setMatchIdInput('');\n setLinkedMatchId('');\n setEditing(null);\n onClose();\n refreshLocalDraft();\n };\n\n // Draft recovery handlers\n const handleRecoverDraft = () => {\n const draft = loadDraft<EditingArticle>(draftKey);\n if (draft) {\n const isNewDraft = draftKey === 'draft-article-new';\n const restored: any = { ...draft };\n if (isNewDraft && restored.id) {\n delete restored.id;\n }\n setEditing(restored);\n setActiveTabIndex(1);\n onOpen();\n }\n setShowDraftRecovery(false);\n };\n\n const handleDiscardDraft = () => {\n clearDraft();\n setEditing({ title: '', content: '', featured: false, published: false } as any);\n setActiveTabIndex(0);\n setShowDraftRecovery(false);\n onOpen();\n };\n\n const handleDeleteOnly = () => {\n clearDraft();\n setShowDraftRecovery(false);\n // Don't open the modal - just delete and close\n };\n\n const createMut = useMutation({\n mutationFn: (payload: CreateArticlePayload) =>\n // Forward the payload as-is so new fields (youtube, gallery) are persisted\n createArticle(payload),\n onSuccess: async (created: any) => {\n console.log('Article created successfully in mutation callback:', created);\n // Note: Match linking is now handled in onSubmit() to avoid race conditions\n // Clear temporary storage\n setTempMatchLink('');\n setMatchIdInput('');\n try { if (created?.published) { await triggerPrefetch(); } } catch {}\n \n // Invalidate queries to refresh the list\n qc.invalidateQueries({ queryKey: ['admin-articles'] });\n qc.invalidateQueries({ queryKey: ['articles'] });\n qc.invalidateQueries({ queryKey: ['recentArticles'] });\n qc.invalidateQueries({ queryKey: ['article-match-link'] }); // Invalidate match links\n \n // Don't close modal here - let onSubmit handle it after match linking\n },\n onError: (e: any) => {\n console.error('Error creating article:', e);\n toast({ \n title: 'Chyba při vytváření článku', \n description: e?.response?.data?.message || 'Došlo k chybě při ukládání',\n status: 'error',\n duration: 5000,\n isClosable: true\n });\n },\n });\n\n const updateMut = useMutation({\n mutationFn: ({ id, payload }: { id: number | string; payload: UpdateArticlePayload }) =>\n // Forward the payload as-is so new fields (youtube, gallery) are persisted\n updateArticle(id, payload),\n onSuccess: async (saved: any, variables) => {\n const articleId = variables.id;\n console.log('Article updated successfully in mutation callback:', articleId);\n try { if (saved?.published) { await triggerPrefetch(); } } catch {}\n \n // Invalidate queries to refresh the list\n qc.invalidateQueries({ queryKey: ['admin-articles'] });\n qc.invalidateQueries({ queryKey: ['articles'] });\n qc.invalidateQueries({ queryKey: ['recentArticles'] });\n qc.invalidateQueries({ queryKey: ['article-match-link', articleId] }); // Invalidate specific match link\n qc.invalidateQueries({ queryKey: ['article', `id:${articleId}`] }); // Invalidate article detail\n \n // Success toast and modal closing handled in onSubmit()\n },\n onError: (e: any) => {\n console.error('Error updating article:', e);\n toast({ \n title: 'Chyba při aktualizaci článku', \n description: e?.response?.data?.message || 'Došlo k chybě při ukládání',\n status: 'error',\n duration: 5000,\n isClosable: true\n });\n },\n });\n\n const deleteMut = useMutation({\n mutationFn: (id: number | string) => deleteArticle(id),\n onSuccess: () => {\n toast({ title: 'Článek smazán', status: 'success' });\n qc.invalidateQueries({ queryKey: ['admin-articles'] });\n },\n onError: (e: any) => toast({ title: 'Smazání selhalo', description: e?.response?.data?.message || e?.response?.data?.chyba || 'Chyba', status: 'error' }),\n });\n\n const handleDeleteArticle = useCallback(\n (article: Partial<Article> & Record<string, any>) => {\n const candidate = article?.id ?? article?.ID ?? article?.article_id ?? article?.articleId;\n if (candidate === undefined || candidate === null || candidate === '') {\n toast({\n title: 'Chybějící ID článku',\n description: 'Nepodařilo se zjistit identifikátor článku pro smazání.',\n status: 'error',\n });\n return;\n }\n\n const idValue = typeof candidate === 'number' || typeof candidate === 'string'\n ? candidate\n : Number(candidate);\n\n if (idValue === undefined || idValue === null || (typeof idValue === 'number' && Number.isNaN(idValue))) {\n toast({\n title: 'Neplatné ID článku',\n description: 'Zadaný identifikátor článku není platný.',\n status: 'error',\n });\n return;\n }\n },\n [qc, toast]\n );\n\n\n const handleTitleChange = (title: string) => {\n if (!editing) return;\n setEditing(prev => ({\n ...(prev as any),\n title,\n // Auto-generate slug from title if not manually modified\n ...(!(prev as any)?.slugModified ? { \n slug: makeSlug(title)\n } : {})\n }));\n };\n\n const handleSlugChange = (slug: string) => {\n if (!editing) return;\n setEditing(prev => ({\n ...(prev as any),\n slug,\n slugModified: true // Mark as manually modified\n }));\n };\n\n const ensurePlaceholderImage = async (): Promise<string | undefined> => {\n try {\n const logoUrl = String(settingsQ.data?.club_logo_url || '/dist/img/logo-club-empty.svg');\n const canvas = document.createElement('canvas');\n const W = 1200, H = 630;\n canvas.width = W; canvas.height = H;\n const ctx = canvas.getContext('2d');\n if (!ctx) return undefined;\n // Clean background (white, no black border)\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, W, H);\n // Draw club logo centered\n const img = new window.Image();\n img.crossOrigin = 'anonymous';\n const loadImg = () => new Promise<HTMLImageElement>((resolve, reject) => {\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = logoUrl;\n });\n try { await loadImg(); } catch { /* fallback */ }\n const boxW = Math.round(W * 0.5);\n const boxH = Math.round(H * 0.5);\n const x = Math.round((W - boxW) / 2);\n const y = Math.round((H - boxH) / 2);\n try { ctx.drawImage(img, x, y, boxW, boxH); } catch {}\n // Export and upload\n const blob: Blob | null = await new Promise(resolve => canvas.toBlob(b => resolve(b), 'image/jpeg', 0.92));\n if (!blob) return undefined;\n const file = new File([blob], 'article-cover.jpg', { type: 'image/jpeg' });\n const res = await uploadFile(file);\n return (res as any)?.url || undefined;\n } catch { return undefined; }\n };\n\n const onSubmit = async (options: { keepOpen?: boolean } = {}) => {\n if (!editing) return;\n\n // Check if content contains raw AI JSON (invalid state)\n const contentText = String(editing.content || '').trim();\n if (contentText.includes('\"title\":') && contentText.includes('\"slug\":') && contentText.includes('\"html\":')) {\n toast({\n title: 'Neplatný obsah',\n description:\n 'Obsah obsahuje nezpracovanou AI odpověď. Zkuste AI generování znovu nebo použijte záložku \"Základní\" pro ruční vytvoření.',\n status: 'error',\n duration: 8000,\n });\n return;\n }\n\n setManualSaveInProgress(true);\n\n try {\n const imageUrl = ((editing as any).image_url as string | undefined) || '';\n\n // Clean HTML content\n const cleanHTML = DOMPurify.sanitize(editing.content || '', {\n USE_PROFILES: { html: true },\n ADD_TAGS: ['iframe'],\n ADD_ATTR: ['target', 'rel', 'allow', 'allowfullscreen'],\n });\n\n // Prepare the payload according to the backend's expected format\n const payload: CreateArticlePayload = {\n title: editing.title || '',\n content: cleanHTML,\n image_url: imageUrl || '',\n ...(typeof (editing as any).category_id === 'number'\n ? { category_id: (editing as any).category_id as number }\n : {}),\n category_name: (editing as any).category_name || undefined,\n published: true, // Always publish articles\n slug: (editing as any).slug || makeSlug(editing.title || ''),\n featured: !!(editing as any)?.featured,\n // Persist gallery fields when present\n ...((editing as any).gallery_album_id ? { gallery_album_id: (editing as any).gallery_album_id } : {}),\n ...((editing as any).gallery_album_url ? { gallery_album_url: (editing as any).gallery_album_url } : {}),\n ...(Array.isArray((editing as any).gallery_photo_ids) && (editing as any).gallery_photo_ids.length > 0\n ? { gallery_photo_ids: (editing as any).gallery_photo_ids }\n : {}),\n // Persist YouTube fields when present\n ...((editing as any).youtube_video_id ? { youtube_video_id: (editing as any).youtube_video_id } : {}),\n ...((editing as any).youtube_video_title ? { youtube_video_title: (editing as any).youtube_video_title } : {}),\n ...((editing as any).youtube_video_url ? { youtube_video_url: (editing as any).youtube_video_url } : {}),\n ...((editing as any).youtube_video_thumbnail\n ? { youtube_video_thumbnail: (editing as any).youtube_video_thumbnail }\n : {}),\n // Persist attachments when present\n ...(Array.isArray((editing as any)?.attachments) && (editing as any).attachments.length > 0\n ? {\n attachments: (editing as any).attachments.map((a: any) => ({\n name: a.name,\n url: a.url,\n mime_type: a.mime_type,\n size: a.size,\n })),\n }\n : {}),\n };\n\n // Log the payload for debugging\n console.log('Saving article with payload:', JSON.stringify(payload, null, 2));\n\n // Debug: Log match link state before submission\n console.log('Match link state before submit:', {\n tempMatchLink,\n matchIdInput,\n linkedMatchId,\n isNewArticle: !(editing as any)?.id,\n });\n\n if ((editing as any)?.id) {\n // Update existing article\n await updateMut.mutateAsync({ id: (editing as any).id, payload });\n\n // Handle match linking for existing articles (update or delete)\n const matchRaw = matchIdInput || linkedMatchId;\n const matchId = String(matchRaw || '').trim();\n let matchLinked = false;\n if (matchId) {\n try {\n await putArticleMatchLink((editing as any).id, {\n external_match_id: matchId,\n title: editing.title || '',\n });\n console.log('Match link updated for existing article');\n matchLinked = true;\n } catch (err: any) {\n console.error('Failed to update match link:', err);\n }\n }\n\n // Show success message\n toast({\n title: matchLinked\n ? 'Článek aktualizován a propojen se zápasem'\n : 'Článek byl úspěšně aktualizován',\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n } else {\n // Create new article\n const created = await createMut.mutateAsync(payload);\n\n // Handle match linking for new articles\n const matchRaw = tempMatchLink || matchIdInput;\n const matchId = String(matchRaw || '').trim();\n if (matchId && created?.id) {\n console.log('Linking new article', created.id, 'with match', matchId);\n try {\n await putArticleMatchLink(created.id, {\n external_match_id: matchId,\n title: editing.title || '',\n });\n console.log('Match link created for new article');\n setLinkedMatchId(matchId);\n toast({\n title: 'Článek vytvořen a propojen se zápasem',\n description: `Match ID: ${matchId}`,\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n } catch (err: any) {\n console.error('Failed to link match:', err);\n toast({\n title: 'Článek vytvořen, ale propojení se zápasem selhalo',\n description:\n err?.response?.data?.error || err?.message || 'Zkuste propojit zápas ručně',\n status: 'warning',\n duration: 5000,\n isClosable: true,\n });\n }\n } else if (created?.id) {\n // No match to link, just show success\n toast({\n title: 'Článek byl úspěšně vytvořen',\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n }\n }\n\n // Close modal after successful save (unless keepOpen is true)\n if (!options.keepOpen) {\n closeModal();\n }\n } catch (error: any) {\n console.error('Error saving article:', error);\n // Error is handled by the mutation's onError handler\n } finally {\n setManualSaveInProgress(false);\n }\n };\n\n const articles = data?.data || [];\n const total = data?.total || 0;\n const totalPages = Math.max(1, Math.ceil(total / PAGE_SIZE));\n\n const uploadAttachmentFile = async (file: File): Promise<UploadPanelFile> => {\n const allowedTypes = [\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'text/plain',\n 'application/zip',\n 'application/x-zip-compressed',\n 'application/x-rar-compressed',\n 'application/vnd.rar',\n ];\n const isAllowed =\n allowedTypes.includes(file.type) ||\n !!file.name.match(/\\.(pdf|docx?|xlsx?|pptx?|jpe?g|png|gif|webp|txt|zip|rar)$/i);\n if (!isAllowed) {\n throw new Error(`Soubor \"${file.name}\" nelze nahrát (nepodporovaný formát).`);\n }\n const res = await uploadFile(file);\n return {\n url: res.url,\n name: file.name,\n type: file.type || (res as any).type || 'application/octet-stream',\n size: file.size || (res as any).size || 0,\n };\n };\n\n const handleFeaturedToggle = async (next: boolean) => {\n if (!editing) return;\n const currentIsFeatured = !!(editing as any)?.featured;\n // If turning off or no change, simply update local state\n if (!next || (next === currentIsFeatured)) {\n setEditing((prev) => ({ ...(prev as any), featured: next }));\n return;\n }\n // Turning on featured\n try {\n setFeatSwitchLoading(true);\n // Count featured from current page as a quick check\n let list = (articles || []).filter((a) => a.featured);\n if (list.length >= 3) {\n // Fetch a larger set of featured across pages to be safe\n try {\n const all = await getArticles({ page: 1, page_size: 50, featured: true, published: false });\n list = all.data || list;\n } catch {}\n }\n if (list.length >= 3) {\n // Find the oldest featured article by published_at/created_at/updated_at\n const toTs = (a: any) => {\n const s = a?.published_at || a?.created_at || a?.updated_at || '';\n const t = Date.parse(s);\n return isNaN(t) ? 0 : t;\n };\n const sorted = [...list].sort((a, b) => {\n const dt = toTs(a) - toTs(b);\n if (dt !== 0) return dt;\n // Fallback stable ordering by id\n return (a.id || 0) - (b.id || 0);\n });\n const oldest = sorted[0];\n if (oldest && oldest.id !== (editing as any)?.id) {\n try {\n await updateArticle(oldest.id, { featured: false });\n toast({ title: 'Uvolněno místo pro primární', description: `Zrušena primárnost: ${oldest.title}`, status: 'info' });\n // Refresh caches that may rely on featured\n qc.invalidateQueries({ queryKey: ['admin-articles'] });\n qc.invalidateQueries({ queryKey: ['articles'] });\n qc.invalidateQueries({ queryKey: ['featured-articles'] });\n } catch (e: any) {\n toast({ title: 'Nelze uvolnit místo', description: e?.response?.data?.message || 'Zkuste znovu.', status: 'error' });\n setFeatSwitchLoading(false);\n return;\n }\n }\n }\n setEditing((prev) => ({ ...(prev as any), featured: true }));\n } finally {\n setFeatSwitchLoading(false);\n }\n };\n\n const matchBgSelected = useColorModeValue('blue.50', 'blue.900');\n const matchBgDefault = useColorModeValue('white', 'gray.700');\n const matchHoverBg = useColorModeValue('blue.50', 'gray.600');\n const albumLinkHasPhotosBg = useColorModeValue('green.50', 'green.900');\n const albumCardBg = useColorModeValue('white', 'gray.700');\n\n const handleListFeaturedToggle = async (article: Article, next: boolean) => {\n try {\n if (!next) {\n await updateArticle(article.id, { featured: false });\n } else {\n // Enforce max 3 primární články\n let list: Article[] = (articles || []).filter((a) => a.featured);\n const alreadyFeatured = list.some((a) => a.id === article.id);\n if (list.length >= 3 && !alreadyFeatured) {\n try {\n const all = await getArticles({ page: 1, page_size: 50, featured: true, published: false });\n list = all.data || list;\n } catch {}\n }\n if (list.length >= 3 && !alreadyFeatured) {\n const toTs = (a: any) => {\n const s = a?.published_at || a?.created_at || a?.updated_at || '';\n const t = Date.parse(s);\n return Number.isNaN(t) ? 0 : t;\n };\n const sorted = [...list].sort((a, b) => {\n const dt = toTs(a) - toTs(b);\n if (dt !== 0) return dt;\n return (a.id || 0) - (b.id || 0);\n });\n const oldest = sorted[0];\n if (oldest && oldest.id !== article.id) {\n try {\n await updateArticle(oldest.id, { featured: false });\n toast({ title: 'Uvolněno místo pro primární', description: `Zrušena primárnost: ${oldest.title}`, status: 'info' });\n } catch (e: any) {\n toast({ title: 'Nelze uvolnit místo', description: e?.response?.data?.message || 'Zkuste znovu.', status: 'error' });\n return;\n }\n }\n }\n await updateArticle(article.id, { featured: true });\n }\n\n qc.invalidateQueries({ queryKey: ['admin-articles'] });\n qc.invalidateQueries({ queryKey: ['articles'] });\n qc.invalidateQueries({ queryKey: ['featured-articles'] });\n toast({\n title: next ? 'Článek nastaven jako primární' : 'Článek odstraněn z primárních',\n status: 'success',\n duration: 2000,\n });\n } catch (error: any) {\n toast({\n title: 'Chyba při aktualizaci',\n description: error?.response?.data?.error || 'Nepodařilo se změnit stav',\n status: 'error',\n });\n }\n };\n\n // Quick translation handler for article list\n const handleQuickTranslate = async (article: Article) => {\n if (!article.title || !article.content) {\n toast({\n title: 'Nelze přeložit',\n description: 'Článek musí mít název a obsah.',\n status: 'error',\n duration: 3000,\n });\n return;\n }\n\n try {\n const sourceLang = detectLanguage(article.title + ' ' + article.content);\n const targetLang = sourceLang === 'cs' ? 'en' : 'cs';\n\n if (sourceLang === targetLang) {\n toast({\n title: 'Překlad není potřeba',\n description: 'Článek je již v cílovém jazyce.',\n status: 'info',\n duration: 3000,\n });\n return;\n }\n\n const result = await translateBlogContent(article.title, article.content, sourceLang, targetLang);\n \n // Update the article with translated content\n await updateArticle(article.id, {\n title: result.translatedTitle,\n content: result.translatedContent,\n slug: makeSlug(result.translatedTitle),\n });\n\n // Refresh the articles list\n qc.invalidateQueries({ queryKey: ['admin-articles'] });\n qc.invalidateQueries({ queryKey: ['articles'] });\n\n toast({\n title: 'Článek přeložen',\n description: `Článek byl přeložen z ${sourceLang === 'cs' ? 'češtiny' : 'angličtiny'} do ${targetLang === 'cs' ? 'češtiny' : 'angličtiny'}.`,\n status: 'success',\n duration: 3000,\n });\n } catch (error: any) {\n toast({\n title: 'Chyba při překladu',\n description: error?.message || 'Nepodařilo se přeložit článek.',\n status: 'error',\n duration: 3000,\n });\n }\n };\n\n return (\n <AdminLayout requireAdmin={false}>\n <Box>\n <HStack justify=\"space-between\" mb={4}>\n <Heading size=\"lg\">Články</Heading>\n <Button leftIcon={<FiPlus />} colorScheme=\"blue\" onClick={openCreate}>\n Nový článek\n </Button>\n </HStack>\n <Text color=\"gray.500\" mb={6}>\n Správa článků a novinek na webu. Můžete vytvářet, upravovat a publikovat články.\n </Text>\n\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={4} mb={6}>\n <Input\n placeholder=\"Hledat články...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n mr={2}\n />\n </SimpleGrid>\n\n <Box \n bg={useColorModeValue('white', 'gray.800')}\n borderWidth=\"1px\"\n borderRadius=\"lg\"\n overflowX=\"auto\"\n boxShadow=\"sm\"\n mb={6}\n >\n <Table size=\"sm\">\n <Thead>\n <Tr>\n <Th>Obrázek</Th>\n <Th>Titulek</Th>\n <Th>Kategorie</Th>\n <Th>⭐ Primární</Th>\n <Th>Zápas</Th>\n <Th isNumeric>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {isLoading && (\n <Tr><Td colSpan={6}><Spinner size=\"sm\" /></Td></Tr>\n )}\n {!isLoading && localDraft && (\n <Tr key=\"local-draft\" opacity={0.6}>\n <Td>\n <ThumbnailPreview \n src={assetUrl((localDraft as any).image_url) || '/dist/img/logo-club-empty.svg'} \n alt={(localDraft as any).title || 'Koncept'} \n size=\"48px\"\n previewSize=\"350px\"\n />\n </Td>\n <Td>\n <VStack align=\"start\" spacing={0}>\n <Text fontWeight=\"medium\">{(localDraft as any).title || 'Bez názvu (koncept)'}</Text>\n <Text fontSize=\"xs\" color=\"gray.500\">Koncept (lokálně uložený)</Text>\n </VStack>\n </Td>\n <Td>\n <Badge colorScheme=\"gray\" fontSize=\"xs\">\n {(localDraft as any).category_name || 'Bez kategorie'}\n </Badge>\n </Td>\n <Td>\n <Switch size=\"sm\" isChecked={!!(localDraft as any).featured} isDisabled />\n </Td>\n <Td>\n <Badge colorScheme=\"gray\">Koncept</Badge>\n </Td>\n <Td isNumeric>\n <HStack spacing={1} justify=\"flex-end\">\n <IconButton aria-label=\"Upravit koncept\" size=\"sm\" icon={<FiEdit2 />} onClick={openCreate} />\n <IconButton \n aria-label=\"Smazat koncept\" \n size=\"sm\" \n colorScheme=\"red\" \n icon={<FiTrash2 />} \n onClick={() => { try { localStorage.removeItem('draft-article-new'); } catch {} setLocalDraft(null); toast({ title: 'Koncept odstraněn', status: 'success', duration: 2000 }); }} \n />\n </HStack>\n </Td>\n </Tr>\n )}\n {!isLoading && articles.map((a) => (\n <Tr key={a.id} opacity={a.published ? 1 : 0.6}>\n <Td>\n <ThumbnailPreview \n src={assetUrl(a.image_url) || '/dist/img/logo-club-empty.svg'} \n alt={a.title} \n size=\"48px\"\n previewSize=\"350px\"\n />\n </Td>\n <Td>\n <VStack align=\"start\" spacing={0}>\n <Text fontWeight=\"medium\">{a.title}</Text>\n <Text fontSize=\"xs\" color=\"gray.500\">\n {a.published ? '✓ Publikováno' : '○ Koncept'}\n </Text>\n </VStack>\n </Td>\n <Td>\n <Badge colorScheme=\"blue\" fontSize=\"xs\">\n {a.category?.name || a.category_name || 'Bez kategorie'}\n </Badge>\n </Td>\n <Td>\n <Switch\n size=\"sm\"\n isChecked={!!a.featured}\n onChange={(e) => {\n handleListFeaturedToggle(a, e.target.checked);\n }}\n />\n </Td>\n <Td><MatchLinkBadge articleId={a.id} /></Td>\n <Td isNumeric>\n <HStack spacing={1}>\n <IconButton aria-label=\"Upravit\" size=\"sm\" icon={<FiEdit2 />} onClick={() => openEdit(a)} />\n <IconButton \n aria-label=\"Přeložit\" \n size=\"sm\" \n colorScheme=\"blue\" \n icon={<FiGlobe />} \n title=\"Přeložit článek\"\n onClick={() => handleQuickTranslate(a)} \n />\n <IconButton aria-label=\"Smazat\" size=\"sm\" colorScheme=\"red\" icon={<FiTrash2 />} onClick={() => handleDeleteArticle(a)} />\n <IconButton\n aria-label=\"Zkrátit odkaz\"\n size=\"sm\"\n icon={<FiLink />}\n title=\"Zkrátit odkaz pro sdílení\"\n onClick={async () => {\n try {\n const origin = window.location.origin;\n const slug = (a as any)?.slug || (a as any)?.Slug;\n const path = slug ? `/news/${slug}` : `/articles/${a.id}`;\n const target = `${origin}${path}`;\n const res = await createShortLink({ target_url: target, title: a.title, source_type: 'article', source_id: a.id, code: `a${a.id}` });\n await navigator.clipboard.writeText(res.short_url);\n toast({ title: 'Zkrácený odkaz zkopírován', description: res.short_url, status: 'success', duration: 4000 });\n } catch (e: any) {\n toast({ title: 'Vytvoření odkazu selhalo', description: e?.message || 'Zkuste to znovu', status: 'error' });\n }\n }}\n />\n </HStack>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n\n <HStack mt={4} justify=\"flex-end\">\n <Button onClick={() => setPage((p) => Math.max(1, p - 1))} isDisabled={page <= 1}>Předchozí</Button>\n <Button onClick={() => setPage((p) => Math.min(totalPages, p + 1))} isDisabled={page >= totalPages}>Další</Button>\n </HStack>\n\n {/* Create/Edit Modal (90% viewport) */}\n <Modal isOpen={isOpen} onClose={closeModal} size=\"xl\" isCentered>\n <ModalOverlay />\n <ModalContent maxW=\"90vw\" maxH=\"90vh\">\n <ModalHeader>\n <HStack justify=\"space-between\" align=\"center\" w=\"full\" pr={8}>\n <Text>{(editing as any)?.id ? 'Upravit článek' : 'Nový článek'}</Text>\n <SaveStatusIndicator status={saveStatus} lastSaved={lastSaved} />\n </HStack>\n </ModalHeader>\n <ModalCloseButton />\n <ModalBody maxH=\"calc(90vh - 120px)\" overflowY=\"auto\">\n <Tabs variant=\"enclosed\" colorScheme=\"blue\" isFitted index={activeTabIndex} onChange={(index) => setActiveTabIndex(index)} isLazy lazyBehavior=\"keepMounted\">\n <TabList>\n <Tab>AI</Tab>\n <Tab>Základní</Tab>\n <Tab>Obsah</Tab>\n <Tab>Média</Tab>\n <Tab>Anketa</Tab>\n </TabList>\n <TabPanels>\n {/* AI first */}\n <TabPanel>\n <Box borderWidth=\"1px\" borderRadius=\"md\" p={4} bg=\"blue.50\">\n <Heading as=\"h3\" size=\"sm\" mb={2}>✍️ AI: Rozviňte VÁŠ TEXT na článek</Heading>\n <Text fontSize=\"sm\" color=\"gray.700\" mb={3}>\n <strong>Napište svůj text</strong> s důležitými informacemi - fakta, jména, výsledky, události. \n AI váš text použije jako základ, přidá strukturu a pokud je text krátký, rozšíří ho o kontext a detaily \n kolem vašich informací. <strong>Čím více napíšete, tím méně AI přidává.</strong> Dlouhý text = jen formátování.\n </Text>\n <VStack align=\"stretch\" spacing={3}>\n <FormControl>\n <FormLabel fontWeight=\"bold\">Váš text (česky)</FormLabel>\n <AIPromptInput\n value={aiPrompt}\n onChange={setAiPrompt}\n onSubmit={(_, modelId) => {\n setAiModelId(modelId);\n return aiMut.mutateAsync();\n }}\n isSubmitting={aiMut.isLoading}\n placeholder={\"Napište svůj text s důležitými informacemi. Příklad: Dnes naše mužstvo zvládlo důležitý zápas proti TJ Sokol Příbram...\"}\n helperText={\"Krátký text AI rozšíří, dlouhý text hlavně naformátuje do HTML.\"}\n />\n </FormControl>\n <HStack>\n <FormControl>\n <FormLabel>Publikum</FormLabel>\n <Input value={aiAudience} onChange={(e) => setAiAudience(e.target.value)} bg={inputBg} />\n </FormControl>\n <FormControl w=\"180px\">\n <FormLabel>Min. slov</FormLabel>\n <Input\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"500\"\n value={aiMinWordsInput}\n onChange={(e) => {\n const v = e.target.value;\n const digits = v.replace(/[^0-9]/g, '');\n setAiMinWordsInput(digits);\n }}\n onBlur={() => {\n const n = parseInt(String(aiMinWordsInput || '').trim(), 10);\n if (!isNaN(n) && Number.isFinite(n) && n > 0) {\n setAiMinWords(n);\n setAiMinWordsInput(String(n));\n } else {\n // Reset to last valid numeric value\n setAiMinWordsInput(String(aiMinWords || 500));\n }\n }}\n bg={inputBg}\n />\n </FormControl>\n </HStack>\n <HStack>\n <Button size=\"md\" colorScheme=\"purple\" onClick={() => aiMut.mutateAsync()} isDisabled={aiMut.isLoading || !aiPrompt.trim()}>\n Rozvinout text na článek\n </Button>\n <Box fontSize=\"sm\" color=\"gray.600\">AI zachová váš text a rozšíří ho pokud je krátký, přidá strukturu a vygeneruje název.</Box>\n </HStack>\n </VStack>\n </Box>\n </TabPanel>\n\n {/* Základní second (includes match linking) */}\n <TabPanel>\n <VStack align=\"stretch\" spacing={4}>\n <FormControl isRequired>\n <FormLabel fontWeight=\"bold\">Název článku</FormLabel>\n <Input \n value={editing?.title || ''} \n onChange={(e) => handleTitleChange(e.target.value)} \n placeholder=\"Zadejte název článku\"\n size=\"lg\"\n />\n </FormControl>\n <FormControl>\n <FormLabel>URL adresa (slug)</FormLabel>\n <Input \n placeholder=\"moje-clanek-slug\" \n value={(editing as any)?.slug || ''} \n onChange={(e) => handleSlugChange(e.target.value)} \n />\n <FormHelperText>Automaticky generováno z názvu článku</FormHelperText>\n </FormControl>\n <FormControl>\n <FormLabel fontWeight=\"bold\">Kategorie (soutěž)</FormLabel>\n <Select\n placeholder=\"Vyberte kategorii (volitelné)\"\n value={(editing as any)?.category_name || ''}\n onChange={(e) => setEditing((prev) => ({ ...(prev as any), category_name: e.target.value }))}\n size=\"lg\"\n >\n {competitions.map((c, idx) => (\n <option key={(c.code || c.name) + '_' + idx} value={(c.code && aliasesMap[c.code]) ? aliasesMap[c.code] : c.name}>\n {(c.code && aliasesMap[c.code]) ? aliasesMap[c.code] : c.name}\n </option>\n ))}\n </Select>\n <FormHelperText>Kategorie určuje, ve které sekci se článek zobrazí (volitelné)</FormHelperText>\n </FormControl>\n \n {/* Blog Translation */}\n {editing?.title && editing?.content && (\n <BlogTranslator\n title={editing.title}\n content={editing.content}\n onTranslationComplete={(translatedTitle, translatedContent) => {\n setEditing((prev) => ({\n ...(prev as any),\n title: translatedTitle,\n content: translatedContent,\n slug: makeSlug(translatedTitle),\n }));\n toast({\n title: 'Článek přeložen',\n description: 'Článek byl úspěšně přeložen a uložen do formuláře.',\n status: 'success',\n duration: 3000,\n });\n }}\n />\n )}\n \n {/* Featured toggle - prominent display */}\n <Box \n borderWidth=\"2px\" \n borderRadius=\"lg\" \n p={4} \n bg={useColorModeValue('orange.50', 'orange.900')} \n borderColor={useColorModeValue('orange.300', 'orange.600')}\n >\n <FormControl display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n <Box>\n <FormLabel mb=\"1\" fontSize=\"lg\" fontWeight=\"bold\">⭐ Primární na úvodní stránce</FormLabel>\n <Text fontSize=\"sm\" color={useColorModeValue('gray.600', 'gray.400')}>Zvýrazní článek jako hlavní příspěvek na domovské stránce</Text>\n <Text fontSize=\"xs\" color={useColorModeValue('gray.600', 'gray.400')} mt={1}>\n Maximálně 3 články mohou být primární. Pokud vyberete další, nejstarší primární se automaticky zruší.\n </Text>\n </Box>\n <Switch\n size=\"lg\"\n isChecked={!!(editing as any)?.featured}\n isDisabled={featSwitchLoading}\n onChange={(e) => handleFeaturedToggle(e.target.checked)}\n />\n </FormControl>\n </Box>\n\n {/* Propojení se zápasem (vylepšený visual picker) */}\n <Box borderWidth=\"1px\" borderRadius=\"lg\" p={4} bg={useColorModeValue('blue.50', 'blue.900')} borderColor=\"blue.200\">\n <HStack justify=\"space-between\" mb={3}>\n <Heading as=\"h3\" size=\"sm\">⚽ Propojit se zápasem (volitelné)</Heading>\n {linkedMatchId && <Badge colorScheme=\"green\">Propojeno</Badge>}\n </HStack>\n <VStack align=\"stretch\" spacing={3}>\n {!(editing as any)?.category_name && (\n <Text fontSize=\"sm\" color=\"orange.600\" fontWeight=\"bold\">\n ⚠️ Nejprve vyberte kategorii výše pro zobrazení relevantních zápasů\n </Text>\n )}\n <FormControl isDisabled={!((editing as any)?.category_name)}>\n <FormLabel fontSize=\"sm\">Rychlé vyhledávání</FormLabel>\n <HStack spacing={2}>\n <Input \n placeholder=\"Hledat zápas (tým, soupeř...)\" \n value={matchSearch} \n onChange={(e)=> setMatchSearch(e.target.value)}\n bg={inputBg}\n size=\"sm\"\n />\n <Input \n type=\"date\" \n value={matchDateFilter}\n onChange={(e)=> setMatchDateFilter(e.target.value)}\n bg={inputBg}\n size=\"sm\"\n w=\"160px\"\n />\n </HStack>\n </FormControl>\n \n {/* Calendar-style match picker */}\n <Box>\n <HStack justify=\"space-between\" mb={2}>\n <Text fontSize=\"sm\" fontWeight=\"medium\" mb={0}>Vyberte zápas ({filteredMatchOptions.length})</Text>\n {linkedMatchId && (editing as any)?.id && (\n <Button size=\"xs\" variant=\"ghost\" colorScheme=\"red\" onClick={async()=>{\n try {\n await deleteArticleMatchLink((editing as any).id);\n setLinkedMatchId(''); \n setMatchIdInput('');\n setTempMatchLink('');\n toast({ title: 'Propojení zrušeno', status: 'success' });\n } catch(e:any) {\n toast({ title: 'Zrušení selhalo', description: e?.response?.data?.error || e?.message, status: 'error' });\n }\n }}>Zrušit propojení</Button>\n )}\n </HStack>\n \n <Box \n maxH=\"400px\" \n overflowY=\"auto\" \n bg={useColorModeValue('white', 'gray.800')}\n borderRadius=\"md\"\n borderWidth=\"1px\"\n p={2}\n >\n {filteredMatchOptions.length === 0 && (\n <Text fontSize=\"sm\" color=\"gray.500\" textAlign=\"center\" py={4}>\n Žádné zápasy pro vybranou kategorii\n </Text>\n )}\n <VStack spacing={2} align=\"stretch\">\n {filteredMatchOptions.slice(0, 100).map((match) => {\n const matchId = String(match.id || '');\n const isPersisted = linkedMatchId === matchId;\n const isTempSelected = matchIdInput === matchId && !isPersisted;\n const isSelected = isPersisted || isTempSelected;\n const matchDate = new Date(match.date || '');\n const isValidDate = !isNaN(matchDate.getTime());\n const dateStr = isValidDate ? matchDate.toLocaleDateString('cs-CZ', { \n day: 'numeric', \n month: 'short',\n year: 'numeric'\n }) : (match.date || 'N/A');\n const timeStr = isValidDate ? matchDate.toLocaleTimeString('cs-CZ', { \n hour: '2-digit', \n minute: '2-digit' \n }) : '';\n \n // Use match data directly\n const home = match.home || '';\n const away = match.away || '';\n const score = match.score || 'vs';\n const hasScore = score !== 'vs';\n const teams = `${home} ${score} ${away}`.trim();\n \n return (\n <Box\n key={match.id}\n p={3}\n borderWidth=\"2px\"\n borderRadius=\"md\"\n borderColor={isPersisted ? 'green.500' : (isTempSelected ? 'blue.500' : 'gray.200')}\n bg={isSelected ? matchBgSelected : matchBgDefault}\n cursor=\"pointer\"\n _hover={{ borderColor: isPersisted ? 'green.400' : 'blue.300', bg: matchHoverBg }}\n transition=\"all 0.2s\"\n onClick={async () => {\n const val = matchId;\n setMatchIdInput(val);\n setTempMatchLink(val);\n // Save immediately when an article already exists\n if (val && (editing as any)?.id) {\n try {\n const resp = await putArticleMatchLink((editing as any).id, { external_match_id: String(val).trim(), title: (editing as any)?.title || '' });\n setLinkedMatchId(resp.external_match_id || String(val).trim());\n toast({ title: 'Propojeno se zápasem', status: 'success', duration: 2000 });\n } catch (err: any) {\n toast({ title: 'Propojení selhalo', description: err?.response?.data?.error || err?.message, status: 'error' });\n }\n } else if (val && !(editing as any)?.id) {\n toast({ title: 'Propojení bude uloženo po vytvoření článku', status: 'info', duration: 2000 });\n }\n }}\n >\n <HStack justify=\"space-between\" spacing={3}>\n <VStack align=\"start\" spacing={1} flex={1}>\n <HStack spacing={2}>\n <Badge colorScheme={hasScore ? 'green' : 'gray'} fontSize=\"xs\">\n {dateStr}\n </Badge>\n <Badge colorScheme=\"blue\" fontSize=\"xs\">\n {timeStr}\n </Badge>\n </HStack>\n <Text fontSize=\"sm\" fontWeight=\"bold\" noOfLines={1}>\n {teams}\n </Text>\n {match.competition && (\n <Text fontSize=\"xs\" color=\"gray.500\" noOfLines={1}>\n {match.competition}\n </Text>\n )}\n </VStack>\n {isPersisted && (\n <Badge colorScheme=\"green\" fontSize=\"xs\" p={2}>\n Již má článek\n </Badge>\n )}\n {!isPersisted && isTempSelected && (\n <Badge colorScheme=\"blue\" fontSize=\"xs\" p={2}>\n Vybráno\n </Badge>\n )}\n </HStack>\n </Box>\n );\n })}\n </VStack>\n </Box>\n {filteredMatchOptions.length > 100 && (\n <Text fontSize=\"xs\" color=\"gray.500\" mt={2}>\n Zobrazeno prvních 100 zápasů. Použijte vyhledávání pro zúžení výsledků.\n </Text>\n )}\n </Box>\n </VStack>\n </Box>\n </VStack>\n </TabPanel>\n\n {/* Obsah third */}\n <TabPanel>\n <FormControl>\n <FormLabel>Obsah</FormLabel>\n <HStack justify=\"space-between\" mb={2}>\n <Button \n size=\"sm\" \n colorScheme=\"purple\" \n leftIcon={<FiPlus />}\n onClick={onAlbumPickerOpen}\n >\n Vložit fotografie z alba\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n leftIcon={<FiSearch />}\n onClick={onExistingAlbumsOpen}\n >\n Vybrat z alba\n </Button>\n </HStack>\n {activeTabIndex === 2 && (\n <RichTextEditor\n value={editing?.content || ''}\n onChange={(val: string) => {\n setLastContentChangeAt(Date.now());\n setEditing((prev) => ({ ...(prev as any), content: val }));\n }}\n placeholder=\"Začněte psát obsah článku...\"\n height=\"60vh\"\n onImageUpload={uploadFile}\n toolbar=\"full\"\n />\n )}\n </FormControl>\n </TabPanel>\n\n {/* Média fourth */}\n <TabPanel>\n <VStack align=\"stretch\" spacing={4}>\n {/* Zonerama picker - Album link only */}\n <Box borderWidth=\"1px\" borderRadius=\"md\" p={3} bg=\"gray.50\">\n <Heading as=\"h3\" size=\"sm\" mb={2}>Zonerama výběr</Heading>\n <VStack align=\"stretch\" spacing={2}>\n <FormControl>\n <FormLabel>Odkaz na album Zonerama</FormLabel>\n <InputGroup>\n <InputLeftElement pointerEvents=\"none\">\n <Icon as={FiSearch} color=\"gray.400\" />\n </InputLeftElement>\n <Input \n placeholder=\"https://eu.zonerama.com/…\" \n value={zAlbumLink} \n onChange={(e) => setZAlbumLink(e.target.value)}\n bg={zAlbumPhotos.length > 0 ? albumLinkHasPhotosBg : undefined}\n />\n </InputGroup>\n <FormHelperText fontSize=\"xs\">\n {zAlbumPhotos.length > 0 \n ? `✓ Album načteno (${zAlbumPhotos.length} fotografií). Můžete vložit jiné album nebo vybrat fotky níže.`\n : 'Vložte odkaz na album, nebo album se automaticky načte při výběru fotografií v sekci Obsah.'}\n </FormHelperText>\n {(editing as any)?.gallery_album_url && zAlbumLink && (editing as any).gallery_album_url === zAlbumLink && (\n <Text fontSize=\"xs\" color=\"blue.600\" fontWeight=\"bold\" mt={1}>\n 🔗 Album propojeno s článkem (zobrazeno v sekci Obsah)\n </Text>\n )}\n </FormControl>\n <HStack>\n <Button size=\"sm\" onClick={fetchAlbumByLink} isLoading={zLoading}>Načíst album</Button>\n <Button size=\"sm\" colorScheme=\"purple\" onClick={onGalleryPickerOpen}>Vybrat z galerie</Button>\n {zAlbumLink ? (\n <Button size=\"sm\" as=\"a\" href={zAlbumLink} target=\"_blank\" rel=\"noopener noreferrer\" rightIcon={<FiExternalLink />}>Otevřít album</Button>\n ) : null}\n </HStack>\n {zLoading && zAlbumPhotos.length === 0 && (\n <HStack spacing={2} color=\"gray.600\" mt={2}>\n <Spinner size=\"sm\" />\n <Text>Album se načítá…</Text>\n </HStack>\n )}\n {!zLoading && zAlbumPhotos.length === 0 && zAlbumLink && (\n <Text fontSize=\"sm\" color=\"gray.500\" mt={2}>Zadejte odkaz na Zonerama album a klikněte na \"Načíst album\"</Text>\n )}\n {zAlbumPhotos.length > 0 && (\n <>\n <SimpleGrid columns={{ base: 3, md: 6 }} spacing={2} mt={2}>\n {zAlbumPhotos.slice(0, zVisibleCount).map((p) => (\n <Box key={p.id} borderWidth=\"1px\" borderRadius=\"md\" overflow=\"hidden\" _hover={{ boxShadow: 'md' }} cursor=\"pointer\"\n onClick={() => pickZoneramaImage({ id: p.id, album_id: '', album_url: zAlbumLink, page_url: p.page_url, image_url: p.image_1500 || '', title: p.title })}\n >\n <Image src={p.image_1500 || ''} alt={p.id} w=\"100%\" h=\"100px\" objectFit=\"cover\" loading=\"lazy\" decoding=\"async\" />\n </Box>\n ))}\n </SimpleGrid>\n {zAlbumPhotos.length > zVisibleCount && (\n <HStack justify=\"center\" mt={2}>\n <Button size=\"sm\" onClick={() => setZVisibleCount((c) => c + 24)}>Načíst další</Button>\n </HStack>\n )}\n </>\n )}\n </VStack>\n </Box>\n\n {/* Titulní obrázek - Cover Image */}\n <FormControl>\n <FormLabel fontWeight=\"bold\">Titulní obrázek</FormLabel>\n <FormHelperText mb={2}>\n Vyberte obrázek ze Zonerama výše nebo nahrajte vlastní soubor.\n </FormHelperText>\n <VStack align=\"stretch\" spacing={3}>\n <UploadPanel\n label=\"Titulní obrázek\"\n description=\"Nahrajte nebo přetáhněte titulní obrázek článku.\"\n accept=\"image/*\"\n multiple={false}\n maxFiles={1}\n allowUrlImport\n urlPlaceholder=\"/uploads/... nebo https://example.com/obrazek.jpg\"\n onChange={(files) => {\n const last = files[files.length - 1];\n setEditing((prev) => ({\n ...(prev as any),\n image_url: last?.url || (prev as any)?.image_url || '',\n }));\n }}\n />\n <HStack>\n <Image\n src={assetUrl(editing?.image_url) || '/dist/img/logo-club-empty.svg'}\n alt=\"cover\"\n boxSize=\"80px\"\n objectFit=\"cover\"\n borderRadius=\"md\"\n />\n {editing?.image_url && (\n <Text fontSize=\"sm\" color=\"gray.500\" noOfLines={1}>\n {editing.image_url}\n </Text>\n )}\n </HStack>\n <HStack justify=\"space-between\">\n <Text fontSize=\"xs\" color=\"gray.500\">\n Pokud necháte obrázek prázdný, může být při uložení článku vygenerován automaticky.\n </Text>\n <Button\n size=\"xs\"\n variant=\"outline\"\n colorScheme=\"purple\"\n onClick={handleGenerateMainImage}\n isLoading={mainImageLoading}\n >\n Vygenerovat titulní obrázek (Grok)\n </Button>\n </HStack>\n </VStack>\n </FormControl>\n\n {/* YouTube video attachment */}\n <Box borderWidth=\"1px\" borderRadius=\"md\" p={3} bg=\"gray.50\">\n <HStack justify=\"space-between\" align=\"center\" mb={2}>\n <Heading as=\"h3\" size=\"sm\" display=\"flex\" alignItems=\"center\" gap={2}>\n <Icon as={FiVideo} />\n YouTube video k článku\n </Heading>\n <Button size=\"sm\" variant=\"outline\" leftIcon={<FiVideo />} onClick={onYouTubeModalOpen}>\n Vybrat z kanálu\n </Button>\n </HStack>\n\n <VStack align=\"stretch\" spacing={3}>\n <FormControl>\n <FormLabel fontSize=\"sm\">Přidat ručně (ID nebo odkaz)</FormLabel>\n <HStack>\n <Input\n placeholder=\"https://www.youtube.com/watch?v=...\"\n value={youtubeManualInput}\n onChange={(e) => setYoutubeManualInput(e.target.value)}\n bg={inputBg}\n />\n <Button size=\"sm\" colorScheme=\"blue\" onClick={handleManualYoutubeSubmit}>\n Přidat\n </Button>\n </HStack>\n <FormHelperText fontSize=\"xs\">Podporujeme plné URL, zkrácené odkazy i ID videa.</FormHelperText>\n </FormControl>\n\n {(editing as any)?.youtube_video_id ? (\n <Box borderWidth=\"1px\" borderRadius=\"md\" p={3} bg={inputBg}>\n <HStack align=\"start\" spacing={3}>\n <AspectRatio ratio={16 / 9} w=\"160px\">\n <Image\n src={(editing as any)?.youtube_video_thumbnail || `https://i.ytimg.com/vi/${(editing as any)?.youtube_video_id}/hqdefault.jpg`}\n alt={(editing as any)?.youtube_video_title || 'YouTube thumbnail'}\n objectFit=\"cover\"\n borderRadius=\"md\"\n />\n </AspectRatio>\n <VStack align=\"stretch\" spacing={1} flex={1}>\n <Text fontWeight=\"semibold\">{(editing as any)?.youtube_video_title || 'YouTube video'}</Text>\n <Link href={(editing as any)?.youtube_video_url} isExternal color=\"blue.500\">\n {(editing as any)?.youtube_video_url}\n </Link>\n <HStack spacing={2}>\n <Badge colorScheme=\"red\">ID: {(editing as any)?.youtube_video_id}</Badge>\n </HStack>\n </VStack>\n <IconButton\n aria-label=\"Odebrat video\"\n icon={<FiX />}\n size=\"sm\"\n onClick={handleClearYoutubeVideo}\n />\n </HStack>\n </Box>\n ) : (\n <Text fontSize=\"sm\" color=\"gray.600\">Žádné video není připojeno. Vyberte video z kanálu nebo vložte odkaz.</Text>\n )}\n </VStack>\n </Box>\n\n \n\n {/* File Attachments */}\n <FormControl>\n <FormLabel fontWeight=\"bold\">Přílohy</FormLabel>\n <FormHelperText mb={2}>\n Přidejte dokumenty, obrázky nebo jiné soubory k článku (PDF, Word, Excel, PowerPoint, obrázky, ZIP)\n </FormHelperText>\n <UploadPanel\n label=\"Přílohy k článku\"\n description=\"Nahrajte dokumenty, obrázky nebo archivy jako přílohy k článku.\"\n accept=\".pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.jpg,.jpeg,.png,.gif,.webp,.txt,.zip,.rar\"\n multiple\n maxFiles={30}\n uploadFn={uploadAttachmentFile}\n onUploadFinished={(uploaded) => {\n if (!uploaded || uploaded.length === 0) return;\n setEditing((prev) => {\n const prevAtts = Array.isArray((prev as any)?.attachments)\n ? (prev as any).attachments\n : [];\n const mapped = uploaded.map((f) => ({\n name: f.name,\n url: f.url,\n mime_type: f.type,\n size: f.size,\n }));\n return {\n ...(prev as any),\n attachments: [...prevAtts, ...mapped],\n };\n });\n }}\n />\n <Box mt={2}>\n {Array.isArray((editing as any)?.attachments) && (editing as any).attachments.length > 0 ? (\n <Table size=\"sm\" variant=\"simple\">\n <Thead>\n <Tr>\n <Th>Název</Th>\n <Th>Velikost</Th>\n <Th>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {((editing as any).attachments as any[]).map((att: any, idx: number) => (\n <Tr key={idx}>\n <Td colSpan={3} p={2}>\n <HStack justify=\"space-between\" w=\"full\">\n <Box flex={1}>\n <FilePreview \n url={att.url}\n name={att.name}\n mimeType={att.mime_type}\n size={att.size}\n />\n </Box>\n <Button \n size=\"xs\" \n variant=\"outline\" \n colorScheme=\"red\"\n flexShrink={0}\n ml={2}\n onClick={() => setEditing(prev => ({ \n ...(prev as any), \n attachments: ((prev as any).attachments || []).filter((_: any, i: number) => i !== idx) \n }))}\n >\n Odebrat\n </Button>\n </HStack>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n ) : (\n <Box color=\"gray.500\" fontSize=\"sm\">Žádné přílohy</Box>\n )}\n </Box>\n </FormControl>\n\n </VStack>\n </TabPanel>\n\n {/* Anketa (Poll) Tab */}\n <TabPanel>\n <VStack align=\"stretch\" spacing={4}>\n <Box borderWidth=\"1px\" borderRadius=\"md\" p={4} bg={useColorModeValue('purple.50', 'purple.900')}>\n <Heading as=\"h3\" size=\"sm\" mb={2}>📊 Ankety k článku</Heading>\n <Text fontSize=\"sm\" color=\"gray.700\" mb={3}>\n Vytvořte nebo připojte ankety přímo k tomuto článku. Ankety se zobrazí automaticky na konci článku a čtenáři mohou hlasovat.\n </Text>\n </Box>\n\n {isAdmin && editing?.id ? (\n <PollLinker articleId={editing.id} onPollsChanged={() => {\n // Invalidate queries to refresh polls\n qc.invalidateQueries({ queryKey: ['linked-polls'] });\n }} />\n ) : (\n <Alert status=\"info\" borderRadius=\"md\">\n <AlertIcon />\n <VStack align=\"start\" spacing={2}>\n <Text fontWeight=\"semibold\">\n {saveStatus === 'saving' ? 'Ukládání článku...' : 'Článek se ukládá automaticky'}\n </Text>\n <Text fontSize=\"sm\">\n Začněte psát článek na záložkách výše. Systém automaticky ukládá každou změnu jako koncept. Jakmile bude článek uložen (v záhlaví se zobrazí \"Uloženo\"), budete moci přidat ankety.\n </Text>\n {saveStatus === 'saving' && <Spinner size=\"sm\" color=\"blue.500\" />}\n {saveStatus === 'idle' && (\n <Text fontSize=\"xs\" color=\"gray.600\">\n 💡 Vyplňte název článku pro aktivaci automatického ukládání\n </Text>\n )}\n <Button\n size=\"sm\"\n colorScheme=\"blue\"\n onClick={async () => {\n // Force save if needed\n try {\n await forceSave();\n // Switch to poll tab after save\n setActiveTabIndex(4); // Poll tab is index 4 after reordering\n } catch (error) {\n // Error is handled by onSubmit\n }\n }}\n isLoading={createMut.isLoading}\n >\n Uložit jako koncept a přidat ankety\n </Button>\n </VStack>\n </Alert>\n )}\n </VStack>\n </TabPanel>\n\n </TabPanels>\n </Tabs>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" onClick={closeModal}>Zrušit</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n {/* Album Photo Picker Modal */}\n <AlbumPhotoPicker\n isOpen={isAlbumPickerOpen}\n onClose={onAlbumPickerClose}\n onPhotosSelected={handleAlbumPhotosSelected}\n />\n\n \n <Modal isOpen={isExistingAlbumsOpen} onClose={() => { setExistingSelectedAlbum(null); setExistingSelectedPhotos(new Set()); setExistingVisibleCount(60); onExistingAlbumsClose(); }} size=\"6xl\" scrollBehavior=\"inside\">\n <ModalOverlay />\n <ModalContent maxH=\"90vh\" display=\"flex\" flexDirection=\"column\">\n <ModalHeader borderBottom=\"1px solid\" borderColor={useColorModeValue('gray.200', 'gray.700')}>Vybrat z existujících alb</ModalHeader>\n <ModalCloseButton />\n <ModalBody flex=\"1\" overflowY=\"auto\" py={6} px={6}>\n <VStack align=\"stretch\" spacing={4}>\n {!existingSelectedAlbum && (\n <>\n {galleryLoading && (\n <HStack spacing={2} justify=\"center\" py={8}>\n <Spinner size=\"lg\" color=\"purple.500\" />\n <Text color=\"gray.600\">Načítám alba z galerie...</Text>\n </HStack>\n )}\n {!galleryLoading && cachedAlbums.length > 0 && (\n <VStack align=\"stretch\" spacing={6}>\n {cachedAlbums.map((album) => (\n <Box \n key={album.id} \n borderWidth=\"1px\" \n borderRadius=\"md\" \n p={4} \n bg={albumCardBg}\n cursor=\"pointer\"\n onClick={() => { setExistingSelectedAlbum(album); setExistingSelectedPhotos(new Set()); setExistingVisibleCount(60); }}\n transition=\"all 0.2s\"\n _hover={{ transform: 'scale(1.02)', boxShadow: 'md' }}\n >\n <HStack justify=\"space-between\" mb={3}>\n <VStack align=\"start\" spacing={0}>\n <Text fontWeight=\"bold\" fontSize=\"lg\">{album.title || 'Album bez názvu'}</Text>\n <Text fontSize=\"sm\" color=\"gray.500\">{album.date} • {(album.photos?.length || 0)} fotografií</Text>\n </VStack>\n <Icon as={FiExternalLink} color=\"purple.500\" boxSize={5} />\n </HStack>\n <SimpleGrid columns={{ base: 6, md: 10 }} spacing={2}>\n {(album.photos || []).slice(0, 20).map((photo) => (\n <AspectRatio key={photo.id} ratio={1}>\n <Image src={photo.image_1500} alt={photo.id} objectFit=\"cover\" loading=\"lazy\" decoding=\"async\" />\n </AspectRatio>\n ))}\n </SimpleGrid>\n </Box>\n ))}\n </VStack>\n )}\n {!galleryLoading && cachedAlbums.length === 0 && (\n <VStack py={8} spacing={3}>\n <Icon as={FiSearch} boxSize={12} color=\"gray.400\" />\n <Text color=\"gray.600\" textAlign=\"center\">Žádná alba nebyla nalezena v cache.</Text>\n <Button size=\"sm\" onClick={fetchCachedGallery} leftIcon={<FiRefreshCcw />}>Obnovit seznam</Button>\n </VStack>\n )}\n </>\n )}\n\n {existingSelectedAlbum && (\n <VStack align=\"stretch\" spacing={3}>\n <HStack justify=\"space-between\">\n <Button size=\"sm\" variant=\"ghost\" onClick={() => { setExistingSelectedAlbum(null); setExistingSelectedPhotos(new Set()); setExistingVisibleCount(60); }}>← Zpět na seznam alb</Button>\n <Checkbox\n isChecked={existingSelectedAlbum ? existingSelectedPhotos.size === (existingSelectedAlbum.photos?.length || 0) : false}\n isIndeterminate={existingSelectedAlbum ? (existingSelectedPhotos.size > 0 && existingSelectedPhotos.size < (existingSelectedAlbum.photos?.length || 0)) : false}\n onChange={() => {\n if (!existingSelectedAlbum) return;\n if (existingSelectedPhotos.size === (existingSelectedAlbum.photos?.length || 0)) {\n setExistingSelectedPhotos(new Set());\n } else {\n setExistingSelectedPhotos(new Set((existingSelectedAlbum.photos || []).map(p => p.id)));\n }\n }}\n >\n Vybrat vše ({existingSelectedPhotos.size}/{existingSelectedAlbum ? (existingSelectedAlbum.photos?.length || 0) : 0})\n </Checkbox>\n </HStack>\n <SimpleGrid columns={{ base: 3, md: 4, lg: 5 }} spacing={3}>\n {(existingSelectedAlbum?.photos || []).slice(0, existingVisibleCount).map((photo) => {\n const checked = existingSelectedPhotos.has(photo.id);\n return (\n <Box\n key={photo.id}\n position=\"relative\"\n cursor=\"pointer\"\n onClick={() => {\n const next = new Set(existingSelectedPhotos);\n if (next.has(photo.id)) next.delete(photo.id); else next.add(photo.id);\n setExistingSelectedPhotos(next);\n }}\n borderRadius=\"md\"\n overflow=\"hidden\"\n borderWidth=\"2px\"\n borderColor={checked ? 'purple.500' : 'transparent'}\n transition=\"all 0.2s\"\n _hover={{ transform: 'scale(1.05)' }}\n >\n <Image src={photo.image_1500} alt={photo.id} w=\"100%\" h=\"150px\" objectFit=\"cover\" loading=\"lazy\" decoding=\"async\" />\n <Checkbox position=\"absolute\" top={2} right={2} isChecked={checked} pointerEvents=\"none\" bg=\"white\" borderRadius=\"sm\" />\n </Box>\n );\n })}\n </SimpleGrid>\n {(existingSelectedAlbum?.photos?.length || 0) > existingVisibleCount && (\n <HStack justify=\"center\" pt={2}>\n <Button size=\"sm\" onClick={() => setExistingVisibleCount(c => c + 60)}>Načíst další</Button>\n </HStack>\n )}\n </VStack>\n )}\n </VStack>\n </ModalBody>\n <ModalFooter>\n <HStack spacing={3}>\n <Button variant=\"ghost\" onClick={() => { setExistingSelectedAlbum(null); setExistingSelectedPhotos(new Set()); onExistingAlbumsClose(); }}>Zrušit</Button>\n <Button\n colorScheme=\"purple\"\n onClick={() => {\n if (!existingSelectedAlbum || existingSelectedPhotos.size === 0) return;\n const photos = (existingSelectedAlbum.photos || []).filter(p => existingSelectedPhotos.has(p.id));\n handleAlbumPhotosSelected(photos as any, {\n id: existingSelectedAlbum.id,\n title: existingSelectedAlbum.title || '',\n url: '', // already cached; skip saveAlbumToCache\n date: existingSelectedAlbum.date,\n photos_count: (existingSelectedAlbum.photos?.length || 0),\n photos: (existingSelectedAlbum.photos || []),\n });\n setExistingSelectedAlbum(null);\n setExistingSelectedPhotos(new Set());\n onExistingAlbumsClose();\n }}\n isDisabled={!existingSelectedAlbum || existingSelectedPhotos.size === 0}\n >\n Vložit vybrané ({existingSelectedPhotos.size || 0})\n </Button>\n </HStack>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n {/* YouTube Video Picker Modal */}\n <Modal isOpen={isYouTubeModalOpen} onClose={onYouTubeModalClose} size=\"6xl\">\n <ModalOverlay />\n <ModalContent maxH=\"90vh\">\n <ModalHeader>Vybrat video z YouTube kanálu</ModalHeader>\n <ModalCloseButton />\n <ModalBody overflowY=\"auto\">\n <VStack align=\"stretch\" spacing={4}>\n {/* Search Input */}\n <FormControl>\n <FormLabel>Vyhledat video</FormLabel>\n <InputGroup>\n <InputLeftElement pointerEvents=\"none\">\n <Icon as={FiSearch} color=\"gray.400\" />\n </InputLeftElement>\n <Input\n placeholder=\"Název videa nebo ID...\"\n value={youtubeSearch}\n onChange={(e) => setYoutubeSearch(e.target.value)}\n />\n </InputGroup>\n </FormControl>\n\n {/* Loading State */}\n {youtubeLoading && (\n <HStack spacing={2} justify=\"center\" py={8}>\n <Spinner size=\"lg\" color=\"blue.500\" />\n <Text color=\"gray.600\">Načítám videa z kanálu...</Text>\n </HStack>\n )}\n\n {/* Videos Grid */}\n {!youtubeLoading && filteredYoutubeVideos.length > 0 && (\n <SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} spacing={4}>\n {filteredYoutubeVideos.map((video) => (\n <Box\n key={video.video_id}\n borderWidth=\"1px\"\n borderRadius=\"md\"\n overflow=\"hidden\"\n cursor=\"pointer\"\n transition=\"all 0.2s\"\n _hover={{ boxShadow: 'lg', transform: 'scale(1.02)' }}\n onClick={() => handleSelectYoutubeVideo(video)}\n >\n <AspectRatio ratio={16 / 9}>\n <Image\n src={video.thumbnail_url}\n alt={video.title}\n objectFit=\"cover\"\n />\n </AspectRatio>\n <Box p={3}>\n <Text fontWeight=\"semibold\" fontSize=\"sm\" noOfLines={2}>\n {video.title}\n </Text>\n {video.published_date && (\n <Text fontSize=\"xs\" color=\"gray.500\" mt={1}>\n {new Date(video.published_date).toLocaleDateString('cs-CZ')}\n </Text>\n )}\n </Box>\n </Box>\n ))}\n </SimpleGrid>\n )}\n\n {/* Empty State */}\n {!youtubeLoading && filteredYoutubeVideos.length === 0 && youtubeVideos.length === 0 && (\n <VStack py={8} spacing={3}>\n <Icon as={FiVideo} boxSize={12} color=\"gray.400\" />\n <Text color=\"gray.600\" textAlign=\"center\">\n Žádná videa nebyla nalezena.\n </Text>\n <Text fontSize=\"sm\" color=\"gray.500\" textAlign=\"center\">\n Zkontrolujte nastavení YouTube kanálu v administraci.\n </Text>\n <Button size=\"sm\" onClick={fetchYouTubeVideos} leftIcon={<FiRefreshCcw />}>\n Obnovit seznam\n </Button>\n </VStack>\n )}\n\n {/* No Results for Search */}\n {!youtubeLoading && filteredYoutubeVideos.length === 0 && youtubeVideos.length > 0 && (\n <VStack py={8}>\n <Text color=\"gray.600\">Žádná videa neodpovídají vašemu hledání.</Text>\n <Button size=\"sm\" variant=\"link\" onClick={() => setYoutubeSearch('')}>\n Zobrazit všechna videa\n </Button>\n </VStack>\n )}\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" onClick={onYouTubeModalClose}>\n Zavřít\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n {/* Zonerama Gallery Picker Modal */}\n <Modal isOpen={isGalleryPickerOpen} onClose={onGalleryPickerClose} size=\"6xl\" scrollBehavior=\"inside\">\n <ModalOverlay />\n <ModalContent maxH=\"90vh\">\n <ModalHeader>Vybrat fotku z galerie</ModalHeader>\n <ModalCloseButton />\n <ModalBody overflowY=\"auto\">\n <VStack align=\"stretch\" spacing={4}>\n {/* Loading State */}\n {galleryLoading && (\n <HStack spacing={2} justify=\"center\" py={8}>\n <Spinner size=\"lg\" color=\"purple.500\" />\n <Text color=\"gray.600\">Načítám alba z galerie...</Text>\n </HStack>\n )}\n\n {/* Albums Grid */}\n {!galleryLoading && cachedAlbums.length > 0 && (\n <VStack align=\"stretch\" spacing={6}>\n {cachedAlbums.map((album) => {\n const isExpanded = galleryExpandedAlbumId === album.id;\n const photos = album.photos || [];\n return (\n <Box key={album.id} borderWidth=\"1px\" borderRadius=\"md\" p={4} bg={albumCardBg}>\n <HStack justify=\"space-between\" mb={3}>\n <VStack align=\"start\" spacing={0}>\n <Text fontWeight=\"bold\" fontSize=\"lg\">{album.title || 'Album bez názvu'}</Text>\n <Text fontSize=\"sm\" color=\"gray.500\">{album.date} • {photos.length} fotografií</Text>\n </VStack>\n <HStack spacing={2}>\n {photos.length > 0 && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n if (isExpanded) {\n setGalleryExpandedAlbumId(null);\n } else {\n setGalleryExpandedAlbumId(album.id);\n setGalleryVisibleCount(48);\n }\n }}\n >\n {isExpanded ? 'Skrýt fotky' : 'Zobrazit fotky'}\n </Button>\n )}\n {(album as any).url && (\n <Button\n as=\"a\"\n size=\"sm\"\n href={(album as any).url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n leftIcon={<FiExternalLink />}\n variant=\"ghost\"\n >\n Otevřít album\n </Button>\n )}\n </HStack>\n </HStack>\n\n {isExpanded && photos.length > 0 && (\n <>\n <SimpleGrid columns={{ base: 3, md: 4, lg: 6 }} spacing={2}>\n {photos.slice(0, galleryVisibleCount).map((photo) => (\n <Box\n key={photo.id}\n borderWidth=\"1px\"\n borderRadius=\"md\"\n overflow=\"hidden\"\n cursor=\"pointer\"\n transition=\"all 0.2s\"\n _hover={{ boxShadow: 'lg', transform: 'scale(1.05)' }}\n onClick={() => {\n pickZoneramaImage({\n id: photo.id,\n album_id: album.id,\n album_url: (album as any).url || `https://eu.zonerama.com/Album/${album.id}`,\n page_url: photo.page_url,\n image_url: photo.image_1500,\n title: album.title\n });\n onGalleryPickerClose();\n }}\n >\n <AspectRatio ratio={1}>\n <Image\n src={photo.image_1500}\n alt={photo.id}\n objectFit=\"cover\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n </AspectRatio>\n </Box>\n ))}\n </SimpleGrid>\n {photos.length > galleryVisibleCount && (\n <HStack justify=\"center\" mt={2}>\n <Button size=\"sm\" onClick={() => setGalleryVisibleCount((c) => c + 48)}>Načíst další</Button>\n </HStack>\n )}\n </>\n )}\n </Box>\n );\n })}\n </VStack>\n )}\n\n {/* Empty State */}\n {!galleryLoading && cachedAlbums.length === 0 && (\n <VStack py={8} spacing={3}>\n <Icon as={FiSearch} boxSize={12} color=\"gray.400\" />\n <Text color=\"gray.600\" textAlign=\"center\">\n Žádná alba nebyla nalezena v cache.\n </Text>\n <Text fontSize=\"sm\" color=\"gray.500\" textAlign=\"center\">\n Zkontrolujte nastavení Zonerama nebo obnovte cache.\n </Text>\n <Button size=\"sm\" onClick={fetchCachedGallery} leftIcon={<FiRefreshCcw />}>\n Obnovit seznam\n </Button>\n </VStack>\n )}\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" onClick={onGalleryPickerClose}>\n Zavřít\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n \n <AILoadingModal\n isOpen={aiMut.isLoading}\n onClose={() => {}} // Can't close while AI is working\n title=\"AI generuje článek\"\n message=\"AI pracuje na rozvinutí vašeho textu do plnohodnotného článku...\"\n progress={aiProgress}\n estimatedTime={aiStartTime ? 25 : undefined} // 25 seconds estimated\n />\n </Box>\n </AdminLayout>\n );\n};\n\nexport default ArticlesAdminPage;\n","// Use a single canonical key for the auth token across the app\n// Many modules expect 'auth_token' (see usages in services and build artifacts).\nconst TOKEN_KEY = 'auth_token';\nconst HAS_ADMIN_KEY = 'fotbal_club_has_admin';\n\nexport const getToken = (): string | null => {\n // Read from localStorage first (remembered), then fall back to sessionStorage\n // Keep backward compatibility with code that may still use sessionStorage.\n try {\n return localStorage.getItem(TOKEN_KEY) ?? sessionStorage.getItem(TOKEN_KEY);\n } catch {\n return null;\n }\n};\n\nexport const setToken = (token: string, remember = true): void => {\n // Clear both first to avoid duplicates\n try { localStorage.removeItem(TOKEN_KEY); } catch {}\n try { sessionStorage.removeItem(TOKEN_KEY); } catch {}\n if (remember) {\n try { localStorage.setItem(TOKEN_KEY, token); } catch {}\n } else {\n try { sessionStorage.setItem(TOKEN_KEY, token); } catch {}\n }\n};\n\nexport const clearToken = (): void => {\n try { localStorage.removeItem(TOKEN_KEY); } catch {}\n try { sessionStorage.removeItem(TOKEN_KEY); } catch {}\n};\n\nexport const isAuthenticated = (): boolean => {\n return !!getToken();\n};\n\nexport const hasAdmin = (): boolean => {\n return localStorage.getItem(HAS_ADMIN_KEY) === 'true';\n};\n\nexport const setHasAdmin = (value: boolean): void => {\n localStorage.setItem(HAS_ADMIN_KEY, String(value));\n};\n\nexport const checkAdminExists = async (): Promise<boolean> => {\n try {\n // Use shared API base URL which is normalized to '/api/v1'\n const { API_URL } = await import('../services/api');\n const response = await fetch(`${API_URL}/auth/admin/exists`, {\n headers: { 'Accept': 'application/json' },\n });\n if (response.ok) {\n const data = await response.json();\n const exists = Boolean((data && (data.hasAdmin ?? data.has_admin)));\n setHasAdmin(exists);\n return exists;\n }\n return false;\n } catch (error) {\n console.error('Error checking admin status:', error);\n return false;\n }\n};\n","import React, { useMemo } from 'react';\nimport {\n Box,\n Text,\n HStack,\n VStack,\n Icon,\n Skeleton,\n Badge,\n useColorModeValue,\n Tooltip,\n Progress,\n Divider,\n SimpleGrid,\n} from '@chakra-ui/react';\nimport { useTranslation } from 'react-i18next';\nimport { useQuery } from '@tanstack/react-query';\nimport { \n FaCloud, \n FaCloudSun, \n FaSun, \n FaCloudRain, \n FaSnowflake, \n FaWind, \n FaTint, \n FaEye, \n FaThermometerHalf,\n FaExclamationTriangle,\n FaMoon,\n} from 'react-icons/fa';\nimport api from '../../services/api';\n\ninterface MatchWeatherData {\n weather: {\n location: {\n name: string;\n region: string;\n country: string;\n };\n current: {\n last_updated: string;\n temp_c: number;\n temp_f: number;\n is_day: number;\n condition: {\n text: string;\n icon: string;\n code: number;\n };\n wind_mph: number;\n wind_kph: number;\n wind_degree: number;\n wind_dir: string;\n pressure_mb: number;\n pressure_in: number;\n precip_mm: number;\n precip_in: number;\n humidity: number;\n cloud: number;\n feelslike_c: number;\n feelslike_f: number;\n vis_km: number;\n vis_miles: number;\n uv: number;\n gust_mph: number;\n gust_kph: number;\n };\n forecast: {\n forecastday: Array<{\n date: string;\n date_epoch: number;\n day: {\n maxtemp_c: number;\n maxtemp_f: number;\n mintemp_c: number;\n mintemp_f: number;\n avgtemp_c: number;\n avgtemp_f: number;\n maxwind_mph: number;\n maxwind_kph: number;\n totalprecip_mm: number;\n totalprecip_in: number;\n totalsnow_cm: number;\n avgvis_km: number;\n avgvis_miles: number;\n avghumidity: number;\n daily_will_it_rain: number;\n daily_chance_of_rain: number;\n daily_will_it_snow: number;\n daily_chance_of_snow: number;\n condition: {\n text: string;\n icon: string;\n code: number;\n };\n uv: number;\n };\n astro: {\n sunrise: string;\n sunset: string;\n moonrise: string;\n moonset: string;\n moon_phase: string;\n moon_illumination: number;\n is_moon_up: number;\n is_sun_up: number;\n };\n hour: Array<{\n time_epoch: number;\n time: string;\n temp_c: number;\n temp_f: number;\n is_day: number;\n condition: {\n text: string;\n icon: string;\n code: number;\n };\n wind_mph: number;\n wind_kph: number;\n wind_degree: number;\n wind_dir: string;\n pressure_mb: number;\n pressure_in: number;\n precip_mm: number;\n precip_in: number;\n humidity: number;\n cloud: number;\n feelslike_c: number;\n feelslike_f: number;\n windchill_c: number;\n windchill_f: number;\n heatindex_c: number;\n heatindex_f: number;\n dewpoint_c: number;\n dewpoint_f: number;\n will_it_rain: number;\n chance_of_rain: number;\n will_it_snow: number;\n chance_of_snow: number;\n vis_km: number;\n vis_miles: number;\n gust_mph: number;\n gust_kph: number;\n uv: number;\n }>;\n }>;\n };\n };\n match_time: string;\n closest_hour: {\n time_epoch: number;\n time: string;\n temp_c: number;\n temp_f: number;\n is_day: number;\n condition: {\n text: string;\n icon: string;\n code: number;\n };\n wind_mph: number;\n wind_kph: number;\n wind_degree: number;\n wind_dir: string;\n pressure_mb: number;\n pressure_in: number;\n precip_mm: number;\n precip_in: number;\n humidity: number;\n cloud: number;\n feelslike_c: number;\n feelslike_f: number;\n windchill_c: number;\n windchill_f: number;\n heatindex_c: number;\n heatindex_f: number;\n dewpoint_c: number;\n dewpoint_f: number;\n will_it_rain: number;\n chance_of_rain: number;\n will_it_snow: number;\n chance_of_snow: number;\n vis_km: number;\n vis_miles: number;\n gust_mph: number;\n gust_kph: number;\n uv: number;\n };\n}\n\ninterface MatchWeatherProps {\n matchDateTime: string;\n venue?: string;\n isHomeMatch: boolean;\n matchHasStarted: boolean;\n delayLoad?: boolean; // New prop to control when to load weather\n}\n\n// Czech and English translations\nconst translations = {\n cs: {\n weather: 'Počasí',\n forecast: 'Předpověď počasí',\n temperature: 'Teplota',\n feelsLike: 'Pocitově',\n wind: 'Vítr',\n humidity: 'Vlhkost',\n visibility: 'Viditelnost',\n pressure: 'Tlak',\n precipitation: 'Srážky',\n chanceOfRain: 'Šance na déšť',\n chanceOfSnow: 'Šance na sníh',\n atMatchTime: 'V čase zápasu',\n weatherUnavailable: 'Předpověď počasí není dostupná',\n forecastNotAvailable: 'Předpověď není dostupná pro tento zápas',\n tooFarInFuture: 'Zápas je příliš daleko v budoucnosti',\n matchInPast: 'Zápas již proběhl',\n loading: 'Načítám počasí...',\n },\n en: {\n weather: 'Weather',\n forecast: 'Weather Forecast',\n temperature: 'Temperature',\n feelsLike: 'Feels Like',\n wind: 'Wind',\n humidity: 'Humidity',\n visibility: 'Visibility',\n pressure: 'Pressure',\n precipitation: 'Precipitation',\n chanceOfRain: 'Rain Chance',\n chanceOfSnow: 'Snow Chance',\n atMatchTime: 'At Match Time',\n weatherUnavailable: 'Weather forecast unavailable',\n forecastNotAvailable: 'Forecast not available for this match',\n tooFarInFuture: 'Match is too far in the future',\n matchInPast: 'Match has already taken place',\n loading: 'Loading weather...',\n },\n};\n\nconst getWeatherIcon = (condition: string, isDay: number) => {\n const lowerCondition = condition.toLowerCase();\n \n if (lowerCondition.includes('sunny') || lowerCondition.includes('clear')) {\n return isDay ? FaSun : FaMoon;\n }\n if (lowerCondition.includes('partly cloudy') || lowerCondition.includes('partly sunny')) {\n return FaCloudSun;\n }\n if (lowerCondition.includes('cloudy') || lowerCondition.includes('overcast')) {\n return FaCloud;\n }\n if (lowerCondition.includes('rain') || lowerCondition.includes('drizzle') || lowerCondition.includes('shower')) {\n return FaCloudRain;\n }\n if (lowerCondition.includes('snow') || lowerCondition.includes('sleet') || lowerCondition.includes('blizzard')) {\n return FaSnowflake;\n }\n \n return FaCloud;\n};\n\nconst getWindDirection = (degree: number) => {\n const directions = ['S', 'SV', 'V', 'JV', 'J', 'JZ', 'Z', 'SZ'];\n const index = Math.round(degree / 45) % 8;\n return directions[index];\n};\n\nexport const MatchWeather: React.FC<MatchWeatherProps> = ({ \n matchDateTime, \n venue, \n isHomeMatch, \n matchHasStarted,\n delayLoad = false\n}) => {\n const { i18n } = useTranslation();\n const t = translations[i18n.language as keyof typeof translations] || translations.cs;\n \n const bgCard = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const textColor = useColorModeValue('gray.600', 'gray.400');\n\n // Only show weather for home matches that haven't started yet\n if (!isHomeMatch || matchHasStarted) {\n return null;\n }\n\n const { data: weatherData, isLoading, error } = useQuery<MatchWeatherData>({\n queryKey: ['matchWeather', matchDateTime, venue],\n queryFn: async () => {\n const params = new URLSearchParams({\n match_datetime: matchDateTime,\n // Only pass location parameter if it's not a home match (home matches use club location)\n ...(venue && { location: venue }),\n });\n \n const response = await api.get(`/weather/match?${params}`);\n return response.data;\n },\n staleTime: 30 * 60 * 1000, // 30 minutes cache\n enabled: isHomeMatch && !matchHasStarted && !delayLoad, // Disable if delayLoad is true\n });\n\n if (isLoading) {\n return (\n <Box\n bg={bgCard}\n p={4}\n borderRadius=\"lg\"\n borderWidth=\"1px\"\n borderColor={borderColor}\n mt={4}\n >\n <VStack spacing={3} align=\"stretch\">\n <Text fontSize=\"sm\" fontWeight=\"bold\" color={textColor}>\n {t.weather}\n </Text>\n <Skeleton height=\"20px\" width=\"60%\" />\n <Skeleton height=\"16px\" width=\"40%\" />\n <Skeleton height=\"16px\" width=\"50%\" />\n </VStack>\n </Box>\n );\n }\n\n if (error || !weatherData) {\n // Check for specific error messages to provide better user feedback\n let errorMessage = t.weatherUnavailable;\n const errorString = String(error || '');\n if (errorString.includes('too far in the future')) {\n errorMessage = t.tooFarInFuture;\n } else if (errorString.includes('match is in the past')) {\n errorMessage = t.matchInPast;\n } else if (errorString.includes('no location specified')) {\n errorMessage = t.forecastNotAvailable;\n }\n\n return (\n <Box\n bg={bgCard}\n p={4}\n borderRadius=\"lg\"\n borderWidth=\"1px\"\n borderColor={borderColor}\n mt={4}\n >\n <VStack spacing={2} align=\"center\">\n <Icon as={FaExclamationTriangle} boxSize={6} color=\"orange.400\" />\n <Text fontSize=\"sm\" color=\"gray.500\" textAlign=\"center\">\n {errorMessage}\n </Text>\n </VStack>\n </Box>\n );\n }\n\n const { weather, closest_hour } = weatherData;\n const currentIcon = getWeatherIcon(weather.current.condition.text, weather.current.is_day);\n const matchIcon = getWeatherIcon(closest_hour.condition.text, closest_hour.is_day);\n\n return (\n <Box\n bg={bgCard}\n p={4}\n borderRadius=\"lg\"\n borderWidth=\"1px\"\n borderColor={borderColor}\n mt={4}\n >\n <VStack spacing={4} align=\"stretch\">\n {/* Header */}\n <HStack spacing={2} align=\"center\">\n <Icon as={FaCloud} boxSize={4} color=\"blue.500\" />\n <Text fontSize=\"sm\" fontWeight=\"bold\">\n {t.forecast}\n </Text>\n <Badge fontSize=\"xs\" colorScheme=\"blue\" variant=\"subtle\">\n {weather.location.name}\n </Badge>\n </HStack>\n\n <Divider />\n\n {/* Current Weather */}\n <HStack spacing={3} align=\"center\">\n <Icon as={currentIcon} boxSize={8} color=\"blue.400\" />\n <VStack spacing={1} align=\"start\" flex={1}>\n <Text fontSize=\"lg\" fontWeight=\"bold\">\n {Math.round(weather.current.temp_c)}°C\n </Text>\n <Text fontSize=\"xs\" color={textColor}>\n {t.feelsLike} {Math.round(weather.current.feelslike_c)}°C\n </Text>\n </VStack>\n <VStack spacing={1} align=\"end\">\n <Text fontSize=\"xs\" color={textColor}>{weather.current.condition.text}</Text>\n {(closest_hour.will_it_rain > 0 || closest_hour.chance_of_rain > 0) && (\n <Badge size=\"xs\" colorScheme=\"blue\">\n {t.chanceOfRain}: {closest_hour.chance_of_rain}%\n </Badge>\n )}\n {(closest_hour.will_it_snow > 0 || closest_hour.chance_of_snow > 0) && (\n <Badge size=\"xs\" colorScheme=\"cyan\">\n {t.chanceOfSnow}: {closest_hour.chance_of_snow}%\n </Badge>\n )}\n </VStack>\n </HStack>\n\n {/* Weather at Match Time */}\n <Box>\n <Text fontSize=\"xs\" fontWeight=\"bold\" color={textColor} mb={2}>\n {t.atMatchTime}\n </Text>\n <HStack spacing={3} align=\"center\" bg={useColorModeValue('gray.50', 'gray.700')} p={3} borderRadius=\"md\">\n <Icon as={matchIcon} boxSize={6} color=\"blue.400\" />\n <VStack spacing={1} align=\"start\" flex={1}>\n <Text fontSize=\"md\" fontWeight=\"bold\">\n {Math.round(closest_hour.temp_c)}°C\n </Text>\n <Text fontSize=\"xs\" color={textColor}>\n {closest_hour.condition.text}\n </Text>\n </VStack>\n <HStack spacing={4} fontSize=\"xs\" color={textColor}>\n <HStack spacing={1}>\n <Icon as={FaWind} boxSize={3} />\n <Text>{closest_hour.wind_kph} km/h</Text>\n </HStack>\n <HStack spacing={1}>\n <Icon as={FaTint} boxSize={3} />\n <Text>{closest_hour.humidity}%</Text>\n </HStack>\n </HStack>\n </HStack>\n </Box>\n\n {/* Additional Details */}\n <SimpleGrid columns={2} spacing={2} fontSize=\"xs\">\n <HStack spacing={2}>\n <Icon as={FaWind} boxSize={3} color={textColor} />\n <Text color={textColor}>{t.wind}: {weather.current.wind_kph} km/h {getWindDirection(weather.current.wind_degree)}</Text>\n </HStack>\n <HStack spacing={2}>\n <Icon as={FaTint} boxSize={3} color={textColor} />\n <Text color={textColor}>{t.humidity}: {weather.current.humidity}%</Text>\n </HStack>\n <HStack spacing={2}>\n <Icon as={FaEye} boxSize={3} color={textColor} />\n <Text color={textColor}>{t.visibility}: {weather.current.vis_km} km</Text>\n </HStack>\n <HStack spacing={2}>\n <Icon as={FaThermometerHalf} boxSize={3} color={textColor} />\n <Text color={textColor}>{t.pressure}: {weather.current.pressure_mb} hPa</Text>\n </HStack>\n </SimpleGrid>\n </VStack>\n </Box>\n );\n};\n\nexport default MatchWeather;\n","import React, { useEffect, useMemo, useState } from 'react';\nimport {\n Box,\n Button,\n HStack,\n VStack,\n Text,\n SimpleGrid,\n Stack,\n Divider,\n useColorModeValue,\n Popover,\n PopoverTrigger,\n PopoverContent,\n PopoverArrow,\n PopoverBody,\n} from '@chakra-ui/react';\nimport { ChevronLeftIcon, ChevronRightIcon, CalendarIcon } from '@chakra-ui/icons';\nimport {\n addDays,\n addMonths,\n endOfMonth,\n endOfWeek,\n format,\n getDaysInMonth,\n isSameDay,\n isSameMonth,\n isWithinInterval,\n parseISO,\n startOfMonth,\n startOfWeek,\n subMonths,\n setYear,\n setMonth,\n} from 'date-fns';\nimport { cs } from 'date-fns/locale';\n\nexport type DateRangePickerProps = {\n from?: string;\n to?: string;\n onChange: (from: string, to: string) => void;\n size?: 'sm' | 'md';\n};\n\nfunction parseDate(value?: string | null): Date | null {\n if (!value) return null;\n try {\n const d = parseISO(value);\n if (!isNaN(d.getTime())) return d;\n } catch {\n // ignore\n }\n return null;\n}\n\nfunction toIsoDate(d: Date | null | undefined): string {\n if (!d || isNaN(d.getTime())) return '';\n return format(d, 'yyyy-MM-dd');\n}\n\nconst monthNamesCs = [\n 'Leden',\n 'Únor',\n 'Březen',\n 'Duben',\n 'Květen',\n 'Červen',\n 'Červenec',\n 'Srpen',\n 'Září',\n 'Říjen',\n 'Listopad',\n 'Prosinec',\n];\n\nconst weekdayLabelsCs = (() => {\n const start = startOfWeek(new Date(), { weekStartsOn: 1 });\n return Array.from({ length: 7 }).map((_, i) =>\n format(addDays(start, i), 'EEEEE', { locale: cs }),\n );\n})();\n\nconst buildPresets = () => {\n const today = new Date();\n const todayIso = toIsoDate(today);\n\n const lastNDays = (n: number) => {\n const end = today;\n const start = addDays(end, -n + 1);\n return { from: toIsoDate(start), to: toIsoDate(end) };\n };\n\n const thisWeek = () => {\n const monday = startOfWeek(today, { weekStartsOn: 1 });\n const sunday = endOfWeek(today, { weekStartsOn: 1 });\n return { from: toIsoDate(monday), to: toIsoDate(sunday) };\n };\n\n const next30Days = () => {\n const start = today;\n const end = addDays(start, 30);\n return { from: toIsoDate(start), to: toIsoDate(end) };\n };\n\n const thisMonth = () => {\n const start = startOfMonth(today);\n const end = endOfMonth(today);\n return { from: toIsoDate(start), to: toIsoDate(end) };\n };\n\n const last3Months = () => {\n const end = today;\n const start = addMonths(startOfMonth(end), -2);\n return { from: toIsoDate(start), to: toIsoDate(end) };\n };\n\n const last12Months = () => {\n const end = today;\n const start = addMonths(startOfMonth(end), -11);\n return { from: toIsoDate(start), to: toIsoDate(end) };\n };\n\n const thisYear = () => {\n const year = today.getFullYear();\n const start = new Date(year, 0, 1);\n const end = new Date(year, 11, 31);\n return { from: toIsoDate(start), to: toIsoDate(end) };\n };\n\n return [\n { key: 'today', label: 'Dnes', getRange: () => ({ from: todayIso, to: todayIso }) },\n { key: 'last7', label: 'Posledních 7 dní', getRange: () => lastNDays(7) },\n { key: 'last30', label: 'Posledních 30 dní', getRange: () => lastNDays(30) },\n { key: 'thisWeek', label: 'Tento týden', getRange: () => thisWeek() },\n { key: 'next30', label: 'Nadcházejících 30 dní', getRange: () => next30Days() },\n { key: 'thisMonth', label: 'Tento měsíc', getRange: () => thisMonth() },\n { key: 'last3months', label: 'Poslední 3 měsíce', getRange: () => last3Months() },\n { key: 'last12months', label: 'Posledních 12 měsíců', getRange: () => last12Months() },\n { key: 'thisYear', label: 'Tento rok', getRange: () => thisYear() },\n ];\n};\n\nconst PRESETS = buildPresets();\n\nexport const DateRangePicker: React.FC<DateRangePickerProps> = ({ from, to, onChange, size = 'sm' }) => {\n const [viewDate, setViewDate] = useState<Date>(() => parseDate(from) || parseDate(to) || new Date());\n const [draftFrom, setDraftFrom] = useState<Date | null>(() => parseDate(from));\n const [draftTo, setDraftTo] = useState<Date | null>(() => parseDate(to));\n const [hoverDate, setHoverDate] = useState<Date | null>(null);\n const [activePanel, setActivePanel] = useState<'calendar' | 'year' | 'month' | 'day'>('calendar');\n const [yearPageStart, setYearPageStart] = useState<number>(() => {\n const base = (parseDate(from) || parseDate(to) || new Date()).getFullYear();\n return base - 6; // show 12 years around current\n });\n\n const cardBg = useColorModeValue('white', 'gray.800');\n const sideBg = useColorModeValue('gray.50', 'gray.900');\n const sideActiveBg = useColorModeValue('blue.50', 'blue.900');\n const sideActiveColor = useColorModeValue('blue.700', 'blue.100');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const dayBgSelected = useColorModeValue('blue.500', 'blue.400');\n const dayBgInRange = useColorModeValue('blue.50', 'blue.900');\n const dayTextSelected = useColorModeValue('white', 'gray.900');\n const dayTextSubtle = useColorModeValue('gray.400', 'gray.500');\n const triggerBg = useColorModeValue('white', 'gray.800');\n const triggerHoverBg = useColorModeValue('gray.50', 'gray.700');\n const triggerBorderColor = useColorModeValue('gray.300', 'gray.600');\n\n useEffect(() => {\n const start = parseDate(from);\n const end = parseDate(to);\n setDraftFrom(start);\n setDraftTo(end);\n const base = start || end || new Date();\n setViewDate(base);\n setYearPageStart(base.getFullYear() - 6);\n }, [from, to]);\n\n const rangeLabel = useMemo(() => {\n const start = parseDate(from);\n const end = parseDate(to);\n if (start && end) {\n return `${format(start, 'd.M.yyyy', { locale: cs })} ${format(end, 'd.M.yyyy', { locale: cs })}`;\n }\n if (start) return `Od ${format(start, 'd.M.yyyy', { locale: cs })}`;\n if (end) return `Do ${format(end, 'd.M.yyyy', { locale: cs })}`;\n return 'Libovolné období';\n }, [from, to]);\n\n const handleDayClick = (day: Date) => {\n if (!draftFrom || (draftFrom && draftTo)) {\n setDraftFrom(day);\n setDraftTo(null);\n return;\n }\n if (draftFrom && !draftTo) {\n if (day < draftFrom) {\n setDraftTo(draftFrom);\n setDraftFrom(day);\n } else if (day.getTime() === draftFrom.getTime()) {\n // Single day toggle\n setDraftTo(day);\n } else {\n setDraftTo(day);\n }\n }\n };\n\n const currentRange = useMemo(() => {\n if (!draftFrom && !draftTo) return null;\n if (draftFrom && draftTo) {\n return draftFrom <= draftTo\n ? { start: draftFrom, end: draftTo }\n : { start: draftTo, end: draftFrom };\n }\n if (draftFrom && hoverDate) {\n return draftFrom <= hoverDate\n ? { start: draftFrom, end: hoverDate }\n : { start: hoverDate, end: draftFrom };\n }\n return null;\n }, [draftFrom, draftTo, hoverDate]);\n\n const monthStart = startOfMonth(viewDate);\n const monthEnd = endOfMonth(viewDate);\n const calendarStart = startOfWeek(monthStart, { weekStartsOn: 1 });\n const calendarEnd = endOfWeek(monthEnd, { weekStartsOn: 1 });\n\n const calendarDays: Date[] = [];\n for (let d = calendarStart; d <= calendarEnd; d = addDays(d, 1)) {\n calendarDays.push(d);\n }\n\n const weeks: Date[][] = [];\n for (let i = 0; i < calendarDays.length; i += 7) {\n weeks.push(calendarDays.slice(i, i + 7));\n }\n\n const yearOptions = useMemo(() => {\n return Array.from({ length: 12 }).map((_, i) => yearPageStart + i);\n }, [yearPageStart]);\n\n const selectedReferenceDate = draftFrom || draftTo || viewDate;\n const selectedYear = selectedReferenceDate.getFullYear();\n const selectedMonth = selectedReferenceDate.getMonth();\n const daysInSelectedMonth = getDaysInMonth(new Date(selectedYear, selectedMonth, 1));\n const headerDayLabel = format(selectedReferenceDate, 'd.', { locale: cs });\n\n const applyDraft = () => {\n const nextFrom = toIsoDate(draftFrom || null);\n const nextTo = toIsoDate(draftTo || draftFrom || null);\n onChange(nextFrom, nextTo);\n };\n\n const clearDraft = () => {\n setDraftFrom(null);\n setDraftTo(null);\n setHoverDate(null);\n };\n\n const renderCalendar = () => (\n <VStack align=\"stretch\" spacing={4}>\n <SimpleGrid columns={7} spacing={2} fontSize=\"sm\" textTransform=\"uppercase\" color={dayTextSubtle}>\n {weekdayLabelsCs.map((d) => (\n <Box key={d} textAlign=\"center\">{d}</Box>\n ))}\n </SimpleGrid>\n <VStack spacing={2} align=\"stretch\">\n {weeks.map((week, wi) => (\n <HStack key={wi} spacing={2}>\n {week.map((day) => {\n const isOutside = !isSameMonth(day, monthStart);\n const isSelectedStart = draftFrom && isSameDay(day, draftFrom);\n const isSelectedEnd = draftTo && isSameDay(day, draftTo);\n const inRange = currentRange ? isWithinInterval(day, currentRange) : false;\n\n let bg: string | undefined;\n let color: string | undefined;\n let roundedLeft = false;\n let roundedRight = false;\n\n if (inRange) {\n bg = dayBgInRange;\n }\n if (isSelectedStart || isSelectedEnd) {\n bg = dayBgSelected;\n color = dayTextSelected;\n roundedLeft = true;\n roundedRight = true;\n }\n\n const baseColor = isOutside ? dayTextSubtle : undefined;\n\n return (\n <Button\n key={day.toISOString()}\n size={size}\n variant={bg ? 'solid' : 'ghost'}\n flex=\"1\"\n borderRadius={bg ? (roundedLeft && roundedRight ? 'full' : 'md') : 'md'}\n bg={bg}\n color={color || baseColor}\n _hover={{ bg: bg || dayBgInRange }}\n onClick={() => handleDayClick(day)}\n onMouseEnter={() => setHoverDate(day)}\n onMouseLeave={() => setHoverDate(null)}\n w=\"100%\"\n h=\"2.5rem\"\n px={0}\n >\n {format(day, 'd')}\n </Button>\n );\n })}\n </HStack>\n ))}\n </VStack>\n </VStack>\n );\n\n const renderYearPanel = () => (\n <VStack align=\"stretch\" spacing={3}>\n <HStack justify=\"space-between\">\n <Button\n size=\"xs\"\n variant=\"ghost\"\n leftIcon={<ChevronLeftIcon />}\n onClick={() => setYearPageStart((prev) => prev - 12)}\n >\n Starší\n </Button>\n <Text fontSize=\"sm\" fontWeight=\"semibold\">\n {yearOptions[0]} {yearOptions[yearOptions.length - 1]}\n </Text>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n rightIcon={<ChevronRightIcon />}\n onClick={() => setYearPageStart((prev) => prev + 12)}\n >\n Novější\n </Button>\n </HStack>\n <SimpleGrid columns={3} spacing={2}>\n {yearOptions.map((year) => (\n <Button\n key={year}\n size={size}\n variant={year === selectedYear ? 'solid' : 'ghost'}\n colorScheme={year === selectedYear ? 'blue' : undefined}\n onClick={() => {\n const next = setYear(viewDate, year);\n setViewDate(next);\n setActivePanel('month');\n }}\n >\n {year}\n </Button>\n ))}\n </SimpleGrid>\n </VStack>\n );\n\n const renderMonthPanel = () => (\n <SimpleGrid columns={3} spacing={2}>\n {monthNamesCs.map((name, idx) => (\n <Button\n key={name}\n size={size}\n variant={idx === selectedMonth ? 'solid' : 'ghost'}\n colorScheme={idx === selectedMonth ? 'blue' : undefined}\n onClick={() => {\n const next = setMonth(viewDate, idx);\n setViewDate(startOfMonth(next));\n setActivePanel('calendar');\n }}\n >\n {`${idx + 1}. ${name}`}\n </Button>\n ))}\n </SimpleGrid>\n );\n\n const renderDayPanel = () => (\n <SimpleGrid columns={7} spacing={2}>\n {Array.from({ length: daysInSelectedMonth }).map((_, i) => {\n const dayNum = i + 1;\n const d = new Date(selectedYear, selectedMonth, dayNum);\n const isSelectedStart = draftFrom && isSameDay(d, draftFrom);\n const isSelectedEnd = draftTo && isSameDay(d, draftTo);\n const inRange = currentRange ? isWithinInterval(d, currentRange) : false;\n\n let bg: string | undefined;\n let color: string | undefined;\n if (inRange) bg = dayBgInRange;\n if (isSelectedStart || isSelectedEnd) {\n bg = dayBgSelected;\n color = dayTextSelected;\n }\n\n return (\n <Button\n key={dayNum}\n size={size}\n variant={bg ? 'solid' : 'ghost'}\n bg={bg}\n color={color}\n _hover={{ bg: bg || dayBgInRange }}\n onClick={() => handleDayClick(d)}\n borderRadius=\"full\"\n w=\"100%\"\n h=\"2.5rem\"\n px={0}\n >\n {dayNum}\n </Button>\n );\n })}\n </SimpleGrid>\n );\n\n const headerYear = viewDate.getFullYear();\n const headerMonthName = monthNamesCs[viewDate.getMonth()];\n\n return (\n <Popover\n placement=\"bottom-start\"\n onOpen={() => {\n const start = parseDate(from);\n const end = parseDate(to);\n setDraftFrom(start);\n setDraftTo(end);\n const base = start || end || new Date();\n setViewDate(base);\n setYearPageStart(base.getFullYear() - 6);\n setActivePanel('calendar');\n }}\n >\n <PopoverTrigger>\n <Button\n size={size}\n variant=\"outline\"\n leftIcon={<CalendarIcon />}\n borderRadius=\"full\"\n px={5}\n py={3}\n minW={{ base: '220px', md: '260px', lg: '300px' }}\n bg={triggerBg}\n borderColor={triggerBorderColor}\n boxShadow=\"sm\"\n _hover={{ bg: triggerHoverBg, boxShadow: 'md' }}\n overflow=\"hidden\"\n >\n <HStack spacing={3} align=\"center\" w=\"100%\" justify=\"space-between\">\n <Text fontSize=\"sm\" color=\"gray.600\" flexShrink={0}>\n Období:\n </Text>\n <Text\n fontSize=\"sm\"\n fontWeight=\"medium\"\n flex=\"1\"\n minW={0}\n textAlign=\"right\"\n isTruncated\n noOfLines={1}\n >\n {rangeLabel}\n </Text>\n </HStack>\n </Button>\n </PopoverTrigger>\n <PopoverContent\n w={{ base: '100%', sm: '360px', md: '520px' }}\n maxW=\"520px\"\n borderRadius=\"xl\"\n boxShadow=\"xl\"\n bg={cardBg}\n borderColor={borderColor}\n >\n <PopoverArrow />\n <PopoverBody p={0}>\n <Stack\n direction={{ base: 'column', md: 'row' }}\n spacing={0}\n divider={<Divider orientation=\"vertical\" display={{ base: 'none', md: 'block' }} />}\n >\n <Box\n w={{ base: '100%', md: '200px' }}\n borderBottomWidth={{ base: '1px', md: 0 }}\n bg={sideBg}\n p={4}\n >\n <VStack align=\"stretch\" spacing={2}>\n {PRESETS.map((preset) => (\n <Button\n key={preset.key}\n size=\"sm\"\n justifyContent=\"flex-start\"\n variant=\"ghost\"\n borderRadius=\"md\"\n px={3}\n py={2}\n fontSize=\"sm\"\n _hover={{ bg: sideActiveBg, color: sideActiveColor }}\n onClick={() => {\n const r = preset.getRange();\n setDraftFrom(parseDate(r.from));\n setDraftTo(parseDate(r.to));\n }}\n >\n {preset.label}\n </Button>\n ))}\n <Button\n size=\"sm\"\n variant=\"ghost\"\n borderRadius=\"md\"\n px={3}\n py={2}\n fontSize=\"sm\"\n onClick={clearDraft}\n >\n Vymazat\n </Button>\n </VStack>\n </Box>\n\n <Box flex=\"1\" p={4}>\n <VStack align=\"stretch\" spacing={4}>\n <HStack justify=\"space-between\" align=\"center\">\n <HStack spacing={2}>\n <Button\n size=\"xs\"\n borderRadius=\"full\"\n variant={activePanel === 'year' ? 'solid' : 'outline'}\n colorScheme={activePanel === 'year' ? 'blue' : undefined}\n onClick={() => setActivePanel('year')}\n >\n {headerYear}\n </Button>\n <Button\n size=\"xs\"\n borderRadius=\"full\"\n variant={activePanel === 'month' ? 'solid' : 'outline'}\n colorScheme={activePanel === 'month' ? 'blue' : undefined}\n onClick={() => setActivePanel('month')}\n >\n {headerMonthName}\n </Button>\n <Button\n size=\"xs\"\n borderRadius=\"full\"\n variant={activePanel === 'day' ? 'solid' : 'outline'}\n colorScheme={activePanel === 'day' ? 'blue' : undefined}\n onClick={() => setActivePanel('day')}\n >\n {headerDayLabel}\n </Button>\n </HStack>\n <HStack spacing={1}>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n onClick={() => setViewDate((prev) => subMonths(prev, 1))}\n >\n <ChevronLeftIcon />\n </Button>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n onClick={() => setViewDate((prev) => addMonths(prev, 1))}\n >\n <ChevronRightIcon />\n </Button>\n </HStack>\n </HStack>\n\n {activePanel === 'calendar' && renderCalendar()}\n {activePanel === 'year' && renderYearPanel()}\n {activePanel === 'month' && renderMonthPanel()}\n {activePanel === 'day' && renderDayPanel()}\n\n {activePanel !== 'calendar' && (\n <Button\n size=\"xs\"\n alignSelf=\"flex-start\"\n variant=\"link\"\n onClick={() => setActivePanel('calendar')}\n >\n Zpět na kalendář\n </Button>\n )}\n\n <HStack justify=\"space-between\" pt={2}>\n <Text fontSize=\"xs\" color=\"gray.500\">\n Rozsah:{' '}\n {draftFrom && draftTo\n ? `${format(draftFrom, 'd.M.yyyy', { locale: cs })} ${format(draftTo, 'd.M.yyyy', { locale: cs })}`\n : draftFrom\n ? `Od ${format(draftFrom, 'd.M.yyyy', { locale: cs })}`\n : draftTo\n ? `Do ${format(draftTo, 'd.M.yyyy', { locale: cs })}`\n : 'nenastaveno'}\n </Text>\n <HStack spacing={2}>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={clearDraft}\n >\n Zrušit\n </Button>\n <Button\n size=\"sm\"\n colorScheme=\"blue\"\n onClick={applyDraft}\n isDisabled={!draftFrom && !draftTo}\n >\n Použít\n </Button>\n </HStack>\n </HStack>\n </VStack>\n </Box>\n </Stack>\n </PopoverBody>\n </PopoverContent>\n </Popover>\n );\n};\n\nexport default DateRangePicker;\n","import React from 'react';\nimport { ScoreboardState } from '@/services/scoreboard';\n\nfunction deriveShortLocal(name?: string) {\n if (!name) return '---';\n const s = String(name).trim().toUpperCase();\n if (!s) return '---';\n const map: Record<string, string> = {\n 'Á':'A','Ä':'A','Å':'A','Â':'A','À':'A',\n 'Č':'C','Ć':'C','Ç':'C',\n 'Ď':'D',\n 'É':'E','Ě':'E','È':'E','Ë':'E','Ê':'E',\n 'Í':'I','Ì':'I','Ï':'I','Î':'I',\n 'Ň':'N','Ń':'N',\n 'Ó':'O','Ö':'O','Ô':'O','Ò':'O',\n 'Ř':'R',\n 'Š':'S','Ś':'S',\n 'Ť':'T',\n 'Ú':'U','Ů':'U','Ù':'U','Ü':'U','Û':'U',\n 'Ý':'Y',\n 'Ž':'Z',\n };\n let out = '';\n for (const ch of s) {\n const c = map[ch] || ch;\n if (c >= 'A' && c <= 'Z') {\n out += c;\n if (out.length === 3) break;\n }\n }\n while (out.length < 3) out += '-';\n return out;\n}\n\nfunction shade(hex: string, percent: number) {\n try {\n const n = hex.replace('#','');\n const num = parseInt(n.length === 3 ? n.split('').map((c)=>c+c).join('') : n, 16);\n let r = (num >> 16) & 0xff;\n let g = (num >> 8) & 0xff;\n let b = num & 0xff;\n r = Math.min(255, Math.max(0, Math.round(r + (percent/100)*255)));\n g = Math.min(255, Math.max(0, Math.round(g + (percent/100)*255)));\n b = Math.min(255, Math.max(0, Math.round(b + (percent/100)*255)));\n return `#${[r,g,b].map(v=>v.toString(16).padStart(2,'0')).join('')}`;\n } catch {\n return hex;\n }\n}\n\nconst styleBlock = `\n.pill-wrapper { width: max-content; margin: 24px auto; display: flex; flex-direction: column; align-items: center; gap: 18px; }\n.scoreboard { display: flex; justify-content: space-between; align-items: center; background: rgba(0,0,0,0.75); color: #ffffff; padding: 18px 28px; font-size: 32px; font-weight: 700; border-radius: 14px; width: min(90vw, 900px); margin: 24px auto; gap: 20px; box-shadow: 0 8px 24px rgba(0,0,0,0.35); backdrop-filter: blur(6px); border: 1px solid rgba(255,255,255,0.15); }\n.scoreboard.pill { background: var(--pill-bg, #f8fafc); color: var(--pill-text, #0f172a); border: 1px solid #e5e7eb; box-shadow: 0 10px 30px rgba(2,6,23,0.18); border-radius: 999px; padding: 4px 6px; width: max-content; margin: 0 auto; gap: 6px; backdrop-filter: none; font-size: 15px; transform: scale(var(--pill-scale, 1.7)); transform-origin: center; will-change: transform; }\n.scoreboard.pill .seg { display: flex; align-items: center; justify-content: center; height: 36px; }\n.scoreboard.pill .seg.timer { font-variant-numeric: tabular-nums; font-weight: 800; background: linear-gradient(180deg, #eef2f7 0%, #e2e8f0 100%); padding: 0 12px 0 8px; border-radius: 999px; font-size: 15px; color: #0f172a; }\n.scoreboard.pill .seg.team { padding: 0 10px; border-radius: 10px; font-weight: 800; letter-spacing: 0.5px; min-width: 46px; text-transform: uppercase; position: relative; overflow: visible; }\n.scoreboard.pill .seg.team.home { background: linear-gradient(90deg, var(--home-dark), var(--home-light)); color: var(--home-text, #ffffff); }\n.scoreboard.pill .seg.team.away { background: linear-gradient(90deg, var(--away-dark), var(--away-light)); color: var(--away-text, #ffffff); }\n.scoreboard.pill .seg.score { background: linear-gradient(180deg, #ffffff 0%, #f3f4f6 100%); border: 1px solid #e5e7eb; border-radius: 10px; padding: 0 10px; font-weight: 800; color: #0f172a; min-width: 58px; box-shadow: inset 0 1px 0 rgba(255,255,255,0.9); font-size: 15px; }\n.scoreboard.pill .divider { width: 2px; height: 14px; background: rgba(15,23,42,0.35); border-radius: 1px; align-self: center; }\n.scoreboard.pill .team .logo { width: 24px; height: 24px; object-fit: contain; margin-right: 6px; filter: drop-shadow(0 1px 1px rgba(0,0,0,0.2)); }\n.scoreboard.pill .team.away .logo { margin-left: 6px; margin-right: 0; }\n.fouls-bar { display: flex; align-items: center; justify-content: space-between; gap: 32px; width: 100%; padding: 18px 18px 0; transform: scale(var(--pill-scale, 1.7)); transform-origin: center; }\n.fouls-group { display: flex; gap: 6px; }\n.foul-dot { width: 12px; height: 12px; border-radius: 50%; border: 2px solid rgba(255,255,255,0.9); background: rgba(255,255,255,0.15); box-shadow: 0 1px 2px rgba(0,0,0,0.25); }\n.foul-dot.active { background: #ff1f1f; border-color: #ff1f1f; }\n@media (max-width: 640px) {\n .pill-wrapper { margin: 24px auto 16px; gap: 14px; }\n .scoreboard.pill { padding: 6px 8px; transform: scale(1.0); transform-origin: center; }\n .pill .seg.timer, .pill .seg.score { padding: 4px 10px; }\n .fouls-bar { gap: 20px; padding: 12px 12px 0; transform: scale(1.0); }\n}\n`;\n\nconst MyClubOverlay: React.FC<{ state: ScoreboardState }> = ({ state }) => {\n const theme = state.theme || 'pill';\n const isFlipped = !!state.sidesFlipped;\n const left = {\n short: (isFlipped ? state.awayShort : state.homeShort) || deriveShortLocal(isFlipped ? state.awayName : state.homeName),\n logo: isFlipped ? state.awayLogo : state.homeLogo,\n color: (isFlipped ? state.secondaryColor : state.primaryColor) || '#1e3a8a',\n score: isFlipped ? state.awayScore : state.homeScore,\n fouls: Math.max(0, Math.min(5, isFlipped ? (state.awayFouls || 0) : (state.homeFouls || 0))),\n };\n const right = {\n short: (!isFlipped ? state.awayShort : state.homeShort) || deriveShortLocal(!isFlipped ? state.awayName : state.homeName),\n logo: !isFlipped ? state.awayLogo : state.homeLogo,\n color: (!isFlipped ? state.secondaryColor : state.primaryColor) || '#2563eb',\n score: !isFlipped ? state.awayScore : state.homeScore,\n fouls: Math.max(0, Math.min(5, !isFlipped ? (state.awayFouls || 0) : (state.homeFouls || 0))),\n };\n const timer = state.timer || '00:00';\n\n const cssVars: React.CSSProperties = {\n // @ts-ignore\n '--home-dark': left.color,\n // @ts-ignore\n '--home-light': shade(left.color, 20),\n // @ts-ignore\n '--away-dark': right.color,\n // @ts-ignore\n '--away-light': shade(right.color, 20),\n // @ts-ignore\n '--home-text': (state as any).homeTextColor || '#ffffff',\n // @ts-ignore\n '--away-text': (state as any).awayTextColor || '#ffffff',\n } as any;\n\n if (theme !== 'pill') {\n return (\n <>\n <style>{styleBlock}</style>\n <div className=\"pill-wrapper\" style={cssVars as any}>\n <div className=\"scoreboard pill\">\n <div className=\"seg timer\"><span>{timer}</span></div>\n <div className=\"seg team home\"><img className=\"logo\" alt=\"\" src={left.logo || ''} />\n <span>{left.short}</span>\n </div>\n <span className=\"divider\" aria-hidden=\"true\"></span>\n <div className=\"seg score\"><span>{left.score}-{right.score}</span></div>\n <span className=\"divider\" aria-hidden=\"true\"></span>\n <div className=\"seg team away\"><span>{right.short}</span>\n <img className=\"logo\" alt=\"\" src={right.logo || ''} />\n </div>\n </div>\n <div className=\"fouls-bar\">\n <div className=\"fouls-group\">\n {Array.from({ length: 5 }).map((_, i) => (\n <span key={i} className={`foul-dot${i < left.fouls ? ' active' : ''}`}></span>\n ))}\n </div>\n <div className=\"fouls-group\">\n {Array.from({ length: 5 }).map((_, i) => (\n <span key={i} className={`foul-dot${i < right.fouls ? ' active' : ''}`}></span>\n ))}\n </div>\n </div>\n </div>\n </>\n );\n }\n\n return (\n <>\n <style>{styleBlock}</style>\n <div className=\"pill-wrapper\" style={cssVars as any}>\n <div className=\"scoreboard pill\">\n <div className=\"seg timer\"><span>{timer}</span></div>\n <div className=\"seg team home\"><img className=\"logo\" alt=\"\" src={left.logo || ''} />\n <span>{left.short}</span>\n </div>\n <span className=\"divider\" aria-hidden=\"true\"></span>\n <div className=\"seg score\"><span>{left.score}-{right.score}</span></div>\n <span className=\"divider\" aria-hidden=\"true\"></span>\n <div className=\"seg team away\"><span>{right.short}</span>\n <img className=\"logo\" alt=\"\" src={right.logo || ''} />\n </div>\n </div>\n <div className=\"fouls-bar\">\n <div className=\"fouls-group\">\n {Array.from({ length: 5 }).map((_, i) => (\n <span key={i} className={`foul-dot${i < left.fouls ? ' active' : ''}`}></span>\n ))}\n </div>\n <div className=\"fouls-group\">\n {Array.from({ length: 5 }).map((_, i) => (\n <span key={i} className={`foul-dot${i < right.fouls ? ' active' : ''}`}></span>\n ))}\n </div>\n </div>\n </div>\n </>\n );\n};\n\nexport default MyClubOverlay;\n","import React from 'react';\nimport { Box, Center, Spinner, useColorModeValue } from '@chakra-ui/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { getPublicScoreboard, ScoreboardState } from '@/services/scoreboard';\nimport MyClubOverlay from '@/components/scoreboard/MyClubOverlay';\nimport ScoreboardPreview from '@/components/scoreboard/ScoreboardPreview';\n\n// Public overlay page intended for OBS/browser source.\n// Minimal chrome, transparent-friendly background.\nconst OverlayScoreboardPage: React.FC = () => {\n const bg = useColorModeValue('transparent', 'transparent');\n const { data, isLoading } = useQuery<ScoreboardState>({\n queryKey: ['public-scoreboard'],\n queryFn: getPublicScoreboard,\n refetchInterval: 1000,\n staleTime: 3000,\n });\n\n return (\n <Box minH=\"100vh\" bg={bg} display=\"flex\" alignItems=\"center\" justifyContent=\"center\" p={4}>\n {isLoading || !data ? (\n <Center><Spinner /></Center>\n ) : (\n (data.theme === 'pill' ? <MyClubOverlay state={data} /> : <ScoreboardPreview state={data} />)\n )}\n </Box>\n );\n};\n\nexport default OverlayScoreboardPage;\n","import React, { useEffect, useMemo, useState } from 'react';\nimport MainLayout from '../components/layout/MainLayout';\nimport {\n Box,\n Container,\n Heading,\n Text,\n SimpleGrid,\n AspectRatio,\n useColorModeValue,\n Spinner,\n VStack,\n HStack,\n Badge,\n Button,\n Link,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalBody,\n ModalCloseButton,\n useDisclosure,\n Icon,\n} from '@chakra-ui/react';\nimport { useClubTheme } from '../contexts/ClubThemeContext';\nimport { usePublicSettings } from '../hooks/usePublicSettings';\nimport { getCachedYouTube, YouTubeVideo } from '../services/youtube';\nimport { FaPlay, FaExternalLinkAlt, FaYoutube } from 'react-icons/fa';\nimport NewsletterCTA from '../components/common/NewsletterCTA';\nimport CommentsSection from '../components/comments/CommentsSection';\nimport { Helmet } from 'react-helmet-async';\nimport { useTranslation } from 'react-i18next';\n\ntype RenderItem = {\n key: string;\n title: string;\n embedUrl: string;\n thumbnail?: string;\n date?: string; // YYYY-MM-DD\n videoId?: string;\n};\n\nconst toEmbed = (idOrUrl: string): string => {\n try {\n if (idOrUrl.includes('youtube.com') || idOrUrl.includes('youtu.be')) {\n const u = new URL(idOrUrl);\n if (u.hostname.includes('youtu.be')) {\n const id = u.pathname.replace('/', '');\n return `https://www.youtube.com/embed/${id}`;\n }\n const id = u.searchParams.get('v');\n if (id) return `https://www.youtube.com/embed/${id}`;\n }\n } catch {}\n return `https://www.youtube.com/embed/${idOrUrl}`;\n};\n\nconst extractVideoId = (embedUrl: string): string | undefined => {\n if (embedUrl?.includes('/embed/')) {\n return embedUrl.split('/embed/')[1]?.split('?')[0];\n }\n return undefined;\n};\n\nconst VideosPage: React.FC = () => {\n const { t } = useTranslation();\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.600');\n const headingColor = useColorModeValue('gray.800', 'gray.100');\n const textSecondary = useColorModeValue('gray.600', 'gray.300');\n const textTertiary = useColorModeValue('gray.500', 'gray.400');\n const modalBg = useColorModeValue('white', 'gray.800');\n const placeholderBg = useColorModeValue('gray.100', 'gray.700');\n const placeholderIcon = useColorModeValue('gray.400', 'gray.500');\n const videoPrimaryColor = useColorModeValue('brand.primary', 'brand.accent');\n const theme = useClubTheme();\n const { data: settings, isLoading: settingsLoading } = usePublicSettings();\n const [yt, setYt] = useState<YouTubeVideo[]>([]);\n const [loading, setLoading] = useState(true);\n const { isOpen, onOpen, onClose } = useDisclosure();\n const [selectedVideo, setSelectedVideo] = useState<RenderItem | null>(null);\n\n const source = settings?.videos_source || 'auto';\n const youtubeUrl = (settings as any)?.youtube_url || (settings as any)?.social_youtube || null;\n const titleOverrides: Record<string, string> = (settings as any)?.videos_title_overrides || {};\n\n useEffect(() => {\n let canceled = false;\n const run = async () => {\n try {\n const payload = await getCachedYouTube();\n if (!payload) {\n setLoading(false);\n return;\n }\n const vids = (payload.videos || [])\n .slice()\n .sort((a, b) => (Date.parse(b.published_date || '') || 0) - (Date.parse(a.published_date || '') || 0));\n if (!canceled) setYt(vids);\n } catch (e) {\n console.error('Failed to load videos:', e);\n } finally {\n if (!canceled) setLoading(false);\n }\n };\n run();\n return () => {\n canceled = true;\n };\n }, []);\n\n const items: RenderItem[] = useMemo(() => {\n // Build manual items (preferred) with legacy fallback\n const manualItems = (() => {\n const manual = (settings?.videos_items || []).map((it, i) => {\n const embedUrl = toEmbed(it.url);\n return {\n key: `${i}-${it.url}`,\n title: it.title || `Video ${i + 1}`,\n embedUrl,\n thumbnail: it.thumbnail_url,\n date: it.uploaded_at,\n videoId: extractVideoId(embedUrl),\n } as RenderItem;\n });\n const legacy = ((settings as any)?.videos || []).map((url: string, i: number) => {\n const embedUrl = toEmbed(url);\n return {\n key: `${i}-${url}`,\n title: `Video ${i + 1}`,\n embedUrl,\n videoId: extractVideoId(embedUrl),\n } as RenderItem;\n });\n return manual.length ? manual : legacy;\n })();\n\n const autoItems = (yt || []).map((v) => ({\n key: v.video_id,\n title: (titleOverrides?.[v.video_id]?.trim()) || v.title,\n embedUrl: toEmbed(v.video_id),\n thumbnail: v.thumbnail_url,\n date: v.published_date,\n videoId: v.video_id,\n } as RenderItem));\n const out: RenderItem[] = [];\n const seen = new Set<string>();\n const pushUnique = (it: RenderItem) => {\n const k = it.videoId || it.embedUrl || it.key;\n if (!k) return;\n if (seen.has(k)) return;\n seen.add(k);\n out.push(it);\n };\n manualItems.forEach(pushUnique);\n autoItems.forEach(pushUnique);\n // Sort by date desc so manual additions integrate among auto\n const sorted = out.slice().sort((a, b) => {\n const ta = Date.parse(a.date || '') || 0;\n const tb = Date.parse(b.date || '') || 0;\n return tb - ta;\n });\n return sorted;\n }, [yt, settings?.videos_items, (settings as any)?.videos, titleOverrides]);\n\n const openVideo = (item: RenderItem) => {\n setSelectedVideo(item);\n onOpen();\n };\n\n const VideoCard: React.FC<{ item: RenderItem }> = ({ item }) => {\n const thumb =\n item.thumbnail ||\n (item.videoId ? `https://i.ytimg.com/vi/${item.videoId}/hqdefault.jpg` : undefined);\n\n return (\n <Box\n bg={cardBg}\n borderRadius=\"xl\"\n overflow=\"hidden\"\n boxShadow=\"sm\"\n borderWidth=\"2px\"\n borderColor={borderColor}\n transition=\"all 0.3s\"\n _hover={{\n transform: 'translateY(-8px)',\n boxShadow: '0 20px 40px rgba(0,0,0,0.15)',\n borderColor: 'brand.primary',\n }}\n >\n <AspectRatio ratio={16 / 9}>\n <Box position=\"relative\" cursor=\"pointer\" onClick={() => openVideo(item)}>\n {/* Thumbnail */}\n {thumb ? (\n <Box\n as=\"img\"\n src={thumb}\n alt={item.title}\n width=\"100%\"\n height=\"100%\"\n loading=\"lazy\"\n decoding=\"async\"\n referrerPolicy=\"origin-when-cross-origin\"\n style={{ objectFit: 'cover' }}\n data-fallback-idx={0 as any}\n onError={(e: any) => {\n try {\n const el = e.currentTarget as HTMLImageElement & { dataset: { fallbackIdx?: string } };\n const idx = Number(el.dataset.fallbackIdx || '0');\n const id = item.videoId || '';\n const chain = id\n ? [\n `https://i.ytimg.com/vi/${id}/mqdefault.jpg`,\n `https://i.ytimg.com/vi/${id}/sddefault.jpg`,\n `https://i.ytimg.com/vi/${id}/hqdefault.jpg`,\n '/dist/img/logo-club-empty.svg',\n ]\n : ['/dist/img/logo-club-empty.svg'];\n if (idx < chain.length) {\n el.src = chain[idx];\n el.dataset.fallbackIdx = String(idx + 1);\n }\n } catch {}\n }}\n />\n ) : (\n <Box bg={placeholderBg} display=\"flex\" alignItems=\"center\" justifyContent=\"center\">\n <Icon as={FaPlay} boxSize={12} color={placeholderIcon} />\n </Box>\n )}\n {/* Play overlay */}\n <Box\n position=\"absolute\"\n inset={0}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n bg=\"blackAlpha.600\"\n opacity={0}\n _hover={{ opacity: 1 }}\n transition=\"opacity 0.3s\"\n >\n <Box\n bg=\"brand.primary\"\n color=\"white\"\n borderRadius=\"full\"\n px={8}\n py={4}\n fontWeight=\"bold\"\n display=\"flex\"\n alignItems=\"center\"\n gap={2}\n transform=\"scale(1)\"\n _hover={{ transform: 'scale(1.1)' }}\n transition=\"transform 0.2s\"\n boxShadow=\"0 8px 24px rgba(0,0,0,0.3)\"\n >\n <Icon as={FaPlay} boxSize={5} />\n <Text fontSize=\"lg\">{t('videos.play')}</Text>\n </Box>\n </Box>\n </Box>\n </AspectRatio>\n <Box p={4} borderTopWidth=\"2px\" borderTopColor={videoPrimaryColor}>\n <VStack align=\"start\" spacing={2}>\n <Text fontWeight=\"bold\" fontSize=\"md\" color={videoPrimaryColor} noOfLines={2}>\n {item.title}\n </Text>\n <HStack justify=\"space-between\" width=\"100%\">\n {item.date && (\n <Badge colorScheme=\"gray\" fontSize=\"0.7rem\">\n {new Date(item.date).toLocaleDateString('cs-CZ')}\n </Badge>\n )}\n {item.videoId && (\n <Link href={`https://www.youtube.com/watch?v=${item.videoId}`} isExternal onClick={(e) => e.stopPropagation()}>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n colorScheme=\"red\"\n leftIcon={<Icon as={FaYoutube} />}\n >\n YouTube\n </Button>\n </Link>\n )}\n </HStack>\n </VStack>\n </Box>\n </Box>\n );\n };\n\n if (settingsLoading || loading) {\n return (\n <MainLayout>\n <Container maxW=\"7xl\" py={{ base: 6, md: 10 }}>\n <VStack spacing={4}>\n <Spinner size=\"xl\" color={theme.accent} />\n <Text color={textSecondary}>{t('videos.loading')}</Text>\n </VStack>\n </Container>\n </MainLayout>\n );\n }\n\n return (\n <MainLayout>\n <Helmet>\n <title>{t('videos.title')}</title>\n <meta name=\"description\" content={t('videos.description')} />\n </Helmet>\n <Container maxW=\"7xl\" py={{ base: 6, md: 10 }}>\n <Box mb={6}>\n <HStack justify=\"space-between\" mb={2} flexWrap=\"wrap\">\n <Heading as=\"h1\" size=\"xl\" color={headingColor}>\n {t('videos.title')}\n </Heading>\n {youtubeUrl && (\n <Link href={youtubeUrl} isExternal>\n <Button\n size=\"sm\"\n variant=\"outline\"\n colorScheme=\"red\"\n rightIcon={<Icon as={FaExternalLinkAlt} />}\n >\n {t('videos.youtube_channel')}\n </Button>\n </Link>\n )}\n </HStack>\n <VStack align=\"start\" spacing={1}>\n <Text color={textSecondary}>{t('videos.watch_latest')}</Text>\n <HStack spacing={1} color={textTertiary} fontSize=\"sm\">\n <Icon as={FaYoutube} color=\"red.500\" />\n <Text>{t('videos.all_from_youtube')}</Text>\n </HStack>\n </VStack>\n </Box>\n\n {items.length === 0 ? (\n <Box textAlign=\"center\" py={12}>\n <Icon as={FaPlay} boxSize={16} color={placeholderIcon} mb={4} />\n <Text color={textSecondary} fontSize=\"lg\">\n {t('videos.no_videos')}\n </Text>\n </Box>\n ) : (\n <SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} spacing={6}>\n {items.map((item) => (\n <VideoCard key={item.key} item={item} />\n ))}\n </SimpleGrid>\n )}\n </Container>\n\n {/* Video Modal */}\n <Modal isOpen={isOpen} onClose={onClose} size=\"6xl\" isCentered>\n <ModalOverlay bg=\"blackAlpha.800\" />\n <ModalContent bg=\"transparent\" boxShadow=\"none\" maxW=\"90vw\">\n <ModalCloseButton\n color=\"white\"\n bg=\"blackAlpha.600\"\n _hover={{ bg: 'blackAlpha.800' }}\n size=\"lg\"\n top={2}\n right={2}\n zIndex={2}\n />\n <ModalBody p={0}>\n {selectedVideo && (\n <Box>\n <AspectRatio ratio={16 / 9} maxH=\"80vh\">\n <iframe\n src={`${selectedVideo.embedUrl}?autoplay=1&vq=hd1080&rel=0&modestbranding=1&playsinline=1`}\n title={selectedVideo.title}\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n allowFullScreen\n loading=\"lazy\"\n referrerPolicy=\"strict-origin-when-cross-origin\"\n style={{ borderRadius: '8px' }}\n />\n </AspectRatio>\n <Box bg={modalBg} p={4} borderRadius=\"md\" mt={2}>\n <HStack justify=\"space-between\" align=\"start\">\n <VStack align=\"start\" flex={1}>\n <Text fontWeight=\"bold\" fontSize=\"lg\">\n {selectedVideo.title}\n </Text>\n {selectedVideo.date && (\n <Text color={textSecondary} fontSize=\"sm\">\n {new Date(selectedVideo.date).toLocaleDateString('cs-CZ', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n })}\n </Text>\n )}\n </VStack>\n {selectedVideo.videoId && (\n <Link href={`https://www.youtube.com/watch?v=${selectedVideo.videoId}`} isExternal>\n <Button\n size=\"sm\"\n colorScheme=\"red\"\n leftIcon={<Icon as={FaYoutube} />}\n >\n {t('videos.open_on_youtube')}\n </Button>\n </Link>\n )}\n </HStack>\n {selectedVideo.videoId && (\n <Box mt={4}>\n <CommentsSection targetType=\"youtube_video\" targetId={selectedVideo.videoId} />\n </Box>\n )}\n </Box>\n </Box>\n )}\n </ModalBody>\n </ModalContent>\n </Modal>\n \n {/* Newsletter CTA */}\n <NewsletterCTA />\n </MainLayout>\n );\n};\n\nexport default VideosPage;\n","import { usePublicSettings } from './usePublicSettings';\nimport { useMemo } from 'react';\nimport { PublicSettings } from '../services/settings';\n\ninterface ThemeColors {\n primary: string;\n secondary: string;\n text: string;\n background: string;\n accent: string;\n [key: string]: string; // For any additional color keys\n}\n\ninterface ClubTheme {\n primaryColor: string;\n secondaryColor: string;\n textColor: string;\n backgroundColor: string;\n accentColor: string;\n isDarkMode: boolean;\n logoUrl?: string;\n faviconUrl?: string;\n colors: ThemeColors;\n}\n\nconst DEFAULT_THEME: ClubTheme = {\n // Modern cool palette defaults (no red/yellow)\n primaryColor: '#1e3a8a', // blue-800\n secondaryColor: '#0ea5a4', // teal-500\n textColor: '#0f172a', // slate-900\n backgroundColor: '#ffffff',\n accentColor: '#2563eb', // blue-600\n isDarkMode: false,\n colors: {\n primary: '#1e3a8a',\n secondary: '#0ea5a4',\n text: '#0f172a',\n background: '#ffffff',\n accent: '#2563eb'\n }\n};\n\nexport const useClubTheme = (): ClubTheme => {\n const { data: settings } = usePublicSettings();\n\n return useMemo<ClubTheme>(() => {\n if (!settings) return DEFAULT_THEME;\n\n const primaryColor = settings.primary_color || DEFAULT_THEME.primaryColor;\n const secondaryColor = settings.secondary_color || DEFAULT_THEME.secondaryColor;\n const textColor = settings.text_color || DEFAULT_THEME.textColor;\n const backgroundColor = settings.background_color || DEFAULT_THEME.backgroundColor;\n const accentColor = settings.accent_color || DEFAULT_THEME.accentColor;\n\n return {\n primaryColor,\n secondaryColor,\n textColor,\n backgroundColor,\n accentColor,\n isDarkMode: false, // No dark_mode in PublicSettings, default to false\n logoUrl: settings.club_logo_url,\n faviconUrl: undefined, // No favicon_url in PublicSettings\n colors: {\n primary: primaryColor,\n secondary: secondaryColor,\n text: textColor,\n background: backgroundColor,\n accent: accentColor,\n // Add any additional color mappings here\n }\n };\n }, [settings]);\n};\n\nexport default useClubTheme;\n","import React from 'react';\nimport { Box, Container } from '@chakra-ui/react';\nimport { usePublicSettings } from '../../hooks/usePublicSettings';\nimport { useTranslation } from 'react-i18next';\nimport PremiumAssetsLoader from './PremiumAssetsLoader';\nimport { assetUrl } from '../../utils/url';\nimport { useAuth } from '../../contexts/AuthContext';\nimport { useClubTheme } from '../../hooks/useClubTheme';\nimport SpartaNavbar from '../../components/elements/SpartaNavbar';\nimport SponsorsSection from '../../components/common/SponsorsSection';\nimport Footer from '../../components/layout/Footer';\n\nconst LegacyPremiumLayout: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const { data: s } = usePublicSettings();\n const { t } = useTranslation();\n const theme = useClubTheme();\n const clubLogo = s?.club_logo_url || '/dist/img/logo-club-empty.svg';\n const clubName = s?.club_name || 'Fotbal Club';\n const galleryUrl = s?.gallery_url || s?.zonerama_url || undefined;\n const { isAuthenticated, user, logout } = useAuth();\n const role = String(user?.role || '').toLowerCase();\n const accountHref = role === 'admin' || role === 'editor' ? '/admin' : '/semiadmin';\n\n React.useEffect(() => {\n try {\n const root = document.documentElement as HTMLElement;\n root.style.setProperty('--main', theme.primaryColor);\n root.style.setProperty('--second', theme.secondaryColor);\n root.style.setProperty('--accent', theme.accentColor);\n root.style.setProperty('--background', theme.backgroundColor);\n document.body.style.backgroundColor = theme.backgroundColor;\n } catch {}\n }, [theme.primaryColor, theme.secondaryColor, theme.accentColor, theme.backgroundColor]);\n\n React.useEffect(() => {\n const t = setTimeout(() => {\n try {\n const w: any = window as any;\n if (typeof w.initStyles === 'function') { w.initStyles(); }\n if (typeof w.setResizeStyles === 'function') { w.setResizeStyles(); }\n if (typeof w.checkNavbar === 'function') { w.checkNavbar(); }\n if (typeof w.initMasonry === 'function') { w.initMasonry(); }\n if (typeof w.initParallax === 'function') { w.initParallax(); }\n if ((w.jQuery || w.$) && typeof (w.jQuery || w.$)(window).trigger === 'function') {\n (w.jQuery || w.$)(window).trigger('resize');\n } else {\n window.dispatchEvent(new Event('resize'));\n }\n } catch {}\n }, 50);\n return () => clearTimeout(t);\n }, []);\n\n React.useEffect(() => {\n const w: any = window as any;\n let raf = 0;\n const relayout = () => {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(() => {\n try { if (typeof w.initMasonry === 'function') w.initMasonry(); } catch {}\n });\n };\n // Reflow on new images loading inside masonry containers\n const imgs: NodeListOf<HTMLImageElement> = document.querySelectorAll('.masonry img');\n imgs.forEach((img) => { if (!img.complete) img.addEventListener('load', relayout, { once: true } as any); });\n // Observe DOM mutations inside masonry containers\n const containers = document.querySelectorAll('.masonry');\n const observers: MutationObserver[] = [];\n containers.forEach((c) => {\n const mo = new MutationObserver(() => relayout());\n mo.observe(c, { childList: true, subtree: true });\n observers.push(mo);\n });\n // Initial attempt\n relayout();\n return () => { observers.forEach((o) => o.disconnect()); cancelAnimationFrame(raf); };\n }, []);\n\n return (\n <div className=\"lte-content-wrapper lte-layout-transparent-full\">\n <PremiumAssetsLoader />\n <div className=\"lte-header-wrapper header-h1 header-parallax lte-header-overlay lte-layout-transparent-full lte-pageheader-disabled\">\n <div id=\"lte-nav-wrapper\" className=\"lte-layout-transparent-full lte-nav-color-white\">\n <nav className=\"lte-navbar affix\" data-spy=\"affix\" data-offset-top=\"0\">\n <div className=\"container\">\n {/* Logo */}\n <div className=\"lte-navbar-logo\">\n <a className=\"lte-logo\" href=\"/\">\n {/* eslint-disable-next-line jsx-a11y/alt-text */}\n <img src={assetUrl(clubLogo)} />\n </a>\n </div>\n {/* Navigation Items */}\n <div className=\"lte-navbar-items navbar-mobile-black navbar-collapse collapse\" id=\"navbar\" data-mobile-screen-width=\"1198\">\n <div className=\"toggle-wrap\">\n <a className=\"lte-logo\" href=\"/\">\n {/* eslint-disable-next-line jsx-a11y/alt-text */}\n <img src={assetUrl(clubLogo)} />\n </a>\n <button type=\"button\" className=\"lte-navbar-toggle collapsed\" id=\"close-button\">\n <span className=\"close\">&times;</span>\n </button>\n <div className=\"clearfix\"></div>\n </div>\n {/* Navigation Menu */}\n <ul id=\"menu-main-menu\" className=\"lte-ul-nav\">\n <li className=\"menu-item menu-item-type-custom current-menu-ancestor current-menu-parent\">\n <a href=\"/\"><span>Domů</span></a>\n </li>\n <li className=\"menu-item menu-item-type-post_type menu-item-object-page\">\n <a href=\"/o-klubu\"><span>O nás</span></a>\n </li>\n <li className=\"menu-item menu-item-type-custom\">\n <a href=\"/blog\"><span>Blog</span></a>\n </li>\n <li className=\"menu-item menu-item-type-post_type menu-item-object-page\">\n <a href=\"/kontakt\"><span>Kontakt</span></a>\n </li>\n <li className=\"menu-item menu-item-type-custom current-menu-ancestor current-menu-parent\">\n <a href=\"/#tym\"><span>Tým</span></a>\n </li>\n <li className=\"menu-item menu-item-type-custom current-menu-ancestor current-menu-parent\">\n <a href=\"/#sponzori\"><span>Sponzoři</span></a>\n </li>\n {!!galleryUrl && (\n <li className=\"menu-item menu-item-type-custom current-menu-ancestor current-menu-parent\">\n <a target=\"_blank\" href={galleryUrl}><span>{t('homepage.gallery')}</span></a>\n </li>\n )}\n {/* Search toggle entry (theme script hooks on .lte-nav-search .lte-header) */}\n <li className=\"menu-item lte-nav-search\">\n <a href=\"#\" className=\"lte-header\" onClick={(e) => e.preventDefault()}><span>Hledat</span></a>\n </li>\n {/* Auth links */}\n {!isAuthenticated ? (\n <>\n <li className=\"menu-item menu-item-type-custom\"><a href=\"/login\"><span>Přihlásit</span></a></li>\n <li className=\"menu-item menu-item-type-custom\"><a href=\"/register\"><span>Registrovat</span></a></li>\n </>\n ) : (\n <>\n <li className=\"menu-item menu-item-type-custom\"><a href={accountHref}><span>Můj účet</span></a></li>\n <li className=\"menu-item menu-item-type-custom\">\n <a href=\"#\" onClick={(e) => { e.preventDefault(); try { logout(); } catch {} window.location.href = '/'; }}><span>Odhlásit</span></a>\n </li>\n </>\n )}\n </ul>\n {/* Premium search wrapper (theme scripts control visibility) */}\n <div className=\"lte-top-search-wrapper\" data-base-href=\"/hledat\" data-source=\"site\">\n <a href=\"#\" className=\"lte-top-search-ico\" onClick={(e) => e.preventDefault()}></a>\n <a href=\"#\" className=\"lte-top-search-ico-close\" onClick={(e) => e.preventDefault()}></a>\n <div className=\"lte-top-search-field\">\n <input type=\"text\" placeholder=\"Hledat…\" />\n <a href=\"#\" id=\"lte-top-search-ico-mobile\" onClick={(e) => e.preventDefault()}></a>\n </div>\n </div>\n </div>\n {/* Mobile Menu Toggle */}\n <button type=\"button\" className=\"lte-navbar-toggle\" id=\"open-button\">\n <span className=\"icon-bar top-bar\"></span>\n <span className=\"icon-bar middle-bar\"></span>\n <span className=\"icon-bar bottom-bar\"></span>\n </button>\n </div>\n </nav>\n </div>\n </div>\n\n {/* Content */}\n {children}\n\n {/* Footer */}\n <div className=\"lte-footer-wrapper lte-footer-layout-default\">\n <div className=\"footer-wrapper\">\n <div className=\"lte-container\">\n <div className=\"footer-block lte-footer-widget-area\">\n <div className=\"elementor elementor-29393\">\n <div className=\"elementor-element lte-background-black e-flex e-con-boxed e-con e-parent\" data-settings='{\"background_background\":\"classic\"}'>\n <div className=\"e-con-inner\" style={{ paddingBottom: '92px' }}>\n <div className=\"e-con-full e-flex e-con e-child\">\n <div className=\"elementor-widget elementor-widget-shortcode\">\n <div className=\"elementor-widget-container\">\n <div className=\"elementor-shortcode\">\n <a className=\"lte-logo\" href=\"/\">\n {/* eslint-disable-next-line jsx-a11y/alt-text */}\n <img src={assetUrl(clubLogo)} style={{ filter: 'drop-shadow(9px -1px 23px black)' }} />\n </a>\n </div>\n </div>\n </div>\n <div className=\"elementor-widget elementor-widget-text-editor\">\n <div className=\"elementor-widget-container\">\n <p>\n <span className=\"text-sm\">\n {clubName}\n </span>\n </p>\n </div>\n </div>\n <div className=\"elementor-widget elementor-widget-lte-elements\">\n <div className=\"elementor-widget-container\">\n <div className=\"lte-social lte-nav-second lte-type-\">\n <ul>\n {!!s?.facebook_url && (\n <li><a href={s.facebook_url} target=\"_blank\" rel=\"noreferrer\"><ion-icon name=\"logo-facebook\" style={{ height: 22, width: 22 }}></ion-icon></a></li>\n )}\n {!!s?.instagram_url && (\n <li><a href={s.instagram_url} target=\"_blank\" rel=\"noreferrer\"><ion-icon name=\"logo-instagram\" style={{ height: 22, width: 22 }}></ion-icon></a></li>\n )}\n {!!s?.youtube_url && (\n <li><a href={s.youtube_url} target=\"_blank\" rel=\"noreferrer\"><ion-icon name=\"logo-youtube\" style={{ height: 22, width: 22 }}></ion-icon></a></li>\n )}\n </ul>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <footer className=\"copyright-block copyright-layout-copyright-transparent\">\n <div className=\"container\">\n <p>\n <a href=\"https://tdvorak.dev\" target=\"_blank\" rel=\"noreferrer\">TDvorak</a> &copy; {t('footer.all_rights_reserved', { year: new Date().getFullYear() })}\n </p>\n </div>\n </footer>\n </div>\n\n <a href=\"#\" className=\"lte-go-top floating lte-go-top-icon\">\n <span className=\"go-top-icon-v2 icon\">\n <ion-icon name=\"football-outline\" style={{ paddingRight: 2 }}></ion-icon>\n </span>\n <span className=\"go-top-header\">Nahoru</span>\n </a>\n </div>\n );\n};\n\nconst PremiumLayout: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const { data: settings } = usePublicSettings();\n const theme = useClubTheme();\n\n // Map club colors into Sparta CSS variables\n React.useEffect(() => {\n try {\n const root = document.documentElement as HTMLElement;\n root.style.setProperty('--colorAccent', theme.primaryColor);\n root.style.setProperty('--colorAccentHover', theme.secondaryColor || theme.primaryColor);\n root.style.setProperty('--colorBgPrimary', '#0e0e0e');\n root.style.setProperty('--colorBgSecondary', '#181818');\n root.style.setProperty('--colorBgTertiary', '#202020');\n root.style.setProperty('--colorTextPrimary', '#ffffff');\n root.style.setProperty('--colorTextSecondary', 'rgba(255,255,255,0.72)');\n root.style.setProperty('--colorBorder', 'rgba(255,255,255,0.16)');\n } catch {}\n }, [theme.primaryColor, theme.secondaryColor]);\n\n // Ensure Sparta style-pack is active while premium layout is mounted\n React.useEffect(() => {\n try {\n const all = ['style-pack-default', 'style-pack-modern', 'style-pack-minimal', 'style-pack-sparta'];\n all.forEach((c) => document.body.classList.remove(c));\n document.body.classList.add('style-pack-sparta');\n } catch {}\n return () => {\n try {\n document.body.classList.remove('style-pack-sparta');\n } catch {}\n };\n }, []);\n\n return (\n <Box minH=\"100vh\" bg=\"var(--colorBgPrimary, #0e0e0e)\" color=\"var(--colorTextPrimary, #ffffff)\">\n <Box as=\"header\">\n <SpartaNavbar />\n </Box>\n <Container maxW=\"container.xl\" py={8}>\n {children}\n </Container>\n <Box as=\"section\" mt={4}>\n <SponsorsSection layout=\"grid\" theme=\"dark\" />\n </Box>\n <Box as=\"footer\" mt={0}>\n <Footer />\n </Box>\n </Box>\n );\n};\n\nexport default PremiumLayout;\n","import React, { useMemo } from 'react';\nimport {\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalCloseButton,\n ModalBody,\n ModalFooter,\n Button,\n HStack,\n VStack,\n Text,\n Badge,\n Link,\n Divider,\n Box,\n Grid,\n Flex,\n Image,\n} from '@chakra-ui/react';\nimport { useCountdown } from '../../hooks/useCountdown';\nimport { useSettings } from '@/hooks/useSettings';\nimport { assetUrl, sanitizeClubName } from '../../utils/url';\nimport { TeamLogo } from '../common/TeamLogo';\nimport MatchWeather from '../common/MatchWeather';\nimport { format, parse } from 'date-fns';\nimport { cs } from 'date-fns/locale';\n\nconst parseScore = (score?: string | null): { h: number; a: number } | null => {\n if (!score) return null;\n const m = score.match(/^(\\d+)\\s*[:\\-]\\s*(\\d+)$/);\n if (!m) return null;\n return { h: parseInt(m[1], 10), a: parseInt(m[2], 10) };\n};\n\nexport type FacrMatchLike = {\n id?: string | number;\n date?: string; // yyyy-mm-dd\n time?: string; // HH:MM\n date_time?: string; // alternative combined format (dd.MM.yyyy HH:mm)\n home?: string;\n away?: string;\n home_logo_url?: string;\n away_logo_url?: string;\n home_id?: string;\n away_id?: string;\n competition?: string;\n competitionName?: string;\n venue?: string;\n score?: string | null;\n facr_link?: string | null;\n report_url?: string | null;\n};\n\ninterface MatchModalProps {\n isOpen: boolean;\n match: FacrMatchLike | null;\n onClose: () => void;\n onTeamClick?: (teamName: string, teamLogoUrl?: string) => void;\n}\n\nconst formatWhen = (m: FacrMatchLike | null) => {\n if (!m) return '';\n try {\n if (m.date && m.time) {\n const d = new Date(`${m.date}T${(m.time || '00:00')}:00`);\n if (!isNaN(d.getTime())) return d.toLocaleString();\n }\n if (m.date_time) {\n // Try to parse dd.MM.yyyy HH:mm quickly by reordering\n const dt = String(m.date_time);\n const [dPart, tPart] = dt.split(' ');\n const [dd, MM, yyyy] = (dPart || '').split('.');\n if (dd && MM && yyyy) {\n const iso = `${yyyy}-${MM.padStart(2, '0')}-${dd.padStart(2, '0')}T${(tPart || '00:00')}:00`;\n const d = new Date(iso);\n if (!isNaN(d.getTime())) return d.toLocaleString();\n }\n return m.date_time;\n }\n } catch {}\n return '';\n};\n\nexport const MatchModal: React.FC<MatchModalProps> = ({ isOpen, match, onClose, onTeamClick }) => {\n const { settings } = useSettings();\n \n const kickoffIso = useMemo(() => {\n if (!match) return null;\n if (match.date && match.time) return `${match.date}T${(match.time || '00:00')}:00`;\n if (match.date_time) {\n const dt = String(match.date_time);\n const [dPart, tPart] = dt.split(' ');\n const [dd, MM, yyyy] = (dPart || '').split('.');\n if (dd && MM && yyyy) return `${yyyy}-${MM.padStart(2, '0')}-${dd.padStart(2, '0')}T${(tPart || '00:00')}:00`;\n return match.date_time; // fallback\n }\n return null;\n }, [match]);\n\n const { countdownString, isActive, timeRemaining } = useCountdown(kickoffIso, 1000);\n const facrLink = match?.facr_link || match?.report_url || null;\n const when = formatWhen(match);\n\n // Determine if match has started (countdown finished) but no score yet\n const matchStarted = kickoffIso ? new Date(kickoffIso).getTime() <= Date.now() : false;\n const hasScore = match?.score && match.score.trim() !== '';\n\n // Check if this is a home match\n const isHomeMatch = useMemo(() => {\n if (!match?.home || !settings) return false;\n const homeTeam = sanitizeClubName(match.home).toLowerCase();\n const clubName = sanitizeClubName((settings as any)?.club_name || '').toLowerCase();\n return homeTeam.includes(clubName) || clubName.includes(homeTeam);\n }, [match, settings]);\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} isCentered size=\"lg\" returnFocusOnClose={false}>\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>\n {sanitizeClubName(match?.home) || 'Domácí'} vs {sanitizeClubName(match?.away) || 'Hosté'}\n </ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n {match && (\n <VStack align=\"stretch\" spacing={4}>\n {/* Show match status (Výhra/Remíza/Prohra) if determinable; otherwise fall back to competition name */}\n {(() => {\n const isPast = kickoffIso ? new Date(kickoffIso).getTime() <= Date.now() : false;\n const hasScore = match?.score && match.score.trim() !== '';\n \n if (!isPast) {\n // Future match - show competition name\n const compName = match.competition || match.competitionName;\n if (compName && compName !== 'Všechny soutěže') {\n return (\n <Flex justify=\"center\">\n <Badge colorScheme=\"purple\">{compName}</Badge>\n </Flex>\n );\n }\n } else if (hasScore) {\n // Past match with score - show sentiment\n const s = parseScore(match.score);\n if (s) {\n const ourIsHome = settings && match.home && (\n sanitizeClubName(match.home).toLowerCase().includes(sanitizeClubName((settings as any)?.club_name || '').toLowerCase()) ||\n sanitizeClubName((settings as any)?.club_name || '').toLowerCase().includes(sanitizeClubName(match.home).toLowerCase())\n );\n const ourIsAway = settings && match.away && (\n sanitizeClubName(match.away).toLowerCase().includes(sanitizeClubName((settings as any)?.club_name || '').toLowerCase()) ||\n sanitizeClubName((settings as any)?.club_name || '').toLowerCase().includes(sanitizeClubName(match.away).toLowerCase())\n );\n \n if (ourIsHome || ourIsAway) {\n const ourGoals = ourIsHome ? s.h : s.a;\n const oppGoals = ourIsHome ? s.a : s.h;\n let label = 'Remíza';\n let color = 'blue';\n if (ourGoals > oppGoals) { label = 'Výhra'; color = 'green'; }\n else if (ourGoals < oppGoals) { label = 'Prohra'; color = 'red'; }\n \n return (\n <Flex justify=\"center\">\n <Badge colorScheme={color as any} variant=\"subtle\">{label}</Badge>\n </Flex>\n );\n }\n }\n }\n return null;\n })()}\n <Flex align=\"center\" justify=\"center\" gap={3}>\n {match.home_logo_url && (\n <Image \n src={match.home_logo_url} \n alt={match.home} \n boxSize=\"40px\" \n borderRadius=\"full\"\n cursor=\"pointer\"\n onClick={() => onTeamClick && onTeamClick(match.home || '', match.home_logo_url)}\n _hover={{ opacity: 0.8, transform: 'scale(1.1)' }}\n transition=\"all 0.2s\"\n title={`Klikněte pro zobrazení statistik: ${match.home}`}\n />\n )}\n {(() => {\n const isPast = kickoffIso ? new Date(kickoffIso).getTime() <= Date.now() : false;\n const hasScore = Boolean(match.score);\n \n // For future matches, always show countdown or \"vs\" - never score\n if (!isPast) {\n if (isActive && countdownString) {\n return (\n <Badge colorScheme=\"orange\" fontSize=\"md\" px={3} py={1}>za {countdownString}</Badge>\n );\n }\n return (\n <Badge colorScheme=\"gray\" fontSize=\"md\" px={3} py={1}>vs</Badge>\n );\n }\n \n // For past matches, show score or \"vs\"\n return (\n <Badge colorScheme={hasScore ? 'gray' : 'gray'} fontSize=\"md\" px={3} py={1}>\n {hasScore ? match.score : 'vs'}\n </Badge>\n );\n })()}\n {match.away_logo_url && (\n <Image \n src={match.away_logo_url} \n alt={match.away} \n boxSize=\"40px\" \n borderRadius=\"full\"\n cursor=\"pointer\"\n onClick={() => onTeamClick && onTeamClick(match.away || '', match.away_logo_url)}\n _hover={{ opacity: 0.8, transform: 'scale(1.1)' }}\n transition=\"all 0.2s\"\n title={`Klikněte pro zobrazení statistik: ${match.away}`}\n />\n )}\n </Flex>\n\n <Divider />\n\n {/* Date and Time Display with Countdown */}\n <Box textAlign=\"center\">\n <Text fontSize=\"lg\" fontWeight=\"semibold\" color=\"gray.800\" mb={1}>\n {(() => {\n try {\n // Try multiple date formats and use Czech locale\n if (match.date) {\n let dateObj: Date;\n // Try yyyy-MM-dd format first\n const parsed1 = parse(match.date, 'yyyy-MM-dd', new Date());\n if (!isNaN(parsed1.getTime())) {\n dateObj = parsed1;\n } else {\n // Try dd.MM.yyyy format\n const parsed2 = parse(match.date, 'dd.MM.yyyy', new Date());\n if (!isNaN(parsed2.getTime())) {\n dateObj = parsed2;\n } else {\n return match.date;\n }\n }\n return format(dateObj, 'EEEE d. MMMM yyyy', { locale: cs });\n }\n return '';\n } catch (error) {\n console.error('Date formatting error:', error);\n return match.date || '';\n }\n })()}\n </Text>\n <Text fontSize=\"md\" color=\"gray.700\">\n {match.time || '—'}\n </Text>\n </Box>\n\n {/* Enhanced Countdown Display for Upcoming Matches */}\n {(() => {\n const isPast = kickoffIso ? new Date(kickoffIso).getTime() <= Date.now() : false;\n const hasScore = Boolean(match.score);\n \n if (!hasScore && !isPast && isActive && timeRemaining && timeRemaining > 0) {\n const days = Math.floor(timeRemaining / (24 * 60 * 60 * 1000));\n const hours = Math.floor((timeRemaining % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000));\n const minutes = Math.floor((timeRemaining % (60 * 60 * 1000)) / (60 * 1000));\n const seconds = Math.floor((timeRemaining % (60 * 1000)) / 1000);\n \n return (\n <Box \n mt={4} \n p={4} \n bg=\"orange.50\" \n borderRadius=\"lg\" \n borderWidth=\"2px\" \n borderColor=\"orange.200\"\n >\n <Text fontSize=\"sm\" fontWeight=\"semibold\" color=\"orange.800\" mb={3} textAlign=\"center\">\n Zápas začíná za\n </Text>\n <Grid \n templateColumns={days > 0 ? \"repeat(4, 1fr)\" : \"repeat(3, 1fr)\"} \n gap={3}\n >\n {days > 0 && (\n <Box textAlign=\"center\">\n <Box \n bg=\"white\" \n borderRadius=\"md\" \n p={3} \n borderWidth=\"1px\" \n borderColor=\"orange.300\"\n boxShadow=\"sm\"\n >\n <Text fontSize=\"2xl\" fontWeight=\"bold\" color=\"orange.600\">\n {days}\n </Text>\n </Box>\n <Text fontSize=\"xs\" color=\"gray.600\" mt={1} fontWeight=\"medium\">\n {days === 1 ? 'den' : days < 5 ? 'dny' : 'dní'}\n </Text>\n </Box>\n )}\n <Box textAlign=\"center\">\n <Box \n bg=\"white\" \n borderRadius=\"md\" \n p={3} \n borderWidth=\"1px\" \n borderColor=\"orange.300\"\n boxShadow=\"sm\"\n >\n <Text fontSize=\"2xl\" fontWeight=\"bold\" color=\"orange.600\">\n {String(hours).padStart(2, '0')}\n </Text>\n </Box>\n <Text fontSize=\"xs\" color=\"gray.600\" mt={1} fontWeight=\"medium\">\n {hours === 1 ? 'hodina' : hours < 5 ? 'hodiny' : 'hodin'}\n </Text>\n </Box>\n <Box textAlign=\"center\">\n <Box \n bg=\"white\" \n borderRadius=\"md\" \n p={3} \n borderWidth=\"1px\" \n borderColor=\"orange.300\"\n boxShadow=\"sm\"\n >\n <Text fontSize=\"2xl\" fontWeight=\"bold\" color=\"orange.600\">\n {String(minutes).padStart(2, '0')}\n </Text>\n </Box>\n <Text fontSize=\"xs\" color=\"gray.600\" mt={1} fontWeight=\"medium\">\n {minutes === 1 ? 'minuta' : minutes < 5 ? 'minuty' : 'minut'}\n </Text>\n </Box>\n <Box textAlign=\"center\">\n <Box \n bg=\"white\" \n borderRadius=\"md\" \n p={3} \n borderWidth=\"1px\" \n borderColor=\"orange.300\"\n boxShadow=\"sm\"\n >\n <Text fontSize=\"2xl\" fontWeight=\"bold\" color=\"orange.600\">\n {String(seconds).padStart(2, '0')}\n </Text>\n </Box>\n <Text fontSize=\"xs\" color=\"gray.600\" mt={1} fontWeight=\"medium\">\n {seconds === 1 ? 'sekunda' : seconds < 5 ? 'sekundy' : 'sekund'}\n </Text>\n </Box>\n </Grid>\n </Box>\n );\n }\n return null;\n })()}\n \n <Box h=\"1px\" bg=\"gray.200\" />\n \n {/* Venue information */}\n {match.venue && (\n <Text fontSize=\"md\" color=\"gray.700\" textAlign=\"center\">\n <strong>Kde:</strong> {match.venue}\n </Text>\n )}\n \n {/* Weather widget for home matches that haven't started */}\n {(() => {\n const isPast = kickoffIso ? new Date(kickoffIso).getTime() <= Date.now() : false;\n const hasScore = Boolean(match.score);\n \n if (isHomeMatch && !isPast && !hasScore) {\n return (\n <Box>\n <MatchWeather\n matchDateTime={kickoffIso || ''}\n venue={match.venue}\n isHomeMatch={true}\n matchHasStarted={false}\n />\n </Box>\n );\n }\n return null;\n })()}\n </VStack>\n )}\n </ModalBody>\n <ModalFooter>\n {facrLink && (\n <Button \n colorScheme=\"blue\" \n mr={3}\n onClick={(e) => {\n e.preventDefault();\n // Open in background tab without switching focus\n const link = document.createElement('a');\n link.href = facrLink;\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }}\n >\n Detail na FAČR\n </Button>\n )}\n <Button onClick={onClose}>Zavřít</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n );\n};\n\nexport default MatchModal;\n","import React, { useState } from 'react';\nimport {\n Box,\n FormControl,\n FormLabel,\n Select,\n SimpleGrid,\n Text,\n VStack,\n Badge,\n Image,\n HStack,\n useColorModeValue,\n} from '@chakra-ui/react';\nimport { MAP_STYLES } from '../home/ContactMap';\nimport ContactMap from '../home/ContactMap';\n\ninterface MapStyleSelectorProps {\n value: string;\n onChange: (value: string) => void;\n clubPrimaryColor?: string;\n clubSecondaryColor?: string;\n showPreview?: boolean;\n}\n\nconst MapStyleSelector: React.FC<MapStyleSelectorProps> = ({\n value,\n onChange,\n clubPrimaryColor,\n clubSecondaryColor,\n showPreview = true,\n}) => {\n const previewBg = useColorModeValue('gray.50', 'gray.700');\n const tipsBg = useColorModeValue('blue.50', 'blue.900');\n const tipsBorder = useColorModeValue('blue.200', 'blue.700');\n const textColor = useColorModeValue('gray.700', 'gray.300');\n const secondaryText = useColorModeValue('gray.600', 'gray.400');\n const selectBg = useColorModeValue('white', 'gray.700');\n const styleCategories = {\n 'Light & Minimal': ['positron', 'positron-no-labels', 'default'],\n 'Dark Themes': ['dark', 'dark-no-labels'],\n 'Black & White': ['toner', 'toner-lite'],\n 'Colorful': ['voyager', 'terrain', 'watercolor'],\n 'Satellite': ['satellite'],\n };\n\n const selectedStyle = MAP_STYLES[value as keyof typeof MAP_STYLES] || MAP_STYLES.default;\n\n return (\n <VStack align=\"stretch\" spacing={4}>\n <FormControl>\n <FormLabel>Styl mapy</FormLabel>\n <Select value={value} onChange={(e) => onChange(e.target.value)} bg={selectBg}>\n {Object.entries(styleCategories).map(([category, styles]) => (\n <optgroup key={category} label={category}>\n {styles.map((styleKey) => {\n const style = MAP_STYLES[styleKey as keyof typeof MAP_STYLES];\n return (\n <option key={styleKey} value={styleKey}>\n {style.name}\n </option>\n );\n })}\n </optgroup>\n ))}\n </Select>\n </FormControl>\n\n {showPreview && (\n <VStack align=\"stretch\" spacing={3}>\n <Box\n p={4}\n borderWidth=\"1px\"\n borderRadius=\"md\"\n bg={previewBg}\n >\n <VStack align=\"stretch\" spacing={3}>\n <HStack justify=\"space-between\">\n <Text fontWeight=\"semibold\">{selectedStyle.name}</Text>\n <Badge colorScheme=\"blue\">Náhled stylu</Badge>\n </HStack>\n <Text fontSize=\"sm\" color={secondaryText}>\n {selectedStyle.description}\n </Text>\n \n {clubPrimaryColor && (\n <Box>\n <Text fontSize=\"sm\" fontWeight=\"medium\" mb={2}>\n Barvy klubu:\n </Text>\n <HStack>\n <Box\n w=\"40px\"\n h=\"40px\"\n borderRadius=\"md\"\n bg={clubPrimaryColor}\n borderWidth=\"1px\"\n borderColor=\"gray.300\"\n />\n {clubSecondaryColor && (\n <Box\n w=\"40px\"\n h=\"40px\"\n borderRadius=\"md\"\n bg={clubSecondaryColor}\n borderWidth=\"1px\"\n borderColor=\"gray.300\"\n />\n )}\n <Text fontSize=\"xs\" color={secondaryText}>\n Použity pro marker a overlay\n </Text>\n </HStack>\n </Box>\n )}\n </VStack>\n </Box>\n \n {/* Interactive Map Preview */}\n <Box\n borderWidth=\"1px\"\n borderRadius=\"md\"\n overflow=\"hidden\"\n boxShadow=\"sm\"\n >\n <ContactMap\n latitude={50.0755}\n longitude={14.4378}\n zoom={13}\n address=\"Praha, Česká republika\"\n clubName=\"Náhled mapy\"\n mapStyle={value}\n clubPrimaryColor={clubPrimaryColor}\n clubSecondaryColor={clubSecondaryColor}\n height={300}\n />\n </Box>\n <Text fontSize=\"xs\" color={secondaryText} textAlign=\"center\">\n Náhled interaktivní mapy se zvoleným stylem\n </Text>\n </VStack>\n )}\n\n <Box\n p={3}\n bg={tipsBg}\n borderWidth=\"1px\"\n borderColor={tipsBorder}\n borderRadius=\"md\"\n >\n <Text fontSize=\"sm\" fontWeight=\"semibold\" mb={1}>\n 💡 Tipy pro výběr stylu:\n </Text>\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={2}>\n <Text fontSize=\"xs\" color={textColor}>\n • <strong>Positron/Toner Lite</strong> - nejlepší pro barevné markery\n </Text>\n <Text fontSize=\"xs\" color={textColor}>\n • <strong>Dark Matter</strong> - skvělé pro tmavý design\n </Text>\n <Text fontSize=\"xs\" color={textColor}>\n • <strong>Toner B&W</strong> - vysoký kontrast, elegantní\n </Text>\n <Text fontSize=\"xs\" color={textColor}>\n • <strong>Voyager</strong> - vyváženě pro všechny případy\n </Text>\n </SimpleGrid>\n </Box>\n\n <Text fontSize=\"xs\" color={secondaryText}>\n Všechny mapy jsou open-source a bezplatné.\n {clubPrimaryColor && ' Mapa bude automaticky obarvena barvami klubu.'}\n </Text>\n </VStack>\n );\n};\n\nexport default MapStyleSelector;\n","/**\n * Utility functions to parse map URLs from various sources\n * Supports: mapy.cz, Google Maps\n */\n\nexport interface MapCoordinates {\n latitude: number;\n longitude: number;\n zoom?: number;\n address?: string;\n source: 'mapy.cz' | 'google-maps' | 'unknown';\n // Detailed address components from reverse geocoding\n street?: string;\n houseNumber?: string;\n city?: string;\n zip?: string;\n country?: string;\n}\n\n/**\n * Parse mapy.cz URL\n * Example: mapy.cz/en/letecka?q=krnov%20stadion&source=firm&id=12954454&ds=2&x=17.6996859&y=50.0947150&z=19\n */\nexport function parseMapyCzUrl(url: string): MapCoordinates | null {\n try {\n const urlObj = new URL(url);\n \n // Check if it's a mapy.cz domain\n if (!urlObj.hostname.includes('mapy.cz') && !urlObj.hostname.includes('mapy.com')) {\n return null;\n }\n\n const params = urlObj.searchParams;\n const xParam = params.get('x');\n const yParam = params.get('y');\n const zParam = params.get('z');\n const qParam = params.get('q');\n\n if (xParam && yParam) {\n const longitude = parseFloat(xParam);\n const latitude = parseFloat(yParam);\n const zoom = zParam ? parseInt(zParam) : undefined;\n\n if (isNaN(latitude) || isNaN(longitude)) {\n return null;\n }\n\n return {\n latitude,\n longitude,\n zoom,\n address: qParam ? decodeURIComponent(qParam) : undefined,\n source: 'mapy.cz',\n };\n }\n\n return null;\n } catch (error) {\n console.error('Error parsing mapy.cz URL:', error);\n return null;\n }\n}\n\n/**\n * Parse Google Maps URL\n * Supports various formats:\n * - /maps/place/.../@lat,lng,zoom\n * - /maps?q=lat,lng\n * - /maps/@lat,lng,zoom\n */\nexport function parseGoogleMapsUrl(url: string): MapCoordinates | null {\n try {\n const urlObj = new URL(url);\n \n // Check if it's a Google Maps domain\n if (!urlObj.hostname.includes('google.com') && !urlObj.hostname.includes('google.cz')) {\n return null;\n }\n\n // Try to extract from pathname (/@lat,lng,zoom format)\n const pathMatch = urlObj.pathname.match(/@(-?\\d+\\.\\d+),(-?\\d+\\.\\d+),(\\d+)z/);\n if (pathMatch) {\n const latitude = parseFloat(pathMatch[1]);\n const longitude = parseFloat(pathMatch[2]);\n const zoom = parseInt(pathMatch[3]);\n\n if (!isNaN(latitude) && !isNaN(longitude)) {\n // Try to extract place name from pathname\n const placeMatch = urlObj.pathname.match(/\\/place\\/([^/]+)/);\n const address = placeMatch ? decodeURIComponent(placeMatch[1].replace(/\\+/g, ' ')) : undefined;\n\n return {\n latitude,\n longitude,\n zoom: !isNaN(zoom) ? zoom : undefined,\n address,\n source: 'google-maps',\n };\n }\n }\n\n // Try to extract from query parameters\n const params = urlObj.searchParams;\n const qParam = params.get('q');\n \n if (qParam) {\n // Check if q parameter contains coordinates (lat,lng format)\n const coordMatch = qParam.match(/(-?\\d+\\.\\d+),(-?\\d+\\.\\d+)/);\n if (coordMatch) {\n const latitude = parseFloat(coordMatch[1]);\n const longitude = parseFloat(coordMatch[2]);\n\n if (!isNaN(latitude) && !isNaN(longitude)) {\n return {\n latitude,\n longitude,\n address: qParam.includes(',') ? undefined : qParam,\n source: 'google-maps',\n };\n }\n }\n }\n\n // Try data parameter (some Google Maps links use this)\n const dataMatch = urlObj.pathname.match(/!3d(-?\\d+\\.\\d+)!4d(-?\\d+\\.\\d+)/);\n if (dataMatch) {\n const latitude = parseFloat(dataMatch[1]);\n const longitude = parseFloat(dataMatch[2]);\n\n if (!isNaN(latitude) && !isNaN(longitude)) {\n return {\n latitude,\n longitude,\n source: 'google-maps',\n };\n }\n }\n\n return null;\n } catch (error) {\n console.error('Error parsing Google Maps URL:', error);\n return null;\n }\n}\n\n/**\n * Main function to parse any supported map URL\n */\nexport function parseMapUrl(url: string): MapCoordinates | null {\n if (!url || typeof url !== 'string') {\n return null;\n }\n\n // Normalize the URL (add protocol if missing)\n let normalizedUrl = url.trim();\n if (!normalizedUrl.startsWith('http://') && !normalizedUrl.startsWith('https://')) {\n normalizedUrl = 'https://' + normalizedUrl;\n }\n\n // Try parsing as mapy.cz\n const mapyCzResult = parseMapyCzUrl(normalizedUrl);\n if (mapyCzResult) {\n return mapyCzResult;\n }\n\n // Try parsing as Google Maps\n const googleMapsResult = parseGoogleMapsUrl(normalizedUrl);\n if (googleMapsResult) {\n return googleMapsResult;\n }\n\n return null;\n}\n\n/**\n * Validate if coordinates are within valid ranges\n */\nexport function validateCoordinates(lat: number, lng: number): boolean {\n return (\n !isNaN(lat) &&\n !isNaN(lng) &&\n lat >= -90 &&\n lat <= 90 &&\n lng >= -180 &&\n lng <= 180\n );\n}\n\n/**\n * Reverse geocode coordinates to get detailed address information\n * Uses Nominatim API (OpenStreetMap)\n */\nexport async function reverseGeocode(lat: number, lng: number): Promise<Partial<MapCoordinates>> {\n try {\n const response = await fetch(\n `https://nominatim.openstreetmap.org/reverse?format=json&lat=${lat}&lon=${lng}&addressdetails=1&accept-language=cs`,\n {\n headers: {\n 'User-Agent': 'FotbalClub/1.0',\n },\n }\n );\n\n if (!response.ok) {\n throw new Error('Reverse geocoding failed');\n }\n\n const data = await response.json();\n const addr = data.address || {};\n\n return {\n address: data.display_name,\n street: addr.road || addr.street || addr.pedestrian || addr.footway,\n houseNumber: addr.house_number,\n city: addr.city || addr.town || addr.village || addr.municipality,\n zip: addr.postcode,\n country: addr.country || 'Česká republika',\n };\n } catch (error) {\n console.error('Reverse geocoding error:', error);\n return {};\n }\n}\n","import React, { useState, useEffect } from 'react';\nimport {\n Box,\n Button,\n FormControl,\n FormLabel,\n FormHelperText,\n Input,\n VStack,\n HStack,\n Text,\n Alert,\n AlertIcon,\n AlertTitle,\n AlertDescription,\n Badge,\n Divider,\n Link,\n useColorModeValue,\n} from '@chakra-ui/react';\nimport MapStyleSelector from './MapStyleSelector';\nimport { FiMapPin, FiCheck, FiX, FiExternalLink } from 'react-icons/fi';\nimport { parseMapUrl, MapCoordinates, validateCoordinates, reverseGeocode } from '../../utils/mapUrlParser';\nimport ContactMap from '../home/ContactMap';\n\ninterface MapLinkImporterProps {\n onImport: (coordinates: MapCoordinates) => void;\n currentLatitude?: number;\n currentLongitude?: number;\n currentZoom?: number;\n mapStyle?: string;\n onMapStyleChange?: (style: string) => void;\n clubPrimaryColor?: string;\n clubSecondaryColor?: string;\n clubName?: string;\n}\n\nconst MapLinkImporter: React.FC<MapLinkImporterProps> = ({\n onImport,\n currentLatitude,\n currentLongitude,\n currentZoom,\n mapStyle,\n onMapStyleChange,\n clubPrimaryColor,\n clubSecondaryColor,\n clubName,\n}) => {\n const [urlInput, setUrlInput] = useState('');\n const [parsedData, setParsedData] = useState<MapCoordinates | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [previewCoords, setPreviewCoords] = useState<MapCoordinates | null>(null);\n\n const bgColor = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n\n useEffect(() => {\n // Initialize preview with current coordinates if available\n if (currentLatitude && currentLongitude) {\n setPreviewCoords({\n latitude: currentLatitude,\n longitude: currentLongitude,\n zoom: currentZoom,\n source: 'unknown',\n });\n }\n }, [currentLatitude, currentLongitude, currentZoom]);\n\n const handleUrlChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setUrlInput(value);\n setError(null);\n setParsedData(null);\n\n if (!value.trim()) {\n return;\n }\n\n // Try to parse the URL\n const result = parseMapUrl(value);\n if (result) {\n if (validateCoordinates(result.latitude, result.longitude)) {\n // Perform reverse geocoding to get detailed address\n try {\n const addressDetails = await reverseGeocode(result.latitude, result.longitude);\n const enrichedResult = { ...result, ...addressDetails };\n setParsedData(enrichedResult);\n setPreviewCoords(enrichedResult);\n setError(null);\n } catch (err) {\n // If geocoding fails, still use the basic data\n setParsedData(result);\n setPreviewCoords(result);\n setError(null);\n }\n } else {\n setError('Souřadnice jsou mimo platný rozsah');\n setParsedData(null);\n }\n } else {\n setError('Nepodařilo se rozpoznat URL mapy. Podporované: mapy.cz, Google Maps');\n setParsedData(null);\n }\n };\n\n const handleImport = () => {\n if (parsedData) {\n onImport(parsedData);\n setUrlInput('');\n setParsedData(null);\n setError(null);\n }\n };\n\n const handleClear = () => {\n setUrlInput('');\n setParsedData(null);\n setError(null);\n // Reset preview to current coordinates\n if (currentLatitude && currentLongitude) {\n setPreviewCoords({\n latitude: currentLatitude,\n longitude: currentLongitude,\n zoom: currentZoom,\n source: 'unknown',\n });\n } else {\n setPreviewCoords(null);\n }\n };\n\n return (\n <VStack spacing={4} align=\"stretch\">\n <Box>\n <FormControl>\n <FormLabel display=\"flex\" alignItems=\"center\" gap={2}>\n <FiMapPin /> Importovat z URL mapy\n </FormLabel>\n <Input\n placeholder=\"Vložte URL z mapy.cz nebo Google Maps...\"\n value={urlInput}\n onChange={handleUrlChange}\n size=\"md\"\n />\n <HStack mt={2} spacing={3} fontSize=\"sm\">\n <Text color=\"gray.600\">Rychlé odkazy:</Text>\n <Link\n href=\"https://mapy.com/cs/\"\n isExternal\n color=\"blue.500\"\n display=\"flex\"\n alignItems=\"center\"\n gap={1}\n _hover={{ color: 'blue.600', textDecoration: 'underline' }}\n >\n Mapy.cz <FiExternalLink size={12} />\n </Link>\n <Text color=\"gray.400\">•</Text>\n <Link\n href=\"https://www.google.com/maps/\"\n isExternal\n color=\"blue.500\"\n display=\"flex\"\n alignItems=\"center\"\n gap={1}\n _hover={{ color: 'blue.600', textDecoration: 'underline' }}\n >\n Google Maps <FiExternalLink size={12} />\n </Link>\n </HStack>\n </FormControl>\n\n {parsedData && (\n <Alert status=\"success\" mt={3} borderRadius=\"md\">\n <AlertIcon />\n <Box flex=\"1\">\n <AlertTitle>Úspěšně rozpoznáno!</AlertTitle>\n <AlertDescription display=\"block\">\n <VStack align=\"start\" spacing={1} mt={2}>\n <HStack>\n <Badge colorScheme=\"green\">\n {parsedData.source === 'mapy.cz' ? 'Mapy.cz' : 'Google Maps'}\n </Badge>\n </HStack>\n <Text fontSize=\"sm\">\n <strong>Šířka:</strong> {parsedData.latitude.toFixed(7)}\n </Text>\n <Text fontSize=\"sm\">\n <strong>Délka:</strong> {parsedData.longitude.toFixed(7)}\n </Text>\n {parsedData.zoom && (\n <Text fontSize=\"sm\">\n <strong>Zoom:</strong> {parsedData.zoom}\n </Text>\n )}\n {parsedData.street && (\n <Text fontSize=\"sm\">\n <strong>Ulice:</strong> {parsedData.street}\n </Text>\n )}\n {parsedData.city && (\n <Text fontSize=\"sm\">\n <strong>Město:</strong> {parsedData.city}\n </Text>\n )}\n {parsedData.zip && (\n <Text fontSize=\"sm\">\n <strong>PSČ:</strong> {parsedData.zip}\n </Text>\n )}\n {parsedData.country && (\n <Text fontSize=\"sm\">\n <strong>Země:</strong> {parsedData.country}\n </Text>\n )}\n {parsedData.address && (\n <Text fontSize=\"sm\">\n <strong>Celá adresa:</strong> {parsedData.address}\n </Text>\n )}\n </VStack>\n </AlertDescription>\n </Box>\n <HStack ml={2}>\n <Button\n leftIcon={<FiCheck />}\n colorScheme=\"green\"\n size=\"sm\"\n onClick={handleImport}\n >\n Importovat\n </Button>\n <Button\n leftIcon={<FiX />}\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleClear}\n >\n Zrušit\n </Button>\n </HStack>\n </Alert>\n )}\n\n {error && (\n <Alert status=\"error\" mt={3} borderRadius=\"md\">\n <AlertIcon />\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n </Box>\n\n {/* Map Preview */}\n {previewCoords && (\n <>\n <Divider />\n <Box>\n <Text fontWeight=\"semibold\" mb={2}>\n Náhled mapy\n </Text>\n <Box\n borderRadius=\"md\"\n overflow=\"hidden\"\n borderWidth=\"1px\"\n borderColor={borderColor}\n minH=\"300px\"\n >\n <ContactMap\n latitude={previewCoords.latitude}\n longitude={previewCoords.longitude}\n zoom={previewCoords.zoom || 15}\n address={previewCoords.address}\n clubName={clubName}\n mapStyle={mapStyle || 'positron'}\n clubPrimaryColor={clubPrimaryColor}\n clubSecondaryColor={clubSecondaryColor}\n height={300}\n />\n </Box>\n <Text fontSize=\"xs\" color=\"gray.500\" mt={2}>\n Souřadnice: {previewCoords.latitude.toFixed(6)}, {previewCoords.longitude.toFixed(6)}\n {previewCoords.zoom && ` | Zoom: ${previewCoords.zoom}`}\n </Text>\n </Box>\n\n {/* Map Style Selector */}\n {onMapStyleChange && (\n <>\n <Divider />\n <Box>\n <Text fontWeight=\"semibold\" mb={2}>\n Styl mapy\n </Text>\n <Text fontSize=\"sm\" color=\"gray.600\" mb={3}>\n Vyberte vzhled mapy, který se zobrazí na vašem webu.\n </Text>\n <MapStyleSelector\n value={mapStyle || 'positron'}\n onChange={onMapStyleChange}\n clubPrimaryColor={clubPrimaryColor}\n clubSecondaryColor={clubSecondaryColor}\n showPreview={false}\n />\n </Box>\n </>\n )}\n </>\n )}\n\n {/* Show map even without preview if coordinates exist */}\n {!previewCoords && (currentLatitude && currentLongitude) && (\n <>\n <Divider />\n <Box>\n <Text fontWeight=\"semibold\" mb={2}>\n Náhled mapy\n </Text>\n <Box\n borderRadius=\"md\"\n overflow=\"hidden\"\n borderWidth=\"1px\"\n borderColor={borderColor}\n minH=\"300px\"\n >\n <ContactMap\n latitude={currentLatitude}\n longitude={currentLongitude}\n zoom={currentZoom || 15}\n address={undefined}\n clubName={clubName}\n mapStyle={mapStyle || 'positron'}\n clubPrimaryColor={clubPrimaryColor}\n clubSecondaryColor={clubSecondaryColor}\n height={300}\n />\n </Box>\n <Text fontSize=\"xs\" color=\"gray.500\" mt={2}>\n Souřadnice: {currentLatitude.toFixed(6)}, {currentLongitude.toFixed(6)}\n {currentZoom && ` | Zoom: ${currentZoom}`}\n </Text>\n </Box>\n </>\n )}\n\n </VStack>\n );\n};\n\nexport default MapLinkImporter;\n","import api from './api';\n\nexport type Category = {\n name: string;\n slug?: string;\n url?: string; // optional explicit URL override\n children?: { name: string; slug?: string; url?: string }[];\n};\n\nexport type CustomNavLink = {\n label: string;\n url: string;\n external?: boolean;\n};\n\nexport type PublicSettings = {\n frontpage_layout?: string;\n frontpage_style?: string;\n hero_style?: 'grid' | 'scroller' | 'swiper' | 'swiper_full';\n premium?: boolean;\n club_id?: string;\n club_type?: 'football' | 'futsal';\n club_name?: string; // preferred display name\n club_logo_url?: string; // high-quality PNG/SVG override\n primary_color?: string;\n secondary_color?: string;\n accent_color?: string;\n background_color?: string;\n text_color?: string;\n shop_url?: string; // external e-shop URL\n sponsors_layout?: 'grid' | 'slider' | 'scroller' | 'pyramid';\n sponsors_theme?: 'dark' | 'light';\n // Simple array of video URLs (legacy)\n videos?: string[];\n // Rich videos (preferred)\n videos_items?: Array<{\n url: string;\n title?: string;\n length?: string; // e.g. 3:45\n uploaded_at?: string; // ISO date\n thumbnail_url?: string;\n }>;\n facebook_url?: string;\n instagram_url?: string;\n youtube_url?: string;\n zonerama_url?: string;\n // Videos module\n videos_module_enabled?: boolean;\n videos_style?: 'slider' | 'grid3' | 'grid';\n videos_source?: 'auto' | 'manual';\n videos_limit?: number;\n // Auto videos title overrides (YouTube): video_id -> title\n videos_title_overrides?: Record<string, string>;\n // Merch module\n merch_module_enabled?: boolean;\n merch_style?: 'grid' | 'slider';\n merch_source?: 'manual' | 'auto';\n merch_limit?: number;\n merch_items?: Array<{\n title?: string;\n image_url: string;\n url?: string;\n }>;\n // generic gallery support (preferred). If provided, Navbar uses this instead of zonerama_url\n gallery_url?: string;\n gallery_label?: string; // default: \"Photos\"\n font_heading?: string;\n font_body?: string;\n custom_css?: string;\n custom_js?: string;\n custom_html_home?: string;\n custom_html_blog_list?: string;\n custom_html_blog_post?: string;\n // About/Club page\n about_html?: string;\n show_about_in_nav?: boolean;\n // Custom navigation links managed via admin settings\n custom_nav?: CustomNavLink[];\n // categories for top navigation (optional)\n categories?: Category[];\n // Map settings\n map_style?: 'default' | 'positron' | 'positron-no-labels' | 'dark' | 'dark-no-labels' | 'toner' | 'toner-lite' | 'voyager' | 'terrain' | 'watercolor' | 'satellite';\n // Club data mode: \"auto\" (FACR integration) or \"manual\" (no FACR scraping)\n club_data_mode?: 'auto' | 'manual';\n};\n\nexport type AdminSettings = PublicSettings & {\n id?: number;\n created_at?: string;\n updated_at?: string;\n // SMTP configuration (admin-only)\n smtp_host?: string;\n smtp_port?: number;\n smtp_user?: string;\n smtp_password?: string;\n smtp_from?: string;\n smtp_from_name?: string;\n smtp_encryption?: 'tls' | 'ssl' | 'none';\n smtp_auth?: boolean;\n smtp_skip_verify?: boolean;\n // Newsletter defaults\n default_digest_type?: 'blogs' | 'events' | 'matches' | 'scores' | 'weekly';\n default_digest_competitions?: string;\n // Newsletter scheduling\n enable_weekly?: boolean;\n enable_match_reminders?: boolean;\n enable_results?: boolean;\n newsletter_weekly_day?: 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat';\n newsletter_weekly_hour?: number; // 0-23\n newsletter_reminder_lead_hours?: number; // default 48\n newsletter_quiet_start?: number; // 0-23\n newsletter_quiet_end?: number; // 0-23\n // Contact & Map settings\n contact_address?: string;\n contact_city?: string;\n contact_zip?: string;\n contact_country?: string;\n contact_phone?: string;\n contact_email?: string;\n location_latitude?: number;\n location_longitude?: number;\n map_zoom_level?: number;\n show_map_on_homepage?: boolean;\n frontend_base_url?: string;\n api_base_url?: string;\n // Homepage matches display configuration\n finished_match_display_days?: number; // Number of days to show finished matches with scores on homepage\n\n // Storage quota and thresholds\n storage_quota_mb?: number;\n storage_warn_threshold?: number;\n storage_critical_threshold?: number;\n\n // External error-review integration\n error_review_ingest_url?: string;\n error_review_ingest_token?: string;\n error_review_admin_url?: string;\n error_review_admin_token?: string;\n error_review_ui_url?: string;\n};\n\nexport const getPublicSettings = async (): Promise<PublicSettings> => {\n const res = await api.get('/settings');\n return res.data;\n};\n\nexport const getAdminSettings = async (): Promise<AdminSettings> => {\n const res = await api.get('/admin/settings');\n return res.data;\n};\n\nexport const updateAdminSettings = async (payload: Partial<AdminSettings>): Promise<AdminSettings> => {\n const res = await api.put('/admin/settings', payload);\n return res.data;\n};\n","import React from 'react';\nimport { Alert, AlertIcon, Box, Link, Spinner, Text, VStack } from '@chakra-ui/react';\nimport ContactMap from '../home/ContactMap';\nimport { getPublicSettings } from '../../services/settings';\n\ninterface EventLocationMapProps {\n location: string;\n title?: string;\n latitude?: number | null;\n longitude?: number | null;\n}\n\ntype GeocodeResult = {\n lat: number;\n lon: number;\n displayName: string;\n};\n\nconst NOMINATIM_BASE_URL = process.env.REACT_APP_NOMINATIM_URL || 'https://nominatim.openstreetmap.org';\nconst NOMINATIM_EMAIL = process.env.REACT_APP_NOMINATIM_EMAIL;\n\nconst geocodeCache = new Map<string, GeocodeResult>();\n\nasync function geocodeLocation(query: string, signal: AbortSignal): Promise<GeocodeResult> {\n const cacheKey = query.trim().toLowerCase();\n if (geocodeCache.has(cacheKey)) {\n return geocodeCache.get(cacheKey)!;\n }\n\n const params = new URLSearchParams({\n format: 'jsonv2',\n limit: '1',\n q: query,\n 'accept-language': 'cs',\n });\n\n if (NOMINATIM_EMAIL) {\n params.append('email', NOMINATIM_EMAIL);\n }\n\n const endpoint = `${NOMINATIM_BASE_URL}/search?${params.toString()}`;\n const response = await fetch(endpoint, {\n headers: { Accept: 'application/json' },\n signal,\n });\n\n if (!response.ok) {\n throw new Error('Nepodařilo se načíst mapová data.');\n }\n\n const json = await response.json();\n if (!Array.isArray(json) || json.length === 0) {\n throw new Error('Poloha nebyla nalezena.');\n }\n\n const first = json[0];\n const lat = Number(first.lat);\n const lon = Number(first.lon);\n\n if (!Number.isFinite(lat) || !Number.isFinite(lon)) {\n throw new Error('Neplatné souřadnice.');\n }\n\n const result: GeocodeResult = {\n lat,\n lon,\n displayName: String(first.display_name || query),\n };\n geocodeCache.set(cacheKey, result);\n return result;\n}\n\nconst EventLocationMap: React.FC<EventLocationMapProps> = ({ location, title, latitude, longitude }) => {\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const [coords, setCoords] = React.useState<GeocodeResult | null>(null);\n const [settings, setSettings] = React.useState<any>(null);\n\n // Load settings for club colors\n React.useEffect(() => {\n getPublicSettings()\n .then(setSettings)\n .catch(() => {});\n }, []);\n\n React.useEffect(() => {\n const trimmed = (location || '').trim();\n if (!trimmed) {\n setCoords(null);\n setError(null);\n return;\n }\n\n // If coordinates are provided, use them directly\n if (latitude != null && longitude != null && Number.isFinite(latitude) && Number.isFinite(longitude)) {\n setCoords({\n lat: latitude,\n lon: longitude,\n displayName: trimmed,\n });\n setLoading(false);\n setError(null);\n return;\n }\n\n // Otherwise, geocode the location\n let active = true;\n const controller = new AbortController();\n setLoading(true);\n setError(null);\n\n geocodeLocation(trimmed, controller.signal)\n .then((result) => {\n if (!active) return;\n setCoords(result);\n })\n .catch((err: any) => {\n if (!active) return;\n setCoords(null);\n setError(err?.message || 'Mapu se nepodařilo načíst.');\n })\n .finally(() => {\n if (active) setLoading(false);\n });\n\n return () => {\n active = false;\n controller.abort();\n };\n }, [location, latitude, longitude]);\n\n if (!location?.trim()) {\n return null;\n }\n\n const encodedQuery = encodeURIComponent(location.trim());\n // Build external map URLs prefer coordinates when available, otherwise fallback to address search\n const openStreetMapUrl = coords\n ? `https://www.openstreetmap.org/?mlat=${coords.lat}&mlon=${coords.lon}#map=17/${coords.lat}/${coords.lon}`\n : `https://www.openstreetmap.org/search?query=${encodedQuery}`;\n const googleMapsUrl = coords\n ? `https://www.google.com/maps/search/?api=1&query=${coords.lat},${coords.lon}`\n : `https://www.google.com/maps/search/?api=1&query=${encodedQuery}`;\n const mapyCzUrl = coords\n ? `https://mapy.cz/zakladni?x=${coords.lon}&y=${coords.lat}&z=17`\n : `https://mapy.cz/zakladni?q=${encodedQuery}`;\n\n return (\n <VStack align=\"stretch\" spacing={3} mt={4} data-testid=\"event-location-map\">\n <Text fontWeight=\"semibold\" fontSize=\"lg\">Mapa místa</Text>\n\n {loading && (\n <HStackWithSpinner />\n )}\n\n {!loading && error && (\n <Alert status=\"error\" borderRadius=\"md\">\n <AlertIcon />\n <Box>\n <Text mb={1}>{error}</Text>\n <Text>\n <Link href={openStreetMapUrl} isExternal color=\"blue.400\">Otevřít v OpenStreetMap</Link>\n {' · '}\n <Link href={googleMapsUrl} isExternal color=\"blue.400\">Otevřít v Google Maps</Link>\n {' · '}\n <Link href={mapyCzUrl} isExternal color=\"blue.400\">Otevřít v Mapy.cz</Link>\n </Text>\n </Box>\n </Alert>\n )}\n\n {!loading && !error && coords && (\n <Box borderWidth=\"1px\" borderRadius=\"lg\" overflow=\"hidden\" borderColor=\"border.subtle\">\n <ContactMap\n latitude={coords.lat}\n longitude={coords.lon}\n zoom={15}\n address={coords.displayName}\n clubName={title}\n height={320}\n mapStyle={settings?.map_style || 'default'}\n clubPrimaryColor={settings?.primary_color}\n clubSecondaryColor={settings?.accent_color}\n />\n </Box>\n )}\n\n <Text fontSize=\"sm\" color=\"gray.500\">\n Přesnost určena pomocí otevřených mapových dat. Zobrazit v{' '}\n <Link href={openStreetMapUrl} isExternal color=\"blue.400\">OpenStreetMap</Link>\n {' · '}\n <Link href={googleMapsUrl} isExternal color=\"blue.400\">Google Maps</Link>\n {' · '}\n <Link href={mapyCzUrl} isExternal color=\"blue.400\">Mapy.cz</Link>\n </Text>\n </VStack>\n );\n};\n\nconst HStackWithSpinner: React.FC = () => (\n <Box display=\"flex\" alignItems=\"center\" gap={2} color=\"gray.500\">\n <Spinner size=\"sm\" />\n <Text>Načítám mapu…</Text>\n </Box>\n);\n\nexport default EventLocationMap;\n","import React from 'react';\nimport MainLayout from '../components/layout/MainLayout';\nimport { useParams, Link as RouterLink } from 'react-router-dom';\nimport { getEvent } from '../services/eventService';\nimport { Box, Container, Heading, Text, VStack, HStack, Badge, Spinner, Button, Image, Link as ChakraLink, Divider, Icon, useColorModeValue } from '@chakra-ui/react';\nimport { FiDownload, FiMapPin, FiClock } from 'react-icons/fi';\nimport DOMPurify from 'dompurify';\nimport { assetUrl } from '../utils/url';\nimport { API_URL } from '../services/api';\nimport { trackEvent as umamiTrackEvent } from '../utils/umami';\nimport EventLocationMap from '../components/events/EventLocationMap';\nimport EmbeddedPoll from '../components/polls/EmbeddedPoll';\nimport FilePreview from '../components/common/FilePreview';\nimport InstagramGeneratorButton from '../components/admin/InstagramGeneratorButton';\nimport CommentsSection from '../components/comments/CommentsSection';\n\nconst ActivityDetailPage: React.FC = () => {\n const { id } = useParams();\n const [loading, setLoading] = React.useState(true);\n const [error, setError] = React.useState<string | null>(null);\n const [data, setData] = React.useState<any>(null);\n\n React.useEffect(() => {\n let active = true;\n (async () => {\n try {\n if (!id) return;\n const ev = await getEvent(id);\n if (active) setData(ev);\n } catch (e: any) {\n if (active) setError(e?.message || 'Nelze načíst aktivitu');\n } finally {\n if (active) setLoading(false);\n }\n })();\n return () => { active = false; };\n }, [id]);\n\n const typeLabel = (t?: string) => t === 'match' ? 'Zápas' : t === 'training' ? 'Trénink' : t === 'meeting' ? 'Schůzka' : 'Jiné';\n const typeColor = (t?: string) => t === 'match' ? 'red' : t === 'training' ? 'blue' : t === 'meeting' ? 'green' : 'gray';\n\n // Delegate click tracking for links inside activity description\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n React.useEffect(() => {\n const el = contentRef.current;\n if (!el) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n const a = (target.closest ? target.closest('a') : null) as HTMLAnchorElement | null;\n if (a && a.href) {\n const href = a.getAttribute('href') || a.href;\n try { umamiTrackEvent('Link Click', { href, page: window.location.pathname, context: 'activity_content' }); } catch {}\n }\n };\n el.addEventListener('click', handler);\n return () => { el.removeEventListener('click', handler); };\n }, [contentRef.current]);\n\n // Normalize uploads links in rich HTML content to backend origin\n const toAbsoluteUploads = React.useCallback((html?: string) => {\n if (!html) return '';\n try {\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n return html\n .replace(/src=(\"|')\\s*(\\/uploads\\/[^\"']+)(\"')/g, (_m, q1, p2, q3) => `src=${q1}${origin}${p2}${q3}`)\n .replace(/href=(\"|')\\s*(\\/uploads\\/[^\"']+)(\"')/g, (_m, q1, p2, q3) => `href=${q1}${origin}${p2}${q3}`)\n .replace(/src=(\"|')\\s*https?:\\/\\/(?:localhost|127\\.0\\.0\\.1)(?::\\d+)?(\\/uploads\\/[^\"']+)(\"')/g, (_m, q1, p2, q3) => `src=${q1}${origin}${p2}${q3}`)\n .replace(/href=(\"|')\\s*https?:\\/\\/(?:localhost|127\\.0\\.0\\.1)(?::\\d+)?(\\/uploads\\/[^\"']+)(\"')/g, (_m, q1, p2, q3) => `href=${q1}${origin}${p2}${q3}`);\n } catch {\n return html || '';\n }\n }, []);\n\n // Extract YouTube video ID from various URL formats\n const getYouTubeEmbedUrl = (url: string): string | null => {\n if (!url) return null;\n \n // Already an embed URL\n if (url.includes('youtube.com/embed/')) {\n return url;\n }\n \n // Extract video ID from various formats\n let videoId: string | null = null;\n \n // Standard watch URL: https://www.youtube.com/watch?v=VIDEO_ID\n const watchMatch = url.match(/[?&]v=([^&#]+)/);\n if (watchMatch) {\n videoId = watchMatch[1];\n }\n \n // Short URL: https://youtu.be/VIDEO_ID\n const shortMatch = url.match(/youtu\\.be\\/([^?&#]+)/);\n if (shortMatch) {\n videoId = shortMatch[1];\n }\n \n // Embed URL: https://www.youtube.com/embed/VIDEO_ID\n const embedMatch = url.match(/youtube\\.com\\/embed\\/([^?&#]+)/);\n if (embedMatch) {\n videoId = embedMatch[1];\n }\n \n if (videoId) {\n return `https://www.youtube.com/embed/${videoId}`;\n }\n \n return null;\n };\n\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const mutedText = useColorModeValue('gray.600', 'gray.300');\n const linkColor = useColorModeValue('blue.600', 'blue.300');\n const linkHoverColor = useColorModeValue('blue.700', 'blue.200');\n const blockquoteText = useColorModeValue('#4a5568', '#cbd5e0');\n const blockquoteBg = useColorModeValue('#f7fafc', '#1a202c');\n\n return (\n <MainLayout>\n <Box py={10} bg=\"transparent\">\n <InstagramGeneratorButton\n activity={data}\n targetUrl={typeof window !== 'undefined' ? window.location.href : undefined}\n placement=\"fixed\"\n size=\"md\"\n align=\"left\"\n />\n <Container maxW=\"3xl\">\n {loading && (\n <HStack><Spinner size=\"sm\" /><Text>Načítání…</Text></HStack>\n )}\n {!loading && error && (\n <Text color=\"red.500\">{error}</Text>\n )}\n {!loading && !error && data && (\n <VStack align=\"stretch\" spacing={5}>\n {data.image_url && (\n <Box borderRadius=\"xl\" overflow=\"hidden\" borderWidth=\"1px\">\n <Image\n src={assetUrl(data.image_url) || data.image_url}\n alt={data.title}\n w=\"100%\"\n maxH=\"420px\"\n objectFit=\"cover\"\n fallbackSrc=\"/dist/img/logo-club-empty.svg\"\n />\n </Box>\n )}\n\n <VStack align=\"stretch\" spacing={1}>\n <HStack justify=\"space-between\" align=\"start\">\n <Heading as=\"h1\" size=\"lg\" lineHeight={1.2}>{data.title}</Heading>\n <Badge colorScheme={typeColor(data.type)}>{typeLabel(data.type)}</Badge>\n </HStack>\n <HStack spacing={4} color={mutedText} fontSize=\"sm\">\n {data.location && (\n <HStack>\n <Icon as={FiMapPin} />\n <Text>{data.location}</Text>\n </HStack>\n )}\n <HStack>\n <Icon as={FiClock} />\n <Text>\n {new Date(data.start_time).toLocaleString()} {data.end_time ? ` ${new Date(data.end_time).toLocaleString()}` : ''}\n </Text>\n </HStack>\n </HStack>\n </VStack>\n\n {data.description && (\n <Box\n bg={cardBg}\n borderWidth=\"1px\"\n borderColor={borderColor}\n borderRadius=\"lg\"\n p={5}\n className=\"blog-content\"\n sx={{\n ' ul, ol': { pl: 6, listStylePosition: 'outside', mb: 3 },\n ' ul': { listStyleType: 'disc' },\n ' ul[data-bullets=\"disc\"]': { listStyleType: 'disc' },\n ' ul[data-bullets=\"circle\"]': { listStyleType: 'circle' },\n ' ul[data-bullets=\"square\"]': { listStyleType: 'square' },\n ' ol': { listStyleType: 'decimal' },\n ' li': { mb: 2 },\n ' h1, h2, h3, h4': { fontWeight: 'bold', mt: 3 },\n ' p': { lineHeight: 1.8, mb: 3 },\n ' a': { color: linkColor, textDecoration: 'underline', _hover: { color: linkHoverColor } },\n ' blockquote': {\n borderLeft: '4px solid #3182ce',\n paddingLeft: '16px',\n margin: '1em 0',\n color: blockquoteText,\n fontStyle: 'italic',\n backgroundColor: blockquoteBg,\n padding: '12px 16px',\n borderRadius: '4px',\n },\n ' img': {\n display: 'block',\n maxWidth: '100%',\n height: 'auto',\n mt: 2,\n border: 'none !important',\n outline: 'none !important',\n boxShadow: 'none !important',\n cursor: 'default',\n borderRadius: 'md',\n },\n }}\n ref={contentRef}\n dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(toAbsoluteUploads(String(data.description)), {\n USE_PROFILES: { html: true },\n ADD_TAGS: ['iframe'],\n ADD_ATTR: ['class', 'target', 'rel', 'allow', 'allowfullscreen', 'style', 'data-filters', 'data-img-id', 'data-bullets', 'data-list'],\n }) }}\n />\n )}\n\n {data.youtube_url && getYouTubeEmbedUrl(data.youtube_url) && (\n <Box borderRadius=\"lg\" overflow=\"hidden\" boxShadow=\"md\">\n <Box position=\"relative\" paddingBottom=\"56.25%\" height={0}>\n <iframe\n style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%' }}\n src={getYouTubeEmbedUrl(data.youtube_url) || ''}\n title={data.title}\n frameBorder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n loading=\"lazy\"\n referrerPolicy=\"strict-origin-when-cross-origin\"\n allowFullScreen\n />\n </Box>\n </Box>\n )}\n\n {data.location && (\n <EventLocationMap \n location={data.location} \n title={data.title}\n latitude={data.latitude}\n longitude={data.longitude}\n />\n )}\n\n {data?.id && (\n <EmbeddedPoll eventId={data.id} maxPolls={2} />\n )}\n\n {data?.id && (\n <CommentsSection targetType=\"event\" targetId={String(data.id)} />\n )}\n\n {(Array.isArray(data.attachments) && data.attachments.length > 0) && (\n <VStack align=\"stretch\" spacing={3}>\n <Heading as=\"h3\" size=\"sm\">Přílohy</Heading>\n <VStack align=\"stretch\" spacing={3}>\n {data.attachments.map((att: any, idx: number) => (\n <FilePreview\n key={idx}\n url={att.url}\n name={att.name}\n mimeType={att.mime_type}\n size={att.size}\n showInline={att.mime_type?.startsWith('image/')}\n />\n ))}\n </VStack>\n </VStack>\n )}\n\n {data.file_url && (\n <HStack>\n <Button as={ChakraLink} href={assetUrl(data.file_url) || data.file_url} isExternal variant=\"outline\" leftIcon={<FiDownload />}>\n Stáhnout přílohu\n </Button>\n </HStack>\n )}\n\n <Divider />\n <HStack>\n <Button as={RouterLink} to=\"/aktivity\" variant=\"outline\">Zpět na aktivity</Button>\n <Button as={RouterLink} to=\"/\" variant=\"ghost\">Domů</Button>\n </HStack>\n </VStack>\n )}\n </Container>\n </Box>\n \n </MainLayout>\n );\n};\n\nexport default ActivityDetailPage;\n","import { useEffect, useState } from 'react';\nimport { Box, Button, FormControl, FormLabel, Input, VStack, Heading, useToast, Text } from '@chakra-ui/react';\nimport { useSearchParams, useNavigate } from 'react-router-dom';\nimport api from '../services/api';\nimport { PasswordHelpTooltip } from '../components/common/HelpTooltipCard';\n\nconst ResetPasswordPage: React.FC = () => {\n const [searchParams] = useSearchParams();\n const navigate = useNavigate();\n const token = searchParams.get('token') || '';\n const [password, setPassword] = useState('');\n const [confirm, setConfirm] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const toast = useToast();\n\n useEffect(() => {\n if (!token) {\n toast({ title: 'Chybí token', description: 'Odkaz pro reset je neplatný.', status: 'error' });\n }\n }, [token, toast]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (password.length < 8) {\n toast({ title: 'Slabé heslo', description: 'Heslo musí mít alespoň 8 znaků.', status: 'warning' });\n return;\n }\n if (password !== confirm) {\n toast({ title: 'Nesoulad hesel', description: 'Hesla se neshodují.', status: 'warning' });\n return;\n }\n setIsLoading(true);\n try {\n await api.post('/auth/reset-password', { token, new_password: password });\n toast({ title: 'Hotovo', description: 'Heslo bylo změněno. Přihlaste se novým heslem.', status: 'success' });\n navigate('/login');\n } catch (error: any) {\n toast({ title: 'Chyba', description: error.response?.data?.error || 'Reset hesla se nezdařil.', status: 'error' });\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <Box minH=\"100vh\" display=\"flex\" alignItems=\"center\" justifyContent=\"center\">\n <Box w=\"100%\" maxW=\"md\" p={8} borderWidth={1} borderRadius={8} boxShadow=\"lg\">\n <VStack as=\"form\" onSubmit={handleSubmit} spacing={4} align=\"stretch\">\n <Heading as=\"h2\" size=\"lg\" textAlign=\"center\">Nastavit nové heslo</Heading>\n {!token && (\n <Text textAlign=\"center\" color=\"red.500\">Chybí token v URL. Zkontrolujte odkaz v e-mailu.</Text>\n )}\n <FormControl id=\"password\" isRequired>\n <FormLabel display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n <Box>Nové heslo</Box>\n <PasswordHelpTooltip />\n </FormLabel>\n <Input type=\"password\" value={password} onChange={(e) => setPassword(e.target.value)} placeholder=\"••••••••\" />\n </FormControl>\n <FormControl id=\"confirm\" isRequired>\n <FormLabel>Potvrzení hesla</FormLabel>\n <Input type=\"password\" value={confirm} onChange={(e) => setConfirm(e.target.value)} placeholder=\"••••••••\" />\n </FormControl>\n <Button type=\"submit\" colorScheme=\"blue\" isLoading={isLoading} isDisabled={!token}>Změnit heslo</Button>\n </VStack>\n </Box>\n </Box>\n );\n};\n\nexport default ResetPasswordPage;\n","import { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { translateBlogContent, detectLanguage } from '../services/translation';\n\nexport interface BlogTranslationHook {\n translateBlog: (title: string, content: string) => Promise<{ title: string; content: string }>;\n isTranslating: boolean;\n translationError: string | null;\n detectSourceLanguage: (text: string) => 'cs' | 'en';\n getTargetLanguage: () => 'cs' | 'en';\n}\n\nexport const useBlogTranslation = (): BlogTranslationHook => {\n const { i18n } = useTranslation();\n const [isTranslating, setIsTranslating] = useState(false);\n const [translationError, setTranslationError] = useState<string | null>(null);\n\n const detectSourceLanguage = (text: string): 'cs' | 'en' => {\n return detectLanguage(text);\n };\n\n const getTargetLanguage = (): 'cs' | 'en' => {\n // If current language is Czech, translate to English, and vice versa\n return i18n.language === 'cs' ? 'en' : 'cs';\n };\n\n const translateBlog = async (title: string, content: string): Promise<{ title: string; content: string }> => {\n setIsTranslating(true);\n setTranslationError(null);\n\n try {\n const sourceLang = detectSourceLanguage(title + ' ' + content);\n const targetLang = getTargetLanguage();\n\n // Don't translate if source and target are the same\n if (sourceLang === targetLang) {\n return { title, content };\n }\n\n const result = await translateBlogContent(title, content, sourceLang, targetLang);\n \n return {\n title: result.translatedTitle,\n content: result.translatedContent,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Translation failed';\n setTranslationError(errorMessage);\n throw error;\n } finally {\n setIsTranslating(false);\n }\n };\n\n return {\n translateBlog,\n isTranslating,\n translationError,\n detectSourceLanguage,\n getTargetLanguage,\n };\n};\n","import React, { useState, useEffect, useMemo } from 'react';\nimport {\n Box,\n Button,\n Table,\n Thead,\n Tbody,\n Tr,\n Th,\n Td,\n IconButton,\n useToast,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalCloseButton,\n ModalBody,\n ModalFooter,\n FormControl,\n FormLabel,\n Input,\n Textarea,\n Switch,\n Select,\n Tabs,\n TabList,\n TabPanels,\n Tab,\n TabPanel,\n Heading,\n Text,\n Badge,\n HStack,\n VStack,\n AlertDialog,\n AlertDialogBody,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogContent,\n AlertDialogOverlay,\n SimpleGrid,\n FormHelperText,\n useColorModeValue,\n} from '@chakra-ui/react';\nimport { FiEdit, FiTrash2, FiPlus, FiUser, FiUpload } from 'react-icons/fi';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport {\n getContacts,\n createContact,\n updateContact,\n deleteContact,\n Contact,\n getContactCategories,\n createContactCategory,\n ContactCategory,\n} from '../../services/contactInfo';\nimport { getCompetitionAliasesPublic } from '../../services/competitionAliases';\nimport { uploadImage } from '../../services/api';\nimport { getImageUrl } from '../../utils/imageUtils';\nimport { getAdminSettings, updateAdminSettings, AdminSettings, PublicSettings } from '../../services/settings';\nimport MapLinkImporter from '../../components/admin/MapLinkImporter';\nimport { MapCoordinates } from '../../utils/mapUrlParser';\nimport { getFacrTablesCache } from '../../services/facr/cache';\nimport UploadPanel, { UploadPanelFile } from '../../components/common/UploadPanel';\n\nconst ContactsAdminPage: React.FC = () => {\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const inputBg = useColorModeValue('white', 'gray.700');\n const textSecondary = useColorModeValue('gray.600', 'gray.400');\n const bgMain = useColorModeValue('gray.50', 'gray.900');\n const tableBg = useColorModeValue('white', 'gray.800');\n const hoverBg = useColorModeValue('gray.50', 'gray.700');\n const infoBg = useColorModeValue('blue.50', 'blue.900');\n const infoBorder = useColorModeValue('blue.200', 'blue.700');\n const [contacts, setContacts] = useState<Contact[]>([]);\n const [categories, setCategories] = useState<ContactCategory[]>([]);\n const [loading, setLoading] = useState(false);\n const [selectedContact, setSelectedContact] = useState<Contact | null>(null);\n const [isContactModalOpen, setIsContactModalOpen] = useState(false);\n const [deleteItem, setDeleteItem] = useState<{ type: 'contact'; id: number } | null>(null);\n const cancelRef = React.useRef<HTMLButtonElement>(null);\n const toast = useToast();\n\n // Form states\n const [contactForm, setContactForm] = useState({\n name: '',\n position: '',\n email: '',\n phone: '',\n category_id: undefined as number | undefined,\n image_url: '',\n description: '',\n display_order: 0,\n is_active: true,\n });\n\n\n const [uploadingImage, setUploadingImage] = useState(false);\n const [settings, setSettings] = useState<AdminSettings>({});\n const [savingSettings, setSavingSettings] = useState(false);\n const [facrCompetitions, setFacrCompetitions] = useState<any[]>([]);\n // Map of competition code -> alias (public aliases)\n const [compAliasMap, setCompAliasMap] = useState<Record<string, string>>({});\n\n useEffect(() => {\n loadData();\n loadSettings();\n }, []);\n\n // Load competition aliases map for filtering categories (so alias-named categories are visible)\n useEffect(() => {\n (async () => {\n try {\n const aliases = await getCompetitionAliasesPublic().catch(() => [] as Array<{ code?: string; alias?: string }>);\n const map: Record<string, string> = {};\n (aliases || []).forEach((a: any) => {\n const code = String(a?.code || '').trim();\n const alias = String(a?.alias || '').trim();\n if (code && alias) map[code] = alias;\n });\n setCompAliasMap(map);\n } catch {\n // ignore\n }\n })();\n }, []);\n\n const loadData = async () => {\n setLoading(true);\n try {\n const [contactsData, categoriesData, facrData] = await Promise.all([\n getContacts(),\n getContactCategories(),\n getFacrTablesCache(),\n ]);\n setContacts(contactsData);\n setCategories(categoriesData);\n setFacrCompetitions(Array.isArray(facrData?.competitions) ? facrData!.competitions : []);\n\n // Auto-seed contact categories from club competitions (with aliases) if none exist yet\n if ((categoriesData || []).length === 0 && Array.isArray(facrData?.competitions) && facrData.competitions.length > 0) {\n try {\n const aliases = await getCompetitionAliasesPublic().catch(() => [] as Array<{ code?: string; alias?: string; original_name?: string }>);\n const aliasMap: Record<string, string> = {};\n (aliases || []).forEach((a: any) => { if (a?.code && a?.alias) aliasMap[String(a.code)] = String(a.alias); });\n const namesSet = new Set<string>();\n for (const c of facrData.competitions) {\n const code = String(c?.code || '').trim();\n const name = String(c?.name || c?.code || '').trim();\n const display = code && aliasMap[code] ? aliasMap[code] : name;\n if (display) namesSet.add(display);\n }\n const names = Array.from(namesSet);\n if (names.length > 0) {\n // Create categories sequentially to avoid overwhelming API\n let order = 0;\n for (const n of names) {\n try {\n await createContactCategory({ name: n, display_order: order, is_active: true });\n order += 10;\n } catch (e) {\n // ignore duplicates or transient errors\n }\n }\n const refreshed = await getContactCategories();\n setCategories(refreshed);\n toast({ title: 'Kategorie doplněny', description: 'Kategorie pro kontakty byly doplněny podle soutěží klubu.', status: 'success', duration: 3000 });\n }\n } catch (e: any) {\n // Best-effort seeding; keep silent on failure\n }\n }\n } catch (error) {\n toast({\n title: 'Chyba při načítání',\n description: 'Nepodařilo se načíst kontakty a kategorie',\n status: 'error',\n duration: 3000,\n });\n } finally {\n setLoading(false);\n }\n };\n\n const clubCompetitionNames = useMemo(() => {\n try {\n const names = new Set<string>();\n for (const comp of facrCompetitions || []) {\n const n = String(comp?.name || '').trim();\n if (n) names.add(n);\n const code = String(comp?.code || '').trim();\n const alias = code && compAliasMap[code] ? String(compAliasMap[code]).trim() : '';\n if (alias) names.add(alias);\n }\n return Array.from(names);\n } catch {\n return [] as string[];\n }\n }, [facrCompetitions, compAliasMap]);\n\n const filteredContactCategories = useMemo(() => {\n try {\n if (!Array.isArray(categories)) return [] as ContactCategory[];\n if ((clubCompetitionNames || []).length === 0) return categories;\n const setNames = new Set(clubCompetitionNames.map((s) => String(s)));\n const filtered = categories.filter((c) => setNames.has(String(c.name)));\n return filtered.length > 0 ? filtered : categories;\n } catch {\n return categories;\n }\n }, [categories, clubCompetitionNames]);\n\n // Contact handlers\n const openContactModal = (contact?: Contact) => {\n if (contact) {\n setSelectedContact(contact);\n setContactForm({\n name: contact.name,\n position: contact.position,\n email: contact.email,\n phone: contact.phone,\n category_id: contact.category_id,\n image_url: contact.image_url || '',\n description: contact.description || '',\n display_order: contact.display_order,\n is_active: contact.is_active,\n });\n } else {\n setSelectedContact(null);\n setContactForm({\n name: '',\n position: '',\n email: '',\n phone: '',\n category_id: undefined,\n image_url: '',\n description: '',\n display_order: contacts.length * 10,\n is_active: true,\n });\n }\n setIsContactModalOpen(true);\n };\n\n const loadSettings = async () => {\n try {\n const data = await getAdminSettings();\n setSettings(data || {});\n } catch (error) {\n console.error('Failed to load settings:', error);\n }\n };\n\n const handleSettingsChange = (key: keyof AdminSettings) => (e: React.ChangeEvent<HTMLInputElement>) => {\n setSettings((prev) => ({ ...prev, [key]: e.target.value }));\n };\n\n const handleNumChange = (key: keyof AdminSettings) => (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n const n = val === '' ? undefined : Number(val);\n setSettings((prev) => ({ ...prev, [key]: (Number.isFinite(n as number) ? (n as any) : undefined) }));\n };\n\n const handleBoolChange = (key: keyof AdminSettings) => (e: React.ChangeEvent<HTMLInputElement>) => {\n const checked = (e.target as any).checked as boolean;\n setSettings((prev) => ({ ...prev, [key]: checked as any }));\n };\n\n const handleSelectChange = (key: keyof AdminSettings) => (e: React.ChangeEvent<HTMLSelectElement>) => {\n setSettings((prev) => ({ ...prev, [key]: e.target.value }));\n };\n\n const handleSaveSettings = async () => {\n setSavingSettings(true);\n try {\n // Extract and validate settings\n const lat = typeof settings.location_latitude === 'number' ? settings.location_latitude : undefined;\n const lng = typeof settings.location_longitude === 'number' ? settings.location_longitude : undefined;\n const zoom = typeof settings.map_zoom_level === 'number' ? settings.map_zoom_level : undefined;\n \n // Auto-enable map display if coordinates are set\n const hasCoordinates = lat !== undefined && lng !== undefined;\n \n // Build payload with proper types, filtering out undefined values\n const payload: Partial<AdminSettings> = {};\n \n if (settings.contact_address !== undefined) payload.contact_address = settings.contact_address;\n if (settings.contact_city !== undefined) payload.contact_city = settings.contact_city;\n if (settings.contact_zip !== undefined) payload.contact_zip = settings.contact_zip;\n if (settings.contact_country !== undefined) payload.contact_country = settings.contact_country;\n if (settings.contact_phone !== undefined) payload.contact_phone = settings.contact_phone;\n if (settings.contact_email !== undefined) payload.contact_email = settings.contact_email;\n if (lat !== undefined) payload.location_latitude = lat;\n if (lng !== undefined) payload.location_longitude = lng;\n if (zoom !== undefined) payload.map_zoom_level = zoom;\n if (settings.map_style !== undefined) payload.map_style = settings.map_style;\n payload.show_map_on_homepage = hasCoordinates;\n \n await updateAdminSettings(payload);\n toast({\n title: 'Nastavení uloženo',\n description: 'Kontaktní informace a mapa byly aktualizovány',\n status: 'success',\n duration: 3000,\n });\n } catch (error: any) {\n const errorMsg = error?.response?.data?.chyba || error?.response?.data?.detail || error?.response?.data?.error || error?.message || 'Uložení nastavení se nezdařilo';\n console.error('Settings save error:', error);\n toast({\n title: 'Chyba při ukládání',\n description: errorMsg,\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n } finally {\n setSavingSettings(false);\n }\n };\n\n const handleContactSubmit = async () => {\n if (!contactForm.name.trim()) {\n toast({\n title: 'Chyba validace',\n description: 'Jméno je povinné',\n status: 'error',\n duration: 3000,\n });\n return;\n }\n\n setLoading(true);\n try {\n if (selectedContact) {\n await updateContact(selectedContact.id, contactForm);\n toast({\n title: 'Kontakt aktualizován',\n status: 'success',\n duration: 2000,\n });\n } else {\n await createContact(contactForm);\n toast({\n title: 'Kontakt vytvořen',\n status: 'success',\n duration: 2000,\n });\n }\n setIsContactModalOpen(false);\n loadData();\n } catch (error: any) {\n toast({\n title: 'Chyba',\n description: error.response?.data?.error || 'Uložení kontaktu se nezdařilo',\n status: 'error',\n duration: 3000,\n });\n } finally {\n setLoading(false);\n }\n };\n\n const handleDeleteContact = async (id: number) => {\n setLoading(true);\n try {\n await deleteContact(id);\n toast({\n title: 'Kontakt smazán',\n status: 'success',\n duration: 2000,\n });\n loadData();\n } catch (error) {\n toast({\n title: 'Chyba',\n description: 'Smazání kontaktu se nezdařilo',\n status: 'error',\n duration: 3000,\n });\n } finally {\n setLoading(false);\n setDeleteItem(null);\n }\n };\n\n\n // Custom upload function for UploadPanel using uploadImage service\n const uploadContactImage = async (file: File): Promise<UploadPanelFile> => {\n if (!file.type.startsWith('image/')) {\n throw new Error('Nahrajte prosím obrázkový soubor');\n }\n\n setUploadingImage(true);\n try {\n const formData = new FormData();\n formData.append('file', file);\n\n const result = await uploadImage(formData);\n setContactForm((prev) => ({ ...prev, image_url: result.url }));\n\n return {\n url: result.url,\n name: file.name,\n type: file.type || 'image/*',\n size: file.size,\n };\n } catch (error: any) {\n const msg = error?.response?.data?.error || 'Nahrání obrázku se nezdařilo';\n throw new Error(msg);\n } finally {\n setUploadingImage(false);\n }\n };\n\n return (\n <AdminLayout>\n <Box p={6} bg={bgMain} minH=\"100vh\">\n <Heading size=\"lg\" mb={6}>Správa kontaktů</Heading>\n\n <Tabs colorScheme=\"blue\">\n <TabList>\n <Tab>Kontakty</Tab>\n <Tab>Mapa a adresa</Tab>\n </TabList>\n\n <TabPanels>\n {/* Contacts Tab */}\n <TabPanel>\n <HStack justify=\"space-between\" mb={4}>\n <Text>Spravujte kontaktní osoby vašeho klubu</Text>\n <Button\n leftIcon={<FiPlus />}\n colorScheme=\"blue\"\n onClick={() => openContactModal()}\n >\n Přidat kontakt\n </Button>\n </HStack>\n\n <Box overflowX=\"auto\" bg={tableBg} borderRadius=\"md\" borderWidth=\"1px\" borderColor={borderColor}>\n <Table variant=\"simple\">\n <Thead>\n <Tr>\n <Th>Foto</Th>\n <Th>Jméno</Th>\n <Th>Pozice</Th>\n <Th>Soutěž</Th>\n <Th>Email</Th>\n <Th>Telefon</Th>\n <Th>Pořadí</Th>\n <Th>Stav</Th>\n <Th>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {contacts.map((contact) => (\n <Tr key={contact.id}>\n <Td>\n {contact.image_url ? (\n <Box\n as=\"img\"\n src={getImageUrl(contact.image_url)}\n alt={contact.name}\n boxSize=\"40px\"\n objectFit=\"cover\"\n borderRadius=\"md\"\n />\n ) : (\n <Box\n boxSize=\"40px\"\n bg=\"gray.200\"\n borderRadius=\"md\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <FiUser />\n </Box>\n )}\n </Td>\n <Td fontWeight=\"bold\">{contact.name}</Td>\n <Td>{contact.position}</Td>\n <Td>\n {contact.category_id ? (\n <Badge colorScheme=\"purple\">{categories.find(c => c.id === contact.category_id)?.name || contact.category_id}</Badge>\n ) : (\n <Text fontSize=\"sm\" color=\"gray.500\">Bez kategorie</Text>\n )}\n </Td>\n <Td>{contact.email}</Td>\n <Td>{contact.phone}</Td>\n <Td>{contact.display_order}</Td>\n <Td>\n <Badge colorScheme={contact.is_active ? 'green' : 'red'}>\n {contact.is_active ? 'Aktivní' : 'Neaktivní'}\n </Badge>\n </Td>\n <Td>\n <HStack spacing={2}>\n <IconButton\n aria-label=\"Upravit\"\n icon={<FiEdit />}\n size=\"sm\"\n onClick={() => openContactModal(contact)}\n />\n <IconButton\n aria-label=\"Smazat\"\n icon={<FiTrash2 />}\n size=\"sm\"\n colorScheme=\"red\"\n onClick={() => setDeleteItem({ type: 'contact', id: contact.id })}\n />\n </HStack>\n </Td>\n </Tr>\n ))}\n {contacts.length === 0 && (\n <Tr>\n <Td colSpan={9} textAlign=\"center\" py={8}>\n <Text color=\"gray.500\">Zatím žádné kontakty. Přidejte svůj první kontakt!</Text>\n </Td>\n </Tr>\n )}\n </Tbody>\n </Table>\n </Box>\n </TabPanel>\n\n {/* Map & Address Tab */}\n <TabPanel>\n <VStack align=\"stretch\" spacing={6}>\n <Box bg={cardBg} p={6} borderRadius=\"lg\" borderWidth=\"1px\" borderColor={borderColor}>\n <Heading size=\"md\" mb={4}>Kontaktní údaje</Heading>\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={4}>\n <FormControl>\n <FormLabel>Adresa</FormLabel>\n <Input\n bg={inputBg}\n value={settings.contact_address || ''}\n onChange={handleSettingsChange('contact_address' as keyof AdminSettings)}\n placeholder=\"Ulice a č.p.\"\n />\n </FormControl>\n <FormControl>\n <FormLabel>Město</FormLabel>\n <Input\n bg={inputBg}\n value={settings.contact_city || ''}\n onChange={handleSettingsChange('contact_city' as keyof AdminSettings)}\n placeholder=\"Město\"\n />\n </FormControl>\n <FormControl>\n <FormLabel>PSČ</FormLabel>\n <Input\n bg={inputBg}\n value={settings.contact_zip || ''}\n onChange={handleSettingsChange('contact_zip' as keyof AdminSettings)}\n placeholder=\"12345\"\n />\n </FormControl>\n <FormControl>\n <FormLabel>Země</FormLabel>\n <Input\n bg={inputBg}\n value={settings.contact_country || ''}\n onChange={handleSettingsChange('contact_country' as keyof AdminSettings)}\n placeholder=\"Česká republika\"\n />\n </FormControl>\n <FormControl>\n <FormLabel>Telefon</FormLabel>\n <Input\n bg={inputBg}\n value={settings.contact_phone || ''}\n onChange={handleSettingsChange('contact_phone' as keyof AdminSettings)}\n placeholder=\"+420 123 456 789\"\n />\n </FormControl>\n <FormControl>\n <FormLabel>E-mail</FormLabel>\n <Input\n bg={inputBg}\n type=\"email\"\n value={settings.contact_email || ''}\n onChange={handleSettingsChange('contact_email' as keyof AdminSettings)}\n placeholder=\"kontakt@klub.cz\"\n />\n </FormControl>\n </SimpleGrid>\n </Box>\n\n <Box bg={cardBg} p={6} borderRadius=\"lg\" borderWidth=\"1px\" borderColor={borderColor}>\n <Heading size=\"md\" mb={4}>Poloha na mapě</Heading>\n <MapLinkImporter\n currentLatitude={settings.location_latitude}\n currentLongitude={settings.location_longitude}\n currentZoom={settings.map_zoom_level}\n mapStyle={settings.map_style || 'positron'}\n onMapStyleChange={(value: string) => {\n setSettings((prev) => ({ ...prev, map_style: value as PublicSettings['map_style'] }));\n }}\n clubPrimaryColor={settings.primary_color}\n clubSecondaryColor={settings.accent_color}\n clubName={settings.club_name}\n onImport={(coords: MapCoordinates) => {\n setSettings((prev) => ({\n ...prev,\n location_latitude: coords.latitude,\n location_longitude: coords.longitude,\n map_zoom_level: coords.zoom,\n // Auto-fill address fields if available\n contact_address: coords.street || prev.contact_address,\n contact_city: coords.city || prev.contact_city,\n contact_zip: coords.zip || prev.contact_zip,\n contact_country: coords.country || prev.contact_country,\n }));\n toast({\n title: 'Souřadnice a adresa importovány',\n description: `GPS poloha${coords.city ? ' a kontaktní údaje' : ''} byly načteny`,\n status: 'success',\n duration: 3000,\n });\n }}\n />\n\n <Text fontSize=\"sm\" color={textSecondary} mt={2} fontStyle=\"italic\">\n Mapa se automaticky zobrazí na titulní stránce při nastavení GPS souřadnic.\n </Text>\n </Box>\n\n <Box bg={cardBg} p={6} borderRadius=\"lg\" borderWidth=\"1px\" borderColor={borderColor}>\n <Heading size=\"md\" mb={4}>Ruční nastavení souřadnic</Heading>\n <SimpleGrid columns={{ base: 1, md: 3 }} spacing={4}>\n <FormControl>\n <FormLabel>Zeměpisná šířka (Latitude)</FormLabel>\n <Input\n bg={inputBg}\n type=\"number\"\n step=\"0.000001\"\n value={settings.location_latitude ?? ''}\n onChange={handleNumChange('location_latitude' as keyof AdminSettings)}\n placeholder=\"50.0947\"\n />\n <FormHelperText fontSize=\"xs\">Rozsah: -90 až 90</FormHelperText>\n </FormControl>\n <FormControl>\n <FormLabel>Zeměpisná délka (Longitude)</FormLabel>\n <Input\n bg={inputBg}\n type=\"number\"\n step=\"0.000001\"\n value={settings.location_longitude ?? ''}\n onChange={handleNumChange('location_longitude' as keyof AdminSettings)}\n placeholder=\"17.6997\"\n />\n <FormHelperText fontSize=\"xs\">Rozsah: -180 až 180</FormHelperText>\n </FormControl>\n <FormControl>\n <FormLabel>Úroveň přiblížení (Zoom)</FormLabel>\n <Input\n bg={inputBg}\n type=\"number\"\n min=\"1\"\n max=\"20\"\n value={settings.map_zoom_level ?? 15}\n onChange={handleNumChange('map_zoom_level' as keyof AdminSettings)}\n placeholder=\"15\"\n />\n <FormHelperText fontSize=\"xs\">Rozsah: 1-20 (vyšší = větší přiblížení)</FormHelperText>\n </FormControl>\n </SimpleGrid>\n </Box>\n\n {/* Map style selection is integrated into the section above; single unified preview */}\n\n <Box bg={infoBg} p={4} borderRadius=\"md\" borderWidth=\"1px\" borderColor={infoBorder}>\n <HStack justify=\"space-between\" align=\"center\">\n <VStack align=\"start\" spacing={1}>\n <Text fontSize=\"sm\" fontWeight=\"semibold\">\n 📍 Nezapomeňte uložit změny\n </Text>\n <Text fontSize=\"xs\" color={textSecondary}>\n Uložte nastavení, aby se změny projevily na webu.\n </Text>\n </VStack>\n <Button\n colorScheme=\"blue\"\n size=\"lg\"\n onClick={handleSaveSettings}\n isLoading={savingSettings}\n loadingText=\"Ukládám...\"\n >\n Uložit nastavení\n </Button>\n </HStack>\n </Box>\n </VStack>\n </TabPanel>\n </TabPanels>\n </Tabs>\n\n {/* Contact Modal */}\n <Modal isOpen={isContactModalOpen} onClose={() => setIsContactModalOpen(false)} size=\"xl\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>{selectedContact ? 'Upravit kontakt' : 'Přidat kontakt'}</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack spacing={4}>\n <FormControl isRequired>\n <FormLabel>Jméno</FormLabel>\n <Input\n value={contactForm.name}\n onChange={(e) => setContactForm({ ...contactForm, name: e.target.value })}\n placeholder=\"Jan Novák\"\n />\n </FormControl>\n\n <FormControl>\n <FormLabel>Pozice</FormLabel>\n <Input\n value={contactForm.position}\n onChange={(e) => setContactForm({ ...contactForm, position: e.target.value })}\n placeholder=\"Předseda, Hlavní trenér, atd.\"\n />\n </FormControl>\n\n <FormControl>\n <FormLabel>Kategorie</FormLabel>\n <Select\n value={contactForm.category_id || ''}\n onChange={(e) =>\n setContactForm({\n ...contactForm,\n category_id: e.target.value ? parseInt(e.target.value) : undefined,\n })\n }\n >\n <option value=\"\">Bez přiřazení</option>\n {filteredContactCategories.map((cat) => (\n <option key={cat.id} value={cat.id}>\n {cat.name}\n </option>\n ))}\n </Select>\n <FormHelperText fontSize=\"xs\">Přiřaďte kontakt ke konkrétní kategorii (podle soutěží klubu)</FormHelperText>\n </FormControl>\n\n <FormControl>\n <FormLabel>Email</FormLabel>\n <Input\n type=\"email\"\n value={contactForm.email}\n onChange={(e) => setContactForm({ ...contactForm, email: e.target.value })}\n placeholder=\"john@example.com\"\n />\n </FormControl>\n\n <FormControl>\n <FormLabel>Telefon</FormLabel>\n <Input\n value={contactForm.phone}\n onChange={(e) => setContactForm({ ...contactForm, phone: e.target.value })}\n placeholder=\"+420 123 456 789\"\n />\n </FormControl>\n\n <FormControl>\n <FormLabel>Fotografie</FormLabel>\n <VStack align=\"stretch\" spacing={3}>\n <UploadPanel\n label=\"Fotografie kontaktu\"\n description=\"Nahrajte fotografii kontaktní osoby (max. 5 MB).\"\n accept=\"image/*\"\n multiple={false}\n maxFiles={1}\n maxFileSizeMB={5}\n allowUrlImport={false}\n uploadFn={uploadContactImage}\n />\n {contactForm.image_url && (\n <Badge colorScheme=\"green\">Nahráno</Badge>\n )}\n </VStack>\n {contactForm.image_url && (\n <Box mt={2}>\n <img\n src={getImageUrl(contactForm.image_url)}\n alt=\"Náhled\"\n style={{ maxWidth: '200px', borderRadius: '8px' }}\n />\n </Box>\n )}\n </FormControl>\n\n <FormControl>\n <FormLabel>Popis</FormLabel>\n <Textarea\n value={contactForm.description}\n onChange={(e) => setContactForm({ ...contactForm, description: e.target.value })}\n placeholder=\"Stručný popis nebo bio\"\n rows={3}\n />\n </FormControl>\n\n <FormControl display=\"flex\" alignItems=\"center\">\n <FormLabel mb=\"0\">Aktivní</FormLabel>\n <Switch\n isChecked={contactForm.is_active}\n onChange={(e) => setContactForm({ ...contactForm, is_active: e.target.checked })}\n />\n </FormControl>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" mr={3} onClick={() => setIsContactModalOpen(false)}>\n Zrušit\n </Button>\n <Button colorScheme=\"blue\" onClick={handleContactSubmit} isLoading={loading}>\n {selectedContact ? 'Aktualizovat' : 'Vytvořit'}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n {/* Delete Confirmation Dialog */}\n <AlertDialog\n isOpen={deleteItem !== null}\n leastDestructiveRef={cancelRef}\n onClose={() => setDeleteItem(null)}\n >\n <AlertDialogOverlay>\n <AlertDialogContent>\n <AlertDialogHeader fontSize=\"lg\" fontWeight=\"bold\">\n Smazat kontakt\n </AlertDialogHeader>\n\n <AlertDialogBody>\n Opravdu chcete smazat tento kontakt? Tuto akci nelze vrátit zpět.\n </AlertDialogBody>\n\n <AlertDialogFooter>\n <Button ref={cancelRef} onClick={() => setDeleteItem(null)}>\n Zrušit\n </Button>\n <Button\n colorScheme=\"red\"\n onClick={() => {\n if (deleteItem) {\n handleDeleteContact(deleteItem.id);\n }\n }}\n ml={3}\n isLoading={loading}\n >\n Smazat\n </Button>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialogOverlay>\n </AlertDialog>\n </Box>\n </AdminLayout>\n );\n};\n\nexport default ContactsAdminPage;\n","import { Box, Button, Heading, Text, VStack, HStack, Icon, Divider } from '@chakra-ui/react';\nimport { Link as RouterLink, useNavigate } from 'react-router-dom';\nimport { GiSoccerBall } from 'react-icons/gi';\nimport { MdSportsSoccer } from 'react-icons/md';\nimport MainLayout from '../components/layout/MainLayout';\n\nconst NotFoundPage: React.FC = () => {\n const navigate = useNavigate();\n return (\n <MainLayout>\n <Box\n minH=\"60vh\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n bgGradient=\"linear(to-b, rgba(0,0,0,0.02), transparent)\"\n px={6}\n >\n <Box\n w={{ base: '100%', sm: '560px' }}\n textAlign=\"center\"\n bg=\"white\"\n _dark={{ bg: 'gray.800' }}\n borderRadius=\"xl\"\n borderWidth=\"1px\"\n borderColor=\"border.subtle\"\n boxShadow=\"md\"\n p={{ base: 6, md: 10 }}\n >\n <VStack spacing={4}>\n <HStack spacing={3} color=\"brand.primary\">\n <Icon as={GiSoccerBall} boxSize={8} />\n <Heading as=\"h1\" size=\"2xl\" letterSpacing=\"wide\">\n 404\n </Heading>\n <Icon as={MdSportsSoccer} boxSize={8} />\n </HStack>\n <Heading\n as=\"h2\"\n size=\"lg\"\n bgGradient=\"linear(to-r, brand.primary, brand.accent)\"\n bgClip=\"text\"\n >\n Stránka nenalezena\n </Heading>\n <Text color=\"gray.600\" _dark={{ color: 'gray.300' }}>\n Míč je mimo hřiště zkuste to znovu nebo vraťte se.\n </Text>\n <Divider />\n <HStack spacing={3} pt={2}>\n <Button onClick={() => navigate(-1)} colorScheme=\"blue\">\n Zpět\n </Button>\n <Button as={RouterLink} to=\"/\" variant=\"outline\">\n Zpět na úvod\n </Button>\n </HStack>\n </VStack>\n </Box>\n </Box>\n </MainLayout>\n );\n};\n\nexport default NotFoundPage;\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { Link as RouterLink } from 'react-router-dom';\nimport MainLayout from '../components/layout/MainLayout';\nimport {\n Box,\n Container,\n Heading,\n Text,\n Tabs,\n TabList,\n TabPanels,\n Tab,\n TabPanel,\n Flex,\n Badge,\n Stack,\n Spinner,\n Grid,\n IconButton,\n ButtonGroup,\n Button,\n useToast,\n Select,\n useColorModeValue,\n} from '@chakra-ui/react';\nimport { ChevronLeftIcon, ChevronRightIcon } from '@chakra-ui/icons';\nimport { addMonths, format, isSameDay, isSameMonth, startOfMonth, startOfWeek, addDays, parse } from 'date-fns';\nimport { cs } from 'date-fns/locale';\nimport { getEvents } from '../services/eventService';\nimport { useTranslation } from 'react-i18next';\n\n// Weekday headers (starting Monday)\nconst WEEKDAYS_SHORT: string[] = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];\n\ntype UiEvent = {\n id: number | string;\n title: string;\n start_time: string; // ISO\n end_time?: string | null;\n location?: string | null;\n type?: 'match' | 'training' | 'meeting' | 'other' | string;\n image_url?: string | null;\n};\n\nconst typeLabel = (t?: string, translate?: (key: string) => string) => {\n if (!translate) return t === 'match' ? 'Zápas' : t === 'training' ? 'Trénink' : t === 'meeting' ? 'Schůzka' : 'Jiné';\n switch (t) {\n case 'match': return translate('calendar.match_type');\n case 'training': return translate('calendar.training_type');\n case 'meeting': return translate('calendar.meeting_type');\n default: return translate('calendar.other_type');\n }\n};\nconst typeColor = (t?: string) => (t === 'match' ? 'red' : t === 'training' ? 'blue' : t === 'meeting' ? 'green' : 'gray');\n\nconst toDateKey = (iso: string) => {\n try { return format(new Date(iso), 'yyyy-MM-dd'); } catch { return iso.slice(0, 10); }\n};\n\nconst ActivitiesCalendarPage: React.FC = () => {\n const { t } = useTranslation();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [events, setEvents] = useState<UiEvent[]>([]);\n const [filter, setFilter] = useState<'all' | 'match' | 'training' | 'meeting' | 'other'>('all');\n const [viewMode, setViewMode] = useState<'calendar' | 'list'>('calendar');\n const toast = useToast();\n\n const mutedText = useColorModeValue('gray.600', 'gray.300');\n const subtleText = useColorModeValue('gray.500', 'gray.400');\n const borderColor = useColorModeValue('rgba(0,0,0,0.08)', 'rgba(255,255,255,0.16)');\n const cardBg = useColorModeValue('white', 'gray.800');\n const hoverBg = useColorModeValue('rgba(0,0,0,0.03)', 'rgba(255,255,255,0.08)');\n const listHeaderBg = useColorModeValue('gray.50', 'whiteAlpha.100');\n const todayHighlightBg = useColorModeValue('rgba(59,130,246,0.08)', 'rgba(59,130,246,0.16)');\n\n // Calendar state\n const [monthRef, setMonthRef] = useState<Date>(startOfMonth(new Date()));\n const weeks = useMemo(() => {\n const start = startOfWeek(startOfMonth(monthRef), { weekStartsOn: 1 });\n const days: Date[] = [];\n for (let i = 0; i < 42; i++) days.push(addDays(start, i));\n return days;\n }, [monthRef]);\n\n const filtered = useMemo(() => (filter === 'all' ? events : events.filter((e) => e.type === filter)), [events, filter]);\n\n const byDate = useMemo(() => {\n const map = new Map<string, UiEvent[]>();\n filtered.forEach((e) => {\n const startKey = toDateKey(e.start_time);\n const endKey = e.end_time ? toDateKey(e.end_time) : startKey;\n\n if (startKey === endKey) {\n map.set(startKey, [...(map.get(startKey) || []), e]);\n return;\n }\n\n const startDate = new Date(startKey);\n const endDate = new Date(endKey);\n if (Number.isNaN(startDate.getTime()) || Number.isNaN(endDate.getTime())) {\n map.set(startKey, [...(map.get(startKey) || []), e]);\n return;\n }\n\n for (let d = new Date(startDate); d.getTime() <= endDate.getTime(); d.setDate(d.getDate() + 1)) {\n const key = format(d, 'yyyy-MM-dd');\n map.set(key, [...(map.get(key) || []), e]);\n }\n });\n\n // Sort events within each date by time\n Array.from(map.keys()).forEach((key) => {\n const list = map.get(key) || [];\n list.sort((a, b) => new Date(a.start_time).getTime() - new Date(b.start_time).getTime());\n map.set(key, list);\n });\n return map;\n }, [filtered]);\n\n useEffect(() => {\n let active = true;\n (async () => {\n setLoading(true);\n setError(null);\n try {\n const evs = await getEvents();\n const mapped: UiEvent[] = (evs || []).map((e: any) => ({\n id: e.id,\n title: e.title,\n start_time: e.start_time,\n end_time: e.end_time,\n location: e.location,\n type: e.type,\n image_url: e.image_url,\n }));\n if (active) setEvents(mapped);\n } catch (e: any) {\n if (active) setError(e?.message || t('message.error_occurred'));\n } finally {\n if (active) setLoading(false);\n }\n })();\n return () => { active = false; };\n }, []);\n\n const hasData = filtered.length > 0;\n\n return (\n <MainLayout>\n <Container maxW=\"7xl\" py={{ base: 6, md: 10 }}>\n <Heading as=\"h1\" size=\"xl\" mb={2}>{t('nav.activities')}</Heading>\n <Text color={mutedText} mb={6}>{t('calendar.activities_subtitle')}</Text>\n\n <Flex align=\"center\" justify=\"space-between\" mb={3} gap={2} flexWrap={{ base: 'wrap', md: 'nowrap' }}>\n <Flex align=\"center\" gap={2}>\n <Select size=\"sm\" value={filter} onChange={(e) => setFilter(e.target.value as any)} width={{ base: '100%', sm: '220px' }}>\n <option value=\"all\">{t('calendar.all_types')}</option>\n <option value=\"match\">{t('calendar.matches_filter')}</option>\n <option value=\"training\">{t('calendar.training_filter')}</option>\n <option value=\"meeting\">{t('calendar.meeting_filter')}</option>\n <option value=\"other\">{t('calendar.other_filter')}</option>\n </Select>\n </Flex>\n <ButtonGroup size=\"sm\" isAttached>\n <Button\n variant={viewMode==='calendar' ? 'solid' : 'outline'}\n bg={viewMode==='calendar' ? 'brand.primary' : undefined}\n color={viewMode==='calendar' ? 'text.onPrimary' : undefined}\n _hover={{ filter: viewMode==='calendar' ? 'brightness(0.95)' : undefined, borderColor: 'brand.primary', color: viewMode==='calendar' ? 'text.onPrimary' : undefined }}\n onClick={() => setViewMode('calendar')}\n >{t('calendar.calendar_view')}</Button>\n <Button\n variant={viewMode==='list' ? 'solid' : 'outline'}\n bg={viewMode==='list' ? 'brand.primary' : undefined}\n color={viewMode==='list' ? 'text.onPrimary' : undefined}\n _hover={{ filter: viewMode==='list' ? 'brightness(0.95)' : undefined, borderColor: 'brand.primary', color: viewMode==='list' ? 'text.onPrimary' : undefined }}\n onClick={() => setViewMode('list')}\n >{t('calendar.list_view')}</Button>\n </ButtonGroup>\n </Flex>\n\n {loading && (\n <Flex align=\"center\" gap={3} color={mutedText} mb={6}>\n <Spinner size=\"sm\" />\n <span>{t('calendar.loading_activities')}</span>\n </Flex>\n )}\n\n {error && (\n <Box color=\"red.400\" mb={4}>{error}</Box>\n )}\n\n {!loading && !hasData && !error && (\n <Box color={mutedText}>{t('calendar.no_activities')}</Box>\n )}\n\n {!loading && hasData && (\n viewMode === 'calendar' ? (\n <>\n <Flex align=\"center\" justify=\"space-between\" mb={3} gap={2} flexWrap={{ base: 'wrap', md: 'nowrap' }}>\n <IconButton\n aria-label={t('calendar.previous_month')}\n size=\"sm\"\n onClick={() => setMonthRef(addMonths(monthRef, -1))}\n icon={<ChevronLeftIcon />}\n variant=\"outline\"\n _hover={{ bg: 'rgba(0,0,0,0.04)', borderColor: 'brand.primary' }}\n />\n <Button\n size=\"sm\"\n onClick={() => setMonthRef(new Date())}\n variant=\"solid\"\n bg={'brand.primary'}\n color={'text.onPrimary'}\n _hover={{ filter: 'brightness(0.95)' }}\n >{t('calendar.today')}</Button>\n <IconButton\n aria-label={t('calendar.next_month')}\n size=\"sm\"\n onClick={() => setMonthRef(addMonths(monthRef, 1))}\n icon={<ChevronRightIcon />}\n variant=\"outline\"\n _hover={{ bg: 'rgba(0,0,0,0.04)', borderColor: 'brand.primary' }}\n />\n </Flex>\n <Box overflowX=\"auto\">\n <Grid templateColumns=\"repeat(7, 1fr)\" gap={3} minW=\"980px\">\n {WEEKDAYS_SHORT.map((w) => (\n <Box key={w} textAlign=\"center\" fontWeight=\"semibold\" color={mutedText} fontSize={{ base: 'xs', md: 'sm' }}>{w}</Box>\n ))}\n </Grid>\n </Box>\n <Box overflowX=\"auto\">\n <Grid templateColumns=\"repeat(7, 1fr)\" gap={{ base: 1, md: 2 }} minW=\"980px\">\n {weeks.map((day, idx) => {\n const key = format(day, 'yyyy-MM-dd');\n const list = byDate.get(key) || [];\n const faded = !isSameMonth(day, monthRef);\n const today = (() => {\n try {\n const parts = new Intl.DateTimeFormat('cs-CZ', {\n timeZone: 'Europe/Prague',\n year: 'numeric', month: '2-digit', day: '2-digit'\n }).formatToParts(new Date());\n const y = parts.find(p => p.type === 'year')?.value;\n const m = parts.find(p => p.type === 'month')?.value;\n const d = parts.find(p => p.type === 'day')?.value;\n if (y && m && d) {\n const pragueToday = parse(`${y}-${m}-${d}`, 'yyyy-MM-dd', new Date());\n return isSameDay(day, pragueToday);\n }\n } catch {}\n return isSameDay(day, new Date());\n })();\n return (\n <Box\n key={idx}\n borderWidth=\"1px\"\n borderColor={today ? 'brand.primary' : borderColor}\n borderRadius=\"md\"\n p={2}\n minH=\"120px\"\n minW=\"130px\"\n bg={today ? todayHighlightBg : undefined}\n opacity={faded ? 0.6 : 1}\n >\n <Flex align=\"center\" justify=\"space-between\" mb={2}>\n <Text fontWeight=\"bold\">{format(day, 'd')}</Text>\n {!!list.length && (\n <Badge bg=\"brand.primary\" color=\"text.onPrimary\" borderRadius=\"full\">{list.length}</Badge>\n )}\n </Flex>\n <Stack spacing={2}>\n {list.slice(0, 3).map((e) => (\n <Box\n key={e.id}\n as={RouterLink}\n to={`/aktivita/${e.id}`}\n p={2}\n borderWidth=\"1px\"\n borderRadius=\"md\"\n _hover={{ bg: 'rgba(0,0,0,0.03)', borderColor: 'brand.primary' }}\n >\n <Flex align=\"center\" gap={2}>\n <Badge colorScheme={typeColor(e.type)}>{typeLabel(e.type, t)}</Badge>\n <Text fontSize=\"xs\">\n {format(new Date(e.start_time), 'HH:mm')}\n {e.end_time && !isSameDay(new Date(e.start_time), new Date(e.end_time))\n ? ` ${format(new Date(e.end_time), 'd.M.')}`\n : (e.end_time ? ` ${format(new Date(e.end_time), 'HH:mm')}` : '')}\n </Text>\n </Flex>\n <Text fontSize=\"sm\" mt={1}>{e.title}</Text>\n </Box>\n ))}\n {list.length > 3 && (\n <Text fontSize=\"xs\" color={subtleText}>{t('calendar.more_events', { count: list.length - 3 })}</Text>\n )}\n </Stack>\n </Box>\n );\n })}\n </Grid>\n </Box>\n </>\n ) : (\n <Stack spacing={4}>\n {(() => {\n const keys = Array.from(byDate.keys()).sort();\n return keys.map((k) => {\n const dayEvents = byDate.get(k) || [];\n return (\n <Box key={k} borderWidth=\"1px\" borderColor={borderColor} borderRadius=\"md\" overflow=\"hidden\" bg={cardBg}>\n <Box px={3} py={2} bg={listHeaderBg} borderLeftWidth=\"4px\" borderLeftColor={'brand.primary'}>\n <Flex align=\"center\" gap={2}>\n <Text fontWeight=\"semibold\">\n {format(parse(k, 'yyyy-MM-dd', new Date()), 'EEEE d. M. yyyy', { locale: cs })}\n </Text>\n <Badge colorScheme=\"purple\" borderRadius=\"full\">{dayEvents.length}</Badge>\n </Flex>\n </Box>\n <Stack spacing={3}>\n {dayEvents.map((e) => (\n <Flex\n key={e.id}\n as={RouterLink}\n to={`/aktivita/${e.id}`}\n align=\"center\"\n justify=\"space-between\"\n p={3}\n borderWidth=\"1px\"\n borderColor={borderColor}\n borderRadius=\"md\"\n bg={cardBg}\n _hover={{ bg: hoverBg, borderColor: 'brand.primary' }}\n >\n <Flex direction=\"column\" minW=\"200px\">\n <Text fontWeight=\"semibold\">\n {format(new Date(e.start_time), 'HH:mm')}\n {e.end_time && !isSameDay(new Date(e.start_time), new Date(e.end_time))\n ? ` ${format(new Date(e.end_time), 'd.M. HH:mm')}`\n : (e.end_time ? ` ${format(new Date(e.end_time), 'HH:mm')}` : '')}\n </Text>\n {e.location && <Text color={mutedText} fontSize=\"sm\">{e.location}</Text>}\n </Flex>\n <Flex align=\"center\" gap={2} flex=\"1\" justify=\"center\">\n <Badge colorScheme={typeColor(e.type)}>{typeLabel(e.type, t)}</Badge>\n <Text>{e.title}</Text>\n </Flex>\n </Flex>\n ))}\n </Stack>\n </Box>\n );\n });\n })()}\n </Stack>\n )\n )}\n </Container>\n </MainLayout>\n );\n};\n\nexport default ActivitiesCalendarPage;\n","import React, { createContext, useContext, useEffect, useMemo, useState } from 'react';\nimport { usePublicSettings } from '../hooks/usePublicSettings';\nimport { facrApi } from '../services/facr/facrApi';\nimport { extractPalette, pickTextColor, isContrastAccessible } from '../utils/colors';\nimport { fetchLogoFromLogoAPI } from '../utils/sportLogosAPI';\n\nexport interface ClubTheme {\n primary: string;\n secondary: string;\n accent: string;\n textOnPrimary: string;\n textOnSecondary?: string;\n textOnAccent?: string;\n background?: string;\n text?: string;\n logoUrl?: string;\n name?: string;\n}\n\nconst defaultTheme: ClubTheme = {\n primary: '#0b5cff',\n secondary: '#ffd200',\n accent: '#141414',\n textOnPrimary: '#ffffff',\n};\n\nconst ClubThemeContext = createContext<ClubTheme>(defaultTheme);\n\nexport const useClubTheme = () => useContext(ClubThemeContext);\n\nexport const ClubThemeProvider: React.FC<{ children: React.ReactNode }>= ({ children }) => {\n const { data: settings } = usePublicSettings();\n const clubId = settings?.club_id;\n const clubType = settings?.club_type || 'football';\n\n const [theme, setTheme] = useState<ClubTheme>(defaultTheme);\n\n // Create a stable settings key to prevent unnecessary re-runs\n const settingsKey = useMemo(() => {\n if (!settings) return null;\n const key = JSON.stringify({\n primary_color: settings.primary_color,\n secondary_color: settings.secondary_color,\n accent_color: settings.accent_color,\n text_color: settings.text_color,\n background_color: settings.background_color,\n club_logo_url: settings.club_logo_url,\n club_id: settings.club_id,\n club_type: settings.club_type,\n club_name: settings.club_name,\n });\n return key;\n }, [settings]);\n\n useEffect(() => {\n if (!settingsKey) return; // Don't run if no settings available\n \n let mounted = true;\n (async () => {\n try {\n // Prefer explicit settings from Admin if available\n const explicitPrimary = settings?.primary_color && settings.primary_color.trim() !== '' ? settings.primary_color : undefined;\n const explicitSecondary = settings?.secondary_color && settings.secondary_color.trim() !== '' ? settings.secondary_color : undefined;\n const explicitAccent = settings?.accent_color && settings.accent_color.trim() !== '' ? settings.accent_color : undefined;\n const explicitText = settings?.text_color && settings.text_color.trim() !== '' ? settings.text_color : undefined;\n const explicitLogo = settings?.club_logo_url;\n const explicitName = settings?.club_name;\n const explicitBackground = settings?.background_color && settings.background_color.trim() !== '' ? settings.background_color : undefined;\n\n let primary = explicitPrimary;\n let secondary = explicitSecondary;\n let accent = explicitAccent;\n let textOnPrimary = explicitText;\n let textOnSecondary: string | undefined;\n let textOnAccent: string | undefined;\n let logoUrl = explicitLogo;\n let name = explicitName;\n let background = explicitBackground;\n let text = explicitText;\n\n // Strategy:\n // 1) If we have a logo URL, we can always extract colors from it even when clubId is missing.\n // 2) Only reach to FACR when logo or name are missing AND we do have a clubId.\n if (!primary || !secondary || !accent || !logoUrl || !name) {\n // If logo/name missing but we have clubId, fetch club basics\n if ((!logoUrl || !name) && clubId) {\n try {\n const club = await facrApi.getClub(clubId, clubType as any);\n // Prefer FACR temporarily; final preference will try logoapi below\n logoUrl = logoUrl || club.logo_url;\n name = name || club.name;\n } catch {\n // ignore fetch errors; we may still proceed with defaults/palette\n }\n }\n\n // If we have a logo at this point, try to extract palette regardless of clubId\n let colors: string[] = [];\n try {\n colors = logoUrl ? await extractPalette(logoUrl, 5) : [];\n } catch {\n colors = [];\n }\n primary = primary || colors[0] || defaultTheme.primary;\n secondary = secondary || colors[1] || defaultTheme.secondary;\n accent = accent || colors.find(c => pickTextColor(c) === '#ffffff') || '#1a1a1a';\n\n // If after all this we still lack logo/name and also have no clubId, do not hard fail; continue with colors and defaults\n if (!logoUrl && !clubId) {\n // keep logoUrl undefined; theme will still apply colors\n }\n }\n\n // Derive text colors for contrast\n textOnPrimary = textOnPrimary || pickTextColor(primary!);\n textOnSecondary = pickTextColor(secondary!);\n textOnAccent = pickTextColor(accent!);\n\n // Background/text fallbacks\n background = background || '#ffffff';\n // Choose readable text color directly based on background contrast\n // If background is light (e.g., white), this will return a dark color (e.g., black)\n // If background is dark, it will return white for readability\n text = text || pickTextColor(background!);\n\n // Ensure WCAG AA contrast for primary text if possible\n if (!isContrastAccessible(primary!, textOnPrimary)) {\n textOnPrimary = pickTextColor(primary!);\n }\n if (!isContrastAccessible(secondary!, textOnSecondary)) {\n textOnSecondary = pickTextColor(secondary!);\n }\n if (!isContrastAccessible(accent!, textOnAccent)) {\n textOnAccent = pickTextColor(accent!);\n }\n\n // Prefer local logo from settings; only fetch from logoapi when no explicit local logo is configured\n if (!explicitLogo && clubId) {\n try {\n const apiLogo = await fetchLogoFromLogoAPI(String(clubId), name);\n if (apiLogo) {\n logoUrl = apiLogo;\n }\n } catch {\n // best-effort only\n }\n }\n\n const next: ClubTheme = {\n primary: primary!,\n secondary: secondary!,\n accent: accent!,\n textOnPrimary: textOnPrimary!,\n textOnSecondary,\n textOnAccent,\n background,\n text,\n logoUrl,\n name,\n };\n \n // Only update theme if it has actually changed\n if (mounted && (\n theme.primary !== next.primary ||\n theme.secondary !== next.secondary ||\n theme.accent !== next.accent ||\n theme.textOnPrimary !== next.textOnPrimary ||\n theme.logoUrl !== next.logoUrl ||\n theme.name !== next.name\n )) {\n setTheme(next);\n // expose CSS variables for raw CSS usage\n // NOTE: Do NOT set --club-bg or --club-text as they interfere with Chakra's dark mode\n const r = document.documentElement;\n r.style.setProperty('--club-primary', next.primary);\n r.style.setProperty('--club-secondary', next.secondary);\n r.style.setProperty('--club-accent', next.accent);\n r.style.setProperty('--club-text-on-primary', next.textOnPrimary);\n if (next.textOnSecondary) r.style.setProperty('--club-text-on-secondary', next.textOnSecondary);\n if (next.textOnAccent) r.style.setProperty('--club-text-on-accent', next.textOnAccent);\n // Only set these as fallbacks, they should not override dark mode\n r.style.setProperty('--club-bg-light', background!);\n r.style.setProperty('--club-text-light', text!);\n \n // Cache colors in localStorage for instant loading on next visit\n try {\n localStorage.setItem('club_theme_cache', JSON.stringify({\n primary: next.primary,\n secondary: next.secondary,\n accent: next.accent,\n textOnPrimary: next.textOnPrimary,\n textOnSecondary: next.textOnSecondary,\n textOnAccent: next.textOnAccent,\n background,\n text,\n timestamp: Date.now()\n }));\n } catch (e) {\n // localStorage may fail in private browsing\n }\n }\n } catch (error) {\n console.warn('ClubTheme: Error updating theme:', error);\n // Don't reset to default theme on error - keep current theme\n }\n })();\n return () => { mounted = false; };\n }, [settingsKey]);\n\n const value = useMemo(() => theme, [theme]);\n return (\n <ClubThemeContext.Provider value={value}>{children}</ClubThemeContext.Provider>\n );\n};\n","import api from './api';\n\nexport interface ClothingItem {\n id: number;\n title: string;\n description?: string;\n price?: number;\n currency?: string;\n image_url: string;\n url?: string;\n is_active?: boolean;\n display_order?: number;\n created_at?: string;\n updated_at?: string;\n}\n\nexport interface ClothingResponse {\n data: ClothingItem[];\n}\n\n// Public endpoint - get all active clothing items\nexport const getClothing = async (): Promise<ClothingItem[]> => {\n const response = await api.get<ClothingResponse>('/clothing');\n return response.data.data;\n};\n\n// Admin endpoint - get all clothing items\nexport const getClothingAdmin = async (): Promise<ClothingItem[]> => {\n const response = await api.get<ClothingResponse>('/admin/clothing');\n return response.data.data;\n};\n\n// Admin endpoint - create clothing item\nexport const createClothing = async (data: Partial<ClothingItem>): Promise<ClothingItem> => {\n const response = await api.post<ClothingItem>('/admin/clothing', data);\n return response.data;\n};\n\n// Admin endpoint - update clothing item\nexport const updateClothing = async (id: number, data: Partial<ClothingItem>): Promise<ClothingItem> => {\n const response = await api.put<ClothingItem>(`/admin/clothing/${id}`, data);\n return response.data;\n};\n\n// Admin endpoint - delete clothing item\nexport const deleteClothing = async (id: number): Promise<void> => {\n await api.delete(`/admin/clothing/${id}`);\n};\n\n// Admin endpoint - update display order\nexport const updateClothingOrder = async (items: Array<{ id: number; display_order: number }>): Promise<void> => {\n await api.post('/admin/clothing/reorder', items);\n};\n","import React from 'react';\nimport { HStack, Text, Spinner, Icon, Tooltip } from '@chakra-ui/react';\nimport { FiCheck, FiAlertCircle, FiClock } from 'react-icons/fi';\nimport type { SaveStatus } from '../../hooks/useAutoSave';\n\ninterface SaveStatusIndicatorProps {\n status: SaveStatus;\n lastSaved: Date | null;\n compact?: boolean;\n}\n\nconst SaveStatusIndicator: React.FC<SaveStatusIndicatorProps> = ({\n status,\n lastSaved,\n compact = false,\n}) => {\n const getStatusDisplay = () => {\n switch (status) {\n case 'saving':\n return {\n icon: <Spinner size=\"xs\" color=\"blue.500\" />,\n text: 'Ukládání...',\n color: 'blue.500',\n };\n case 'saved':\n return {\n icon: <Icon as={FiCheck} color=\"green.500\" />,\n text: 'Uloženo',\n color: 'green.500',\n };\n case 'error':\n return {\n icon: <Icon as={FiAlertCircle} color=\"orange.500\" />,\n text: 'Uloženo lokálně',\n color: 'orange.500',\n };\n default:\n return {\n icon: <Icon as={FiClock} color=\"gray.400\" />,\n text: 'Čeká se na změny...',\n color: 'gray.400',\n };\n }\n };\n\n const { icon, text, color } = getStatusDisplay();\n\n const getLastSavedText = () => {\n if (!lastSaved) return null;\n \n const now = new Date();\n const diff = Math.floor((now.getTime() - lastSaved.getTime()) / 1000); // seconds\n \n if (diff < 60) return 'před chvílí';\n if (diff < 3600) return `před ${Math.floor(diff / 60)} min`;\n if (diff < 86400) return `před ${Math.floor(diff / 3600)} h`;\n return lastSaved.toLocaleString('cs-CZ', { \n day: 'numeric', \n month: 'short', \n hour: '2-digit', \n minute: '2-digit' \n });\n };\n\n const lastSavedText = getLastSavedText();\n\n if (compact) {\n return (\n <Tooltip \n label={lastSavedText ? `${text} ${lastSavedText}` : text}\n hasArrow\n >\n <HStack spacing={1}>\n {icon}\n </HStack>\n </Tooltip>\n );\n }\n\n return (\n <HStack spacing={2} fontSize=\"sm\">\n {icon}\n <Text color={color} fontWeight=\"medium\">\n {text}\n </Text>\n {lastSavedText && status === 'saved' && (\n <Text color=\"gray.500\" fontSize=\"xs\">\n {lastSavedText}\n </Text>\n )}\n </HStack>\n );\n};\n\nexport default SaveStatusIndicator;\n","import React from 'react';\nimport PremiumLayout from './PremiumLayout';\nimport { Box, Heading, Text, Button } from '@chakra-ui/react';\nimport { Link as RouterLink } from 'react-router-dom';\n\nconst PremiumNotFound: React.FC = () => {\n return (\n <PremiumLayout>\n <Box className=\"sparta-container sparta-section\" py={20} textAlign=\"center\">\n <Heading as=\"h1\" fontSize={{ base: '5xl', md: '6xl' }} mb={4} textTransform=\"uppercase\">\n 404\n </Heading>\n <Text fontSize={{ base: 'lg', md: 'xl' }} mb={4} opacity={0.9}>\n Oops! Stránka nebyla nalezena.\n </Text>\n <Text fontSize=\"md\" mb={8} opacity={0.8}>\n Stránka, kterou hledáte, byla pravděpodobně smazána nebo přesunuta.\n </Text>\n <Button\n as={RouterLink}\n to=\"/\"\n size=\"lg\"\n className=\"sparta-button-primary\"\n >\n Zpět na úvodní stránku\n </Button>\n </Box>\n </PremiumLayout>\n );\n};\n\nexport default PremiumNotFound;\n","import React, { useEffect, useState } from 'react';\nimport { assetUrl } from '../../utils/url';\nimport { API_URL } from '../../services/api';\n\ninterface Sponsor {\n id: number | string;\n name: string;\n logo: string;\n url?: string;\n tier?: string;\n display_order?: number;\n}\n\ninterface SponsorsSectionProps {\n layout?: 'grid' | 'slider' | 'scroller' | 'pyramid';\n theme?: 'dark' | 'light';\n}\n\nconst resolveBackendUrl = (path: string) => {\n try {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (path.startsWith('/cache') || path.startsWith('/uploads') || path.startsWith('/api/')) {\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n const abs = new URL(path, origin);\n return abs.toString();\n }\n return path;\n } catch {\n return path;\n }\n};\n\nconst SponsorsSection: React.FC<SponsorsSectionProps> = ({ \n layout = 'grid', \n theme = 'light' \n}) => {\n const [sponsors, setSponsors] = useState<Sponsor[]>([]);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n \n const fetchSponsors = async () => {\n try {\n // Try API first\n const apiRes = await fetch(`${API_URL}/sponsors`);\n if (apiRes.ok) {\n const data = await apiRes.json();\n if (!cancelled && Array.isArray(data)) {\n const mapped = data.map((s: any) => ({\n id: s.id,\n name: s.name,\n logo: assetUrl(s.logo_url) || '/images/sponsors/placeholder.png',\n url: s.website_url || undefined,\n tier: s.tier,\n display_order: typeof s.display_order === 'number' ? s.display_order : undefined,\n }));\n setSponsors(mapped);\n setLoading(false);\n return;\n }\n }\n } catch {}\n\n // Fallback to cache\n try {\n const cacheRes = await fetch(resolveBackendUrl('/cache/prefetch/settings.json'), { cache: 'no-cache' });\n if (cacheRes.ok) {\n const settings = await cacheRes.json();\n if (!cancelled) {\n const sponsorsData = settings?.sponsors || settings?.partners || [];\n if (Array.isArray(sponsorsData) && sponsorsData.length) {\n setSponsors(\n sponsorsData.map((s: any, i: number) => ({\n id: s.id ?? i + 1,\n name: s.name || 'Sponsor',\n logo: assetUrl(s.logo_url || s.logoUrl || s.logo) || '/images/sponsors/placeholder.png',\n url: s.url || s.website || s.link || '#',\n tier: s.tier,\n display_order: typeof s.display_order === 'number' ? s.display_order : undefined,\n }))\n );\n }\n }\n }\n } catch {}\n \n if (!cancelled) {\n setLoading(false);\n }\n };\n\n fetchSponsors();\n return () => { cancelled = true; };\n }, []);\n\n if (loading || sponsors.length === 0) {\n return null;\n }\n\n const sorted = [...sponsors].sort((a: any, b: any) => {\n const at = a.tier === 'general' ? 0 : 1;\n const bt = b.tier === 'general' ? 0 : 1;\n if (at !== bt) return at - bt;\n const ao = (a as any).display_order ?? 9999;\n const bo = (b as any).display_order ?? 9999;\n if (ao !== bo) return ao - bo;\n return String(a.name || '').localeCompare(String(b.name || ''));\n });\n const title = sorted.find((s: any) => s.tier === 'general') || sorted[0];\n const others = sorted.filter((s) => s !== title);\n\n return (\n <section\n className={`sponsors ${theme === 'dark' ? 'dark' : ''}`}\n style={{\n width: '100vw',\n position: 'relative',\n left: '50%',\n right: '50%',\n transform: 'translateX(-50%)',\n paddingLeft: 'max(16px, calc((100vw - 1200px) / 2))',\n paddingRight: 'max(16px, calc((100vw - 1200px) / 2))',\n boxSizing: 'border-box',\n marginTop: '32px',\n marginBottom: '32px',\n }}\n >\n <div className=\"section-head\">\n <h3>Sponzoři</h3>\n </div>\n {layout === 'grid' ? (\n <>\n {title && (\n <div className=\"title-sponsor\">\n <a className=\"sponsor-tile\" href={title.url || '#'} target=\"_blank\" rel=\"noreferrer noopener\">\n <img src={title.logo} alt={title.name} />\n </a>\n </div>\n )}\n <div className=\"divider\" aria-hidden />\n <div className=\"sponsors-grid\">\n {others.map((s) => (\n <a key={s.id} className=\"sponsor-tile\" href={s.url || '#'} target=\"_blank\" rel=\"noreferrer noopener\">\n <img src={s.logo} alt={s.name} />\n </a>\n ))}\n </div>\n </>\n ) : (\n <div className=\"sponsors-slider\">\n <div className=\"track\">\n {[...sponsors, ...sponsors].map((s, idx) => (\n <a key={`${s.id}-${idx}`} className=\"sponsor-tile\" href={s.url || '#'} target=\"_blank\" rel=\"noreferrer noopener\">\n <img src={s.logo} alt={s.name} />\n </a>\n ))}\n </div>\n </div>\n )}\n </section>\n );\n};\n\nexport default SponsorsSection;\n","import React from 'react';\nimport NewsletterSubscribe from '../newsletter/NewsletterSubscribe';\n\nconst NewsletterCTA: React.FC = () => {\n return (\n <section className=\"newsletter-cta\" style={{ marginTop: 24, marginBottom: 24 }}>\n <div className=\"card\" style={{ maxWidth: 960, margin: '0 auto' }}>\n <NewsletterSubscribe />\n </div>\n </section>\n );\n};\n\nexport default NewsletterCTA;\n","// Utility functions for tracking events with Umami and backend analytics\n// This provides a centralized way to track events throughout the app\n\nimport { trackEvent as trackBackendEvent } from '../services/analyticsService';\n\n/**\n * Track a custom event with Umami and backend analytics\n * @param eventName - Name of the event (max 50 chars)\n * @param eventData - Optional data object to attach to the event\n */\nexport const trackEvent = (eventName: string, eventData?: Record<string, any>) => {\n // Track with Umami if available\n if (typeof window !== 'undefined' && window.umami) {\n window.umami.track(eventName, eventData);\n }\n\n // Also track with backend\n trackBackendEvent({\n event_type: eventName,\n page: typeof window !== 'undefined' ? window.location.pathname : undefined,\n data: eventData,\n }).catch(err => {\n console.debug('Backend tracking failed:', err);\n });\n};\n\n/**\n * Track button clicks and interactions\n */\nexport const trackButtonClick = (buttonName: string, location?: string) => {\n const pagePath = location || (typeof window !== 'undefined' ? window.location.pathname : '/');\n \n // Track with standard event\n trackEvent('Button Click', {\n button: buttonName,\n location: pagePath,\n });\n\n // Also track as interaction for analytics\n trackBackendEvent({\n event_type: 'click',\n page: pagePath,\n element: buttonName,\n }).catch(err => {\n console.debug('Interaction tracking failed:', err);\n });\n};\n\n/**\n * Track form submissions\n */\nexport const trackFormSubmit = (formName: string, success: boolean = true) => {\n trackEvent('Form Submit', {\n form: formName,\n success,\n });\n};\n\n/**\n * Track navigation\n */\nexport const trackNavigation = (destination: string, source?: string) => {\n trackEvent('Navigation', {\n destination,\n source: source || window.location.pathname,\n });\n};\n\n/**\n * Track article views\n */\nexport const trackArticleView = (articleId: string | number, articleTitle: string) => {\n trackEvent('Article View', {\n id: articleId,\n title: articleTitle,\n });\n};\n\n/**\n * Track match views\n */\nexport const trackMatchView = (matchId: string | number) => {\n trackEvent('Match View', {\n id: matchId,\n });\n};\n\n/**\n * Track search queries\n */\nexport const trackSearch = (query: string, resultsCount?: number) => {\n trackEvent('Search', {\n query,\n results: resultsCount,\n });\n};\n\n/**\n * Track video plays\n */\nexport const trackVideoPlay = (videoId: string, videoTitle?: string) => {\n trackEvent('Video Play', {\n id: videoId,\n title: videoTitle,\n });\n};\n\n/**\n * Track newsletter subscriptions\n */\nexport const trackNewsletterSubscribe = (source?: string) => {\n trackEvent('Newsletter Subscribe', {\n source: source || window.location.pathname,\n });\n};\n\n/**\n * Track file downloads\n */\nexport const trackDownload = (fileName: string, fileType?: string) => {\n trackEvent('Download', {\n file: fileName,\n type: fileType,\n });\n};\n\n/**\n * Track social media shares\n */\nexport const trackSocialShare = (platform: string, url?: string) => {\n trackEvent('Social Share', {\n platform,\n url: url || window.location.href,\n });\n};\n\n/**\n * Track contact form submissions\n */\nexport const trackContactSubmit = (success: boolean = true) => {\n trackEvent('Contact Form', {\n success,\n });\n};\n\n// Extend window interface\ndeclare global {\n interface Window {\n umami?: {\n track: (eventName: string, eventData?: Record<string, any>) => void;\n };\n }\n}\n","import React from 'react';\nimport { FiChevronLeft, FiChevronRight } from 'react-icons/fi';\nimport { TeamLogo } from '../common/TeamLogo';\nimport { sanitizeClubName } from '../../utils/url';\n\nexport type NextMatchData = {\n competition?: string;\n home_id?: any;\n home?: string;\n home_logo_url?: string;\n away_id?: any;\n away?: string;\n away_logo_url?: string;\n};\n\nconst NextMatch: React.FC<{\n data: NextMatchData | null;\n competitionName?: string;\n countdown?: string;\n onPrev?: () => void;\n onNext?: () => void;\n onOpen?: () => void;\n elementProps?: any;\n}> = ({ data, competitionName, countdown, onPrev, onNext, onOpen, elementProps }) => {\n const show = data;\n return (\n <section\n className=\"next-match\"\n {...(elementProps as any)}\n role={onOpen ? 'button' : 'region'}\n aria-label={`Další zápas: ${sanitizeClubName(show?.home || '')} vs ${sanitizeClubName(show?.away || '')}${competitionName ? `, ${competitionName}` : ''}`}\n tabIndex={onOpen ? 0 : -1}\n onKeyDown={(e) => { if (!onOpen) return; if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); e.stopPropagation(); onOpen?.(); } }}\n onClick={(e) => { e.stopPropagation(); onOpen?.(); }}\n style={{ cursor: onOpen ? 'pointer' : 'default', position: 'relative', ...(elementProps?.style || {}) }}\n >\n {onPrev && (\n <button\n aria-label=\"Předchozí soutěž\"\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); onPrev?.(); }}\n className=\"nav prev\"\n style={{ background: 'transparent', border: 'none', color: 'var(--text-on-primary)' }}\n >\n <FiChevronLeft size={24} />\n </button>\n )}\n\n <div className=\"team\">\n <TeamLogo\n className=\"logo\"\n teamId={show?.home_id}\n teamName={show?.home}\n facrLogo={show?.home_logo_url}\n size=\"custom\"\n alt=\"Domácí\"\n borderRadius=\"full\"\n />\n <div>{sanitizeClubName(show?.home || '')}</div>\n </div>\n\n <div className=\"countdown\">\n {competitionName && (\n <div style={{ fontSize: '0.8rem', opacity: 0.85, marginBottom: 4 }}>{competitionName}</div>\n )}\n {countdown || '—'}\n <div style={{ fontSize: '0.8rem', opacity: 0.85 }}>Začátek zápasu</div>\n </div>\n\n <div className=\"team\">\n <TeamLogo\n className=\"logo\"\n teamId={show?.away_id}\n teamName={show?.away}\n facrLogo={show?.away_logo_url}\n size=\"custom\"\n alt=\"Hosté\"\n borderRadius=\"full\"\n />\n <div>{sanitizeClubName(show?.away || '')}</div>\n </div>\n\n {onNext && (\n <button\n aria-label=\"Další soutěž\"\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); onNext?.(); }}\n className=\"nav next\"\n style={{ background: 'transparent', border: 'none', color: 'var(--text-on-primary)' }}\n >\n <FiChevronRight size={24} />\n </button>\n )}\n </section>\n );\n};\n\nexport default NextMatch;\n","import React, { useState } from 'react';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport { Box, Heading, FormControl, FormLabel, Input, Button, VStack, useToast, Text } from '@chakra-ui/react';\nimport api from '../../services/api';\n\nconst AdminResetPasswordPage: React.FC = () => {\n const [email, setEmail] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [sent, setSent] = useState(false);\n const toast = useToast();\n\n const sendReset = async (e: React.FormEvent) => {\n e.preventDefault();\n setIsLoading(true);\n try {\n await api.post('/admin/users/send-reset', { email });\n setSent(true);\n toast({ status: 'success', title: 'Odesláno', description: 'Pokud účet existuje, byl odeslán e-mail pro reset hesla.' });\n } catch (err: any) {\n toast({ status: 'error', title: 'Chyba', description: err.response?.data?.error || 'Nepodařilo se odeslat e-mail.' });\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <AdminLayout>\n <Box maxW=\"lg\">\n <Heading size=\"md\" mb={4}>Odeslat reset hesla</Heading>\n <Text fontSize=\"sm\" color=\"gray.600\" mb={3}>\n Tato akce odešle uživateli e-mail s odkazem pro nastavení nového hesla. Použije se speciální SMTP konfigurace určená pouze pro reset.\n </Text>\n <VStack as=\"form\" onSubmit={sendReset} spacing={4} align=\"stretch\">\n <FormControl isRequired>\n <FormLabel>Email uživatele</FormLabel>\n <Input type=\"email\" value={email} onChange={(e) => setEmail(e.target.value)} placeholder=\"uzivatel@example.com\" />\n </FormControl>\n <Button colorScheme=\"blue\" type=\"submit\" isLoading={isLoading}>Odeslat e-mail</Button>\n {sent && (\n <Text color=\"green.600\">Pokud adresa existuje, e-mail s odkazem byl odeslán.</Text>\n )}\n </VStack>\n </Box>\n </AdminLayout>\n );\n};\n\nexport default AdminResetPasswordPage;\n","import api, { API_URL } from './api';\n\nexport type ManualCompetition = {\n id: number;\n club_id: string;\n club_type: string;\n code: string;\n name: string;\n external_id: string;\n matches_link?: string;\n table_link?: string;\n team_count?: string;\n};\n\nexport type MatchesImportResult = {\n imported: number;\n updated: number;\n errors: string[];\n};\n\nexport type TablesImportResult = {\n imported: number;\n errors: string[];\n};\n\nexport type ManualCompetitionInput = {\n code: string;\n name: string;\n external_id: string;\n team_count?: string;\n};\n\nexport async function listManualCompetitions(): Promise<ManualCompetition[]> {\n const res = await api.get<ManualCompetition[] | { data: ManualCompetition[] }>(\n '/admin/manual/competitions'\n );\n return Array.isArray(res.data) ? res.data : (res.data as any).data;\n}\n\nexport async function createManualCompetition(payload: ManualCompetitionInput): Promise<ManualCompetition> {\n const res = await api.post<ManualCompetition | { data: ManualCompetition }>(\n '/admin/manual/competitions',\n payload\n );\n return (res.data as any).id ? (res.data as any) : (res.data as any).data;\n}\n\nexport async function updateManualCompetition(id: number, payload: ManualCompetitionInput): Promise<ManualCompetition> {\n const res = await api.put<ManualCompetition | { data: ManualCompetition }>(\n `/admin/manual/competitions/${id}`,\n payload\n );\n return (res.data as any).id ? (res.data as any) : (res.data as any).data;\n}\n\nexport async function deleteManualCompetition(id: number): Promise<void> {\n await api.delete(`/admin/manual/competitions/${id}`);\n}\n\nexport function getMatchesTemplateUrl(): string {\n const base = (API_URL || '').replace(/\\/$/, '');\n return `${base}/admin/manual/matches/template`;\n}\n\nexport function getTablesTemplateUrl(): string {\n const base = (API_URL || '').replace(/\\/$/, '');\n return `${base}/admin/manual/tables/template`;\n}\n\n/**\n * Import matches from a CSV or XLSX file.\n * @param file The file to import.\n * @returns The import result.\n */\nexport async function importManualMatches(file: File): Promise<MatchesImportResult> {\n const formData = new FormData();\n formData.append('file', file);\n const res = await api.post<MatchesImportResult | { imported: number; updated: number; errors: string[] }>(\n '/admin/manual/matches/import',\n formData,\n {\n headers: { 'Content-Type': 'multipart/form-data' },\n }\n );\n const data: any = res.data || {};\n return {\n imported: typeof data.imported === 'number' ? data.imported : 0,\n updated: typeof data.updated === 'number' ? data.updated : 0,\n errors: Array.isArray(data.errors) ? data.errors : [],\n };\n}\n\n/**\n * Import tables from a CSV or XLSX file.\n * @param file The file to import.\n * @returns The import result.\n */\nexport async function importManualTables(file: File): Promise<TablesImportResult> {\n const formData = new FormData();\n formData.append('file', file);\n const res = await api.post<TablesImportResult | { imported: number; errors: string[] }>(\n '/admin/manual/tables/import',\n formData,\n {\n headers: { 'Content-Type': 'multipart/form-data' },\n }\n );\n const data: any = res.data || {};\n return {\n imported: typeof data.imported === 'number' ? data.imported : 0,\n errors: Array.isArray(data.errors) ? data.errors : [],\n };\n}\n\n/**\n * Import matches from a JSON payload.\n * @param payload The JSON payload to import.\n * @returns The import result.\n */\nexport async function importManualMatchesJSON(payload: any): Promise<MatchesImportResult> {\n const res = await api.post<MatchesImportResult | { imported: number; updated: number; errors: string[] }>(\n '/admin/manual/matches/import-json',\n payload,\n );\n const data: any = res.data || {};\n return {\n imported: typeof data.imported === 'number' ? data.imported : 0,\n updated: typeof data.updated === 'number' ? data.updated : 0,\n errors: Array.isArray(data.errors) ? data.errors : [],\n };\n}\n\n/**\n * Import tables from a JSON payload.\n * @param payload The JSON payload to import.\n * @returns The import result.\n */\nexport async function importManualTablesJSON(payload: any): Promise<TablesImportResult> {\n const res = await api.post<TablesImportResult | { imported: number; errors: string[] }>(\n '/admin/manual/tables/import-json',\n payload,\n );\n const data: any = res.data || {};\n return {\n imported: typeof data.imported === 'number' ? data.imported : 0,\n errors: Array.isArray(data.errors) ? data.errors : [],\n };\n}\n","import React, { useMemo, useState } from 'react';\nimport {\n Box,\n Button,\n Flex,\n Heading,\n VStack,\n HStack,\n FormControl,\n FormLabel,\n FormHelperText,\n Input,\n Table,\n Thead,\n Tbody,\n Tr,\n Th,\n Td,\n useToast,\n Text,\n Badge,\n Alert,\n AlertDescription,\n AlertTitle,\n AlertIcon,\n Textarea,\n IconButton,\n useColorModeValue,\n Spinner,\n useDisclosure,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalBody,\n ModalFooter,\n ModalCloseButton,\n UnorderedList,\n ListItem,\n} from '@chakra-ui/react';\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport {\n FiDownload,\n FiTrash2,\n FiSave,\n FiRefreshCcw,\n FiUpload,\n FiEdit,\n} from 'react-icons/fi';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport {\n listManualCompetitions,\n createManualCompetition,\n updateManualCompetition,\n deleteManualCompetition,\n getMatchesTemplateUrl,\n getTablesTemplateUrl,\n importManualMatches,\n importManualTables,\n importManualMatchesJSON,\n importManualTablesJSON,\n ManualCompetition,\n ManualCompetitionInput,\n} from '../../services/manualFacrAdmin';\nimport { usePublicSettings } from '../../hooks/usePublicSettings';\nimport UploadPanel, { UploadPanelFile } from '../../components/common/UploadPanel';\nimport { useConfirmDialog } from '../../contexts/ConfirmDialogContext';\nimport { HelpTooltipCard } from '../../components/common/HelpTooltipCard';\n\nconst exampleMatchesJson = `{\n \"items\": [\n {\n \"competition_code\": \"A1A\",\n \"competition_external_id\": \"\",\n \"round\": \"1. kolo\",\n \"is_home\": \"home\",\n \"opponent_name\": \"FC Hosté\",\n \"opponent_club_link\": \"https://www.fotbal.cz/klub/...\",\n \"external_match_id\": \"MATCH-1\",\n \"kickoff_date\": \"2024-08-01\",\n \"kickoff_time\": \"17:00\",\n \"score_fulltime\": \"\",\n \"score_halftime\": \"\",\n \"match_link\": \"\",\n \"venue\": \"Domácí stadion\",\n \"note\": \"\"\n }\n ]\n}`;\n\nconst exampleTablesJson = `{\n \"items\": [\n {\n \"competition_code\": \"A1A\",\n \"competition_external_id\": \"\",\n \"rank\": \"1\",\n \"team_name\": \"Váš klub\",\n \"team_club_link\": \"https://www.fotbal.cz/klub/...\",\n \"played\": \"1\",\n \"wins\": \"1\",\n \"draws\": \"0\",\n \"losses\": \"0\",\n \"score\": \"3:0\",\n \"points\": \"3\"\n }\n ]\n}`;\n\nconst ManualFacrAdminPage: React.FC = () => {\n const toast = useToast();\n const queryClient = useQueryClient();\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const { data: publicSettings } = usePublicSettings();\n const isManualClubDataMode = (publicSettings?.club_data_mode || '').toLowerCase() === 'manual';\n const isManualFacrMode = process.env.REACT_APP_MANUAL_FACR_MODE === 'true';\n const { confirm } = useConfirmDialog();\n\n // Show message if manual FACR mode is not enabled\n if (!isManualFacrMode) {\n return (\n <Box maxW=\"1400px\" mx=\"auto\" p={6}>\n <Alert status=\"warning\" borderRadius=\"md\">\n <AlertIcon />\n <Box>\n <AlertTitle>Manuální FAČR režim není aktivní</AlertTitle>\n <AlertDescription>\n Tato stránka je dostupná pouze při zapnutém manuálním FAČR režimu.\n Kontaktujte administrátora pro aktivaci této funkce.\n </AlertDescription>\n </Box>\n </Alert>\n </Box>\n );\n }\n\n const { data, isLoading, refetch } = useQuery<ManualCompetition[]>({\n queryKey: ['manual-competitions'],\n queryFn: listManualCompetitions,\n });\n\n const competitions = useMemo(() => data || [], [data]);\n\n const [editingId, setEditingId] = useState<number | null>(null);\n const [form, setForm] = useState<ManualCompetitionInput>({\n code: '',\n name: '',\n external_id: '',\n team_count: '',\n });\n const [bulkCompetitionLine, setBulkCompetitionLine] = useState('');\n const [matchesJson, setMatchesJson] = useState('');\n const [tablesJson, setTablesJson] = useState('');\n const [importingMatchesJson, setImportingMatchesJson] = useState(false);\n const [importingTablesJson, setImportingTablesJson] = useState(false);\n const [templateKind, setTemplateKind] = useState<'matches' | 'tables' | null>(null);\n const {\n isOpen: isTemplateHelpOpen,\n onOpen: openTemplateHelp,\n onClose: closeTemplateHelp,\n } = useDisclosure();\n\n const resetForm = () => {\n setEditingId(null);\n setForm({\n code: '',\n name: '',\n external_id: '',\n team_count: '',\n });\n setBulkCompetitionLine('');\n };\n\n const parseBulkCompetitionLine = (raw: string): { code: string; name: string; teamCount?: string } | null => {\n const value = (raw || '').trim();\n if (!value) return null;\n // First, support multi-line paste: code on first line, name on middle lines, team count on last line.\n const lines = value.split(/\\r?\\n/).map((l) => l.trim()).filter((l) => l !== '');\n if (lines.length >= 3) {\n const code = lines[0];\n const last = lines[lines.length - 1];\n const nameLines = lines.slice(1, lines.length - 1);\n const name = nameLines.join(' ');\n const m = last.match(/^\\d{1,3}$/);\n const teamCount = m ? m[0] : undefined;\n if (!code || !name) return null;\n return { code, name, teamCount };\n }\n // Fallback: single-line format, e.g. \"A1A SATUM 5. liga mužů 16\"\n const tokens = value.replace(/\\t+/g, ' ').split(/\\s+/).filter((t) => t !== '');\n if (tokens.length < 2) return null;\n const code = tokens[0];\n let teamCount: string | undefined;\n const last = tokens[tokens.length - 1];\n if (/^\\d{1,3}$/.test(last)) {\n teamCount = last;\n tokens.pop();\n }\n const nameTokens = tokens.slice(1);\n const name = nameTokens.join(' ').trim();\n if (!code || !name) return null;\n return { code, name, teamCount };\n };\n\n const handleBulkCompetitionApply = () => {\n const parsed = parseBulkCompetitionLine(bulkCompetitionLine);\n if (!parsed) {\n toast({\n title: 'Nelze rozpoznat soutěž',\n description: 'Zkontrolujte formát. Očekává se například \"A1A SATUM 5. liga mužů 16\" nebo tři řádky: kód, název, počet týmů.',\n status: 'warning',\n });\n return;\n }\n setForm((prev) => ({\n ...prev,\n code: parsed.code || prev.code,\n name: parsed.name || prev.name,\n team_count: parsed.teamCount ?? prev.team_count,\n }));\n };\n\n const handleImportMatchesJSON = async () => {\n const raw = matchesJson.trim();\n if (!raw) {\n toast({ title: 'Vložte JSON payload pro import zápasů', status: 'warning' });\n return;\n }\n let payload: any;\n try {\n payload = JSON.parse(raw);\n } catch (err: any) {\n toast({\n title: 'Neplatný JSON',\n description: 'Zkontrolujte prosím syntaxi JSON payloadu.',\n status: 'error',\n });\n return;\n }\n setImportingMatchesJson(true);\n try {\n const res = await importManualMatchesJSON(payload);\n toast({\n title: 'JSON import zápasů dokončen',\n description: `Nově: ${res.imported}, aktualizováno: ${res.updated}.`,\n status: 'success',\n duration: 6000,\n isClosable: true,\n });\n if (res.errors && res.errors.length) {\n console.warn('Chyby JSON importu zápasů:', res.errors);\n }\n await queryClient.invalidateQueries({ queryKey: ['manual-competitions'] });\n } catch (err: any) {\n toast({\n title: 'JSON import zápasů selhal',\n description: err?.message || 'Zkontrolujte formát JSON payloadu.',\n status: 'error',\n });\n } finally {\n setImportingMatchesJson(false);\n }\n };\n\n const handleImportTablesJSON = async () => {\n const raw = tablesJson.trim();\n if (!raw) {\n toast({ title: 'Vložte JSON payload pro import tabulek', status: 'warning' });\n return;\n }\n let payload: any;\n try {\n payload = JSON.parse(raw);\n } catch (err: any) {\n toast({\n title: 'Neplatný JSON',\n description: 'Zkontrolujte prosím syntaxi JSON payloadu.',\n status: 'error',\n });\n return;\n }\n setImportingTablesJson(true);\n try {\n const res = await importManualTablesJSON(payload);\n toast({\n title: 'JSON import tabulek dokončen',\n description: `Načteno řádků: ${res.imported}.`,\n status: 'success',\n duration: 6000,\n isClosable: true,\n });\n if (res.errors && res.errors.length) {\n console.warn('Chyby JSON importu tabulek:', res.errors);\n }\n await queryClient.invalidateQueries({ queryKey: ['manual-competitions'] });\n } catch (err: any) {\n toast({\n title: 'JSON import tabulek selhal',\n description: err?.message || 'Zkontrolujte formát JSON payloadu.',\n status: 'error',\n });\n } finally {\n setImportingTablesJson(false);\n }\n };\n\n const fillFormFromCompetition = (c: ManualCompetition) => {\n setEditingId(c.id);\n setForm({\n code: c.code || '',\n name: c.name || '',\n external_id: c.external_id || '',\n team_count: c.team_count || '',\n });\n };\n\n const upsertMutation = useMutation({\n mutationFn: async () => {\n const payload: ManualCompetitionInput = {\n code: form.code.trim(),\n name: form.name.trim(),\n external_id: form.external_id.trim(),\n team_count: form.team_count?.trim() || undefined,\n };\n if (!payload.code || !payload.name || !payload.external_id) {\n throw new Error('Kód, název a external_id jsou povinné.');\n }\n if (editingId != null) {\n return updateManualCompetition(editingId, payload);\n }\n return createManualCompetition(payload);\n },\n onSuccess: async () => {\n toast({ title: 'Soutěž uložena', status: 'success' });\n resetForm();\n await queryClient.invalidateQueries({ queryKey: ['manual-competitions'] });\n },\n onError: (err: any) => {\n toast({\n title: 'Uložení selhalo',\n description: err?.message || 'Zkuste to prosím znovu.',\n status: 'error',\n });\n },\n });\n\n const deleteMutation = useMutation({\n mutationFn: async (id: number) => {\n await deleteManualCompetition(id);\n },\n onSuccess: async () => {\n toast({ title: 'Soutěž smazána', status: 'success' });\n await queryClient.invalidateQueries({ queryKey: ['manual-competitions'] });\n if (editingId != null) {\n resetForm();\n }\n },\n onError: (err: any) => {\n toast({\n title: 'Smazání selhalo',\n description: err?.message || 'Zkuste to prosím znovu.',\n status: 'error',\n });\n },\n });\n\n const handleSubmitCompetition = (e: React.FormEvent) => {\n e.preventDefault();\n upsertMutation.mutate();\n };\n\n const handleDeleteCompetition = async (c: ManualCompetition) => {\n const ok = await confirm({\n title: 'Smazat soutěž',\n message: `Opravdu chcete smazat soutěž ${c.code} ${c.name}?\\nBudou také odstraněny všechny ruční zápasy a tabulky.`,\n confirmText: 'Smazat',\n cancelText: 'Zrušit',\n isDanger: true,\n });\n if (!ok) return;\n deleteMutation.mutate(c.id);\n };\n\n const uploadMatchesFile = async (file: File): Promise<UploadPanelFile> => {\n try {\n const res = await importManualMatches(file);\n toast({\n title: 'Import zápasů dokončen',\n description: `Nově: ${res.imported}, aktualizováno: ${res.updated}.`,\n status: 'success',\n duration: 6000,\n isClosable: true,\n });\n if (res.errors && res.errors.length) {\n console.warn('Chyby importu zápasů:', res.errors);\n }\n await queryClient.invalidateQueries({ queryKey: ['manual-competitions'] });\n } catch (err: any) {\n toast({\n title: 'Import zápasů selhal',\n description: err?.message || 'Zkontrolujte formát CSV nebo XLSX.',\n status: 'error',\n });\n throw err;\n }\n\n return {\n url: file.name,\n name: file.name,\n type: file.type || 'application/octet-stream',\n size: file.size,\n };\n };\n\n const uploadTablesFile = async (file: File): Promise<UploadPanelFile> => {\n try {\n const res = await importManualTables(file);\n toast({\n title: 'Import tabulek dokončen',\n description: `Načteno řádků: ${res.imported}.`,\n status: 'success',\n duration: 6000,\n isClosable: true,\n });\n if (res.errors && res.errors.length) {\n console.warn('Chyby importu tabulek:', res.errors);\n }\n await queryClient.invalidateQueries({ queryKey: ['manual-competitions'] });\n } catch (err: any) {\n toast({\n title: 'Import tabulek selhal',\n description: err?.message || 'Zkontrolujte formát CSV nebo XLSX.',\n status: 'error',\n });\n throw err;\n }\n\n return {\n url: file.name,\n name: file.name,\n type: file.type || 'application/octet-stream',\n size: file.size,\n };\n };\n\n const handleDownload = (kind: 'matches' | 'tables') => {\n const url = kind === 'matches' ? getMatchesTemplateUrl() : getTablesTemplateUrl();\n window.open(url, '_blank');\n setTemplateKind(kind);\n openTemplateHelp();\n };\n\n return (\n <AdminLayout requireAdmin={true}>\n <Box maxW=\"1400px\" mx=\"auto\">\n <Box mb={6}>\n <Heading size=\"lg\" mb={1}>Krok 2/2: Manuální data soutěží (FAČR)</Heading>\n <Text color=\"gray.600\" fontSize=\"xs\" mb={1}>\n Po úvodním nastavení (krok 1) zde nahrajete zápasy a tabulky z CSV / Excel (XLSX) souborů nebo JSON payloadů, aby se zobrazovaly na webu.\n </Text>\n <Text color=\"gray.600\" fontSize=\"sm\">\n Zde můžete spravovat soutěže, do kterých váš klub patří, a hromadně importovat zápasy i tabulky z CSV\n nebo Excelu (XLSX). V manuálním režimu backend nevolá FACR / fotbal.cz veškerá data pochází z těchto\n ručních vstupů.\n </Text>\n </Box>\n\n <Alert status=\"info\" borderRadius=\"md\" mb={6}>\n <AlertIcon />\n <Box>\n <AlertTitle>Jak postupovat</AlertTitle>\n <AlertDescription fontSize=\"sm\">\n 1) Přidejte soutěže (kód, název, externí ID z odkazu na soutěž).\n 2) Stáhněte si XLSX šablony pro zápasy a tabulky, otevřete je v Excelu / Google Sheets,\n doplňte data a soubor pak nahrajte zpět jako XLSX nebo případně uložte do CSV import podporuje oba formáty.\n Sloupec <code>kod_souteze</code> nebo <code>id_souteze_uuid</code> musí odpovídat zde založeným soutěžím.\n </AlertDescription>\n </Box>\n </Alert>\n\n <Flex gap={6} align=\"flex-start\" direction={{ base: 'column', lg: 'row' }}>\n {/* Competition form */}\n <Box flex=\"1\" bg={cardBg} borderWidth=\"1px\" borderColor={borderColor} borderRadius=\"lg\" p={6}>\n <Heading size=\"md\" mb={4}>{editingId ? 'Upravit soutěž' : 'Nová soutěž'}</Heading>\n <form onSubmit={handleSubmitCompetition}>\n <VStack align=\"stretch\" spacing={4}>\n <FormControl>\n <FormLabel>Vložit vše z FACR řádku</FormLabel>\n <HStack align=\"flex-start\" spacing={2}>\n <Input\n value={bulkCompetitionLine}\n onChange={(e) => setBulkCompetitionLine(e.target.value)}\n placeholder=\"A1A SATUM 5. liga mužů 16\"\n />\n <Button size=\"sm\" onClick={handleBulkCompetitionApply}>\n Vyplnit pole\n </Button>\n </HStack>\n <FormHelperText fontSize=\"xs\">\n Vložte řádek z tabulky „Nová soutěž“ (kód, název, počet týmů). Podporováno je i víceřádkové vložení:\n první řádek kód, druhý název, třetí počet týmů.\n </FormHelperText>\n </FormControl>\n <FormControl isRequired>\n <FormLabel>Kód soutěže (např. A1A)</FormLabel>\n <Input\n value={form.code}\n onChange={(e) => setForm((f) => ({ ...f, code: e.target.value }))}\n placeholder=\"Kód soutěže (FACR)\"\n />\n </FormControl>\n <FormControl isRequired>\n <FormLabel>Název soutěže</FormLabel>\n <Input\n value={form.name}\n onChange={(e) => setForm((f) => ({ ...f, name: e.target.value }))}\n placeholder=\"Např. SATUM 5. liga mužů\"\n />\n </FormControl>\n <FormControl isRequired>\n <FormLabel>\n <HStack spacing={2} align=\"center\">\n <Box as=\"span\">Externí ID soutěže (UUID z odkazu)</Box>\n <HelpTooltipCard\n label=\"Nápověda k externímu ID soutěže\"\n title=\"Jak získat externí ID (UUID) soutěže\"\n items={[\n 'Použijte libovolný odkaz na soutěž na fotbal.cz (např. se segmentem /zapas/, /hlavni/ nebo /table/).',\n 'Můžete vložit celý odkaz systém z něj automaticky vybere samotné UUID.',\n 'UUID pak slouží k vygenerování odkazů na zápasy i tabulku dané soutěže.',\n ]}\n />\n </HStack>\n </FormLabel>\n <Input\n value={form.external_id}\n onChange={(e) => setForm((f) => ({ ...f, external_id: e.target.value }))}\n placeholder=\"UUID nebo celý odkaz na soutěž z fotbal.cz\"\n />\n <FormHelperText fontSize=\"xs\">\n Např. z adresy\n <code> https://www.fotbal.cz/souteze/turnaje/hlavni/e3127865-a109-45cd-9048-3e6429e2eb11</code>\n nebo\n <code> https://www.fotbal.cz/souteze/turnaje/table/e3127865-a109-45cd-9048-3e6429e2eb11</code>\n stačí vložit celý odkaz UUID se vybere automaticky.\n </FormHelperText>\n </FormControl>\n <FormControl>\n <FormLabel>Počet týmů (volitelné)</FormLabel>\n <Input\n value={form.team_count}\n onChange={(e) => setForm((f) => ({ ...f, team_count: e.target.value }))}\n placeholder=\"Např. 14\"\n />\n </FormControl>\n <HStack spacing={3} pt={2}>\n <Button\n type=\"submit\"\n colorScheme=\"blue\"\n leftIcon={<FiSave />}\n isLoading={upsertMutation.isPending}\n >\n {editingId ? 'Uložit změny' : 'Přidat soutěž'}\n </Button>\n {editingId != null && (\n <Button variant=\"outline\" onClick={resetForm}>\n Zrušit úpravy\n </Button>\n )}\n <Button\n variant=\"ghost\"\n leftIcon={<FiRefreshCcw />}\n onClick={() => refetch()}\n >\n Obnovit seznam\n </Button>\n </HStack>\n </VStack>\n </form>\n <Box mt={4}>\n <Text fontSize=\"sm\" color=\"gray.600\" mb={2}>\n Pokročilé: můžete také vložit JSON payload (např. <code>{'{\"items\":[{\"competition_code\":\"A1A\",\"round\":\"1. kolo\",...}]}'}</code>) podle API schématu a importovat jej přímo.\n </Text>\n <Textarea\n rows={4}\n value={matchesJson}\n onChange={(e) => setMatchesJson(e.target.value)}\n placeholder='{\"items\":[{\"competition_code\":\"A1A\",\"round\":\"1. kolo\",...}]}'\n />\n <HStack spacing={3} mt={2}>\n <Button\n size=\"sm\"\n leftIcon={<FiUpload />}\n onClick={handleImportMatchesJSON}\n isLoading={importingMatchesJson}\n colorScheme=\"purple\"\n >\n Importovat JSON\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => setMatchesJson(exampleMatchesJson)}\n >\n Vložit ukázku\n </Button>\n </HStack>\n </Box>\n </Box>\n\n {/* Import panels */}\n <VStack flex=\"1\" spacing={6} align=\"stretch\">\n <Box bg={cardBg} borderWidth=\"1px\" borderColor={borderColor} borderRadius=\"lg\" p={6}>\n <Heading size=\"md\" mb={3}>Import zápasů z Excelu (XLSX) nebo CSV</Heading>\n <Text fontSize=\"sm\" color=\"gray.600\" mb={1}>\n XLSX šablona obsahuje list <code>Zápasy</code> se sloupci pro všechny soutěže, list <code>Souteze</code>\n s přehledem soutěží a list <code>Tymy</code> s názvy týmů z uložených tabulek. Můžete použít jeden soubor\n pro všechny soutěže nebo jeden soubor na každou soutěž.\n </Text>\n <Text fontSize=\"xs\" color=\"gray.500\" mb={2}>\n Sloupce v šabloně (list <code>Zápasy</code>): <code>kod_souteze</code>, <code>id_souteze_uuid</code>, <code>kolo</code>, <code>doma_venku</code>, <code>nazev_soupere</code>, <code>odkaz_klub_soupere</code>, <code>id_zapasu</code>, <code>datum</code>, <code>cas</code>, <code>vysledek</code>, <code>vysledek_polocas</code>, <code>odkaz_na_zapas</code>, <code>hriste</code>.\n </Text>\n <UnorderedList>\n <ListItem><code>vysledek</code> a <code>vysledek_polocas</code> jsou volitelné texty (např. „3:1“ nebo „3:1 (1:0)“).</ListItem>\n <ListItem><code>hriste</code> je volitelné pole pro popis hřiště (město, areál apod.).</ListItem>\n </UnorderedList>\n <HStack spacing={3} mb={3}>\n <Button\n size=\"sm\"\n leftIcon={<FiDownload />}\n onClick={() => handleDownload('matches')}\n >\n Stáhnout šablonu pro Excel (XLSX)\n </Button>\n </HStack>\n <UploadPanel\n label=\"Soubor se zápasy (CSV / XLSX)\"\n description=\"Nahrajte CSV nebo Excel (XLSX) soubor vyplněný podle stažené šablony. Import se spustí automaticky po nahrání.\"\n accept=\".csv,text/csv,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,.xlsx\"\n multiple={false}\n maxFiles={1}\n allowUrlImport={false}\n uploadFn={uploadMatchesFile}\n />\n <Text mt={2} fontSize=\"xs\" color=\"gray.500\">\n Šablona se stahuje jako Excel (XLSX). Otevřete ji v Excelu nebo Google Sheets, vyplňte list <code>Zápasy</code>\n a soubor pak nahrajte zpět jako XLSX nebo případně uložte do CSV import podporuje oba formáty.\n </Text>\n </Box>\n\n <Box bg={cardBg} borderWidth=\"1px\" borderColor={borderColor} borderRadius=\"lg\" p={6}>\n <Heading size=\"md\" mb={3}>Import tabulek z Excelu (XLSX) nebo CSV</Heading>\n <Text fontSize=\"sm\" color=\"gray.600\" mb={1}>\n XLSX šablona obsahuje list <code>Tabulky</code> s řádky tabulek, list <code>Souteze</code> a list\n <code> Tymy</code> s názvy týmů. V polích <code>kod_souteze</code> a <code>nazev_tymu</code> jsou k dispozici\n rozbalovací nabídky podle těchto dat. Každý řádek reprezentuje jeden tým v tabulce.\n </Text>\n <Text fontSize=\"xs\" color=\"gray.500\" mb={2}>\n Sloupce v šabloně (list <code>Tabulky</code>): <code>kod_souteze</code>, <code>id_souteze_uuid</code>, <code>poradi</code>, <code>nazev_tymu</code>, <code>odkaz_na_klub</code>, <code>zapasy</code>, <code>vyhry</code>, <code>remizy</code>, <code>prohry</code>, <code> skore</code>, <code>body</code>.\n </Text>\n <HStack spacing={3} mb={3}>\n <Button\n size=\"sm\"\n leftIcon={<FiDownload />}\n onClick={() => handleDownload('tables')}\n >\n Stáhnout šablonu pro Excel (XLSX)\n </Button>\n </HStack>\n <UploadPanel\n label=\"Soubor s tabulkami (CSV / XLSX)\"\n description=\"Nahrajte CSV nebo Excel (XLSX) soubor vyplněný podle stažené šablony. Import se spustí automaticky po nahrání.\"\n accept=\".csv,text/csv,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,.xlsx\"\n multiple={false}\n maxFiles={1}\n allowUrlImport={false}\n uploadFn={uploadTablesFile}\n />\n <Text mt={2} fontSize=\"xs\" color=\"gray.500\">\n Šablona se stahuje jako Excel (XLSX). Otevřete ji v Excelu nebo Google Sheets, vyplňte list <code>Tabulky</code>\n a soubor pak nahrajte zpět jako XLSX nebo případně uložte do CSV import podporuje oba formáty.\n </Text>\n <Box mt={4}>\n <Text fontSize=\"sm\" color=\"gray.600\" mb={2}>\n Pokročilé: můžete také importovat tabulky z JSON payloadu (pole <code>items</code> se stejnými sloupci jako v CSV).\n </Text>\n <Textarea\n rows={4}\n value={tablesJson}\n onChange={(e) => setTablesJson(e.target.value)}\n placeholder='{\"items\":[{\"competition_code\":\"A1A\",\"team_name\":\"Váš klub\",...}]}'\n />\n <HStack spacing={3} mt={2}>\n <Button\n size=\"sm\"\n leftIcon={<FiUpload />}\n onClick={handleImportTablesJSON}\n isLoading={importingTablesJson}\n colorScheme=\"purple\"\n >\n Importovat JSON\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => setTablesJson(exampleTablesJson)}\n >\n Vložit ukázku\n </Button>\n </HStack>\n </Box>\n </Box>\n </VStack>\n </Flex>\n\n <Box mt={8} bg={cardBg} borderWidth=\"1px\" borderColor={borderColor} borderRadius=\"lg\" p={6}>\n <Heading size=\"md\" mb={4}>Přehled soutěží</Heading>\n {isLoading ? (\n <HStack spacing={3}>\n <Spinner size=\"sm\" />\n <Text>Načítám soutěže…</Text>\n </HStack>\n ) : competitions.length === 0 ? (\n <Text color=\"gray.500\" fontSize=\"sm\">Zatím nejsou založeny žádné soutěže.</Text>\n ) : (\n <Box overflowX=\"auto\">\n <Table size=\"sm\" variant=\"simple\">\n <Thead>\n <Tr>\n <Th>Kód</Th>\n <Th>Název</Th>\n <Th>External ID</Th>\n <Th>Zápasy</Th>\n <Th>Tabulka</Th>\n <Th>Počet týmů</Th>\n <Th isNumeric>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {competitions.map((c) => (\n <Tr key={c.id}>\n <Td>\n <Badge colorScheme=\"blue\" fontFamily=\"mono\">{c.code}</Badge>\n </Td>\n <Td>{c.name}</Td>\n <Td fontFamily=\"mono\" fontSize=\"xs\">{c.external_id}</Td>\n <Td maxW=\"260px\" whiteSpace=\"nowrap\" overflow=\"hidden\" textOverflow=\"ellipsis\">{c.matches_link}</Td>\n <Td maxW=\"260px\" whiteSpace=\"nowrap\" overflow=\"hidden\" textOverflow=\"ellipsis\">{c.table_link}</Td>\n <Td>{c.team_count}</Td>\n <Td isNumeric>\n <HStack spacing={2} justify=\"flex-end\">\n <IconButton\n aria-label=\"Upravit\"\n icon={<FiEdit />}\n size=\"xs\"\n variant=\"ghost\"\n onClick={() => fillFormFromCompetition(c)}\n />\n <IconButton\n aria-label=\"Smazat\"\n icon={<FiTrash2 />}\n size=\"xs\"\n variant=\"ghost\"\n colorScheme=\"red\"\n onClick={() => handleDeleteCompetition(c)}\n />\n </HStack>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n )}\n </Box>\n </Box>\n\n <Modal isOpen={isTemplateHelpOpen} onClose={closeTemplateHelp} size=\"xl\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>\n {templateKind === 'matches'\n ? 'Jak pracovat se šablonou zápasů (XLSX)'\n : 'Jak pracovat se šablonou tabulek (XLSX)'}\n </ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <Box\n mb={4}\n position=\"relative\"\n w=\"100%\"\n pb=\"56.25%\"\n borderRadius=\"md\"\n overflow=\"hidden\"\n bg={useColorModeValue('gray.100', 'gray.700')}\n >\n <Flex\n position=\"absolute\"\n top={0}\n left={0}\n right={0}\n bottom={0}\n align=\"center\"\n justify=\"center\"\n >\n <Text fontSize=\"sm\" color=\"gray.600\" textAlign=\"center\" px={4}>\n Zde bude krátké video s návodem, jak šablonu vyplnit. Prozatím použijte textový návod níže.\n </Text>\n </Flex>\n </Box>\n\n {templateKind === 'matches' ? (\n <>\n <Text fontSize=\"sm\" mb={2}>\n Šablona pro zápasy obsahuje list <code>Zápasy</code> pro samotné zápasy, list <code>Souteze</code>\n s přehledem soutěží a list <code>Tymy</code> s názvy týmů. Z těchto listů se doplňují dropdowny v polích\n <code> kod_souteze</code> a <code>nazev_soupere</code>.\n </Text>\n <UnorderedList spacing={1} fontSize=\"sm\" mt={2}>\n <ListItem>\n Vyberte <code>kod_souteze</code> z rozbalovacího seznamu musí odpovídat soutěžím v přehledu na této stránce.\n </ListItem>\n <ListItem>\n V poli <code>nazev_soupere</code> se zobrazují týmy z listu <code>Tymy</code> a jsou automaticky\n filtrované podle zvoleného <code>kod_souteze</code> v daném řádku.\n </ListItem>\n <ListItem>\n <code>id_souteze_uuid</code> je volitelné „pokročilé“ pole typicky stačí vyplnit pouze <code>kod_souteze</code>.\n </ListItem>\n <ListItem>\n V poli <code>doma_venku</code> použijte hodnoty z dropdownu (např. <code>doma</code> / <code>venku</code>).\n </ListItem>\n <ListItem>\n Pro <code>id_zapasu</code> můžete buď vložit čisté ID, nebo jednoduše vyplnit <code>odkaz_na_zapas</code>\n celým URL z fotbal.cz systém z něj ID automaticky vyextrahuje.\n </ListItem>\n <ListItem>\n Datum a čas vyplňujte ve formátu <code>YYYY-MM-DD</code> a <code>HH:MM</code> (např. <code>2024-08-01</code>, <code>17:00</code>).\n </ListItem>\n </UnorderedList>\n </>\n ) : (\n <>\n <Text fontSize=\"sm\" mb={2}>\n Šablona pro tabulky obsahuje list <code>Tabulky</code>, list <code>Souteze</code> a list\n <code> Tymy</code>. V polích <code>kod_souteze</code> a <code>nazev_tymu</code> jsou dropdowny\n vycházející z těchto dat názvy týmů jsou automaticky filtrované podle soutěže v daném řádku.\n Každý řádek reprezentuje jeden tým v tabulce.\n </Text>\n <UnorderedList spacing={1} fontSize=\"sm\" mt={2}>\n <ListItem>\n Vyberte <code>kod_souteze</code> z dropdownu podle soutěže, ke které tabulka patří.\n </ListItem>\n <ListItem>\n <code>id_souteze_uuid</code> je opět volitelné stačí se držet <code>kod_souteze</code>.\n </ListItem>\n <ListItem>\n Pro <code>nazev_tymu</code> použijte stejný název, jaký chcete zobrazovat v tabulce na webu.\n </ListItem>\n <ListItem>\n Číselné hodnoty jako <code>zapasy</code>, <code>vyhry</code>, <code>remizy</code>, <code>prohry</code>,\n <code> skore</code> a <code>body</code> vyplňujte jako text/číslo přesně tak, jak je chcete ukazovat v přehledu.\n </ListItem>\n </UnorderedList>\n </>\n )}\n </ModalBody>\n <ModalFooter>\n <Button onClick={closeTemplateHelp} colorScheme=\"blue\">\n Zavřít návod\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </AdminLayout>\n );\n};\n\nexport default ManualFacrAdminPage;\n","/**\n * Category sorting utility for sorting competition categories by age groups\n * Priority order: Muži first, then descending U-numbers (U19, U17, U15, etc.)\n */\n\nexport interface CategoryItem {\n name: string;\n alias?: string;\n code?: string;\n [key: string]: any;\n}\n\n/**\n * Extracts the U-number from a category name/alias\n * @param text - Category name or alias\n * @returns The U-number (e.g., 19 from \"U19\") or null if not found\n */\nfunction extractUNumber(text: string): number | null {\n if (!text) return null;\n \n // Look for U followed by digits (U19, U17, U15, etc.)\n const match = text.match(/\\bU(\\d+)\\b/i);\n if (match) {\n return parseInt(match[1], 10);\n }\n \n return null;\n}\n\n/**\n * Checks if a category is for \"Muži\" (Men/Adults)\n * @param text - Category name or alias\n * @returns true if this is a men's/adults category\n */\nfunction isMuzi(text: string): boolean {\n if (!text) return false;\n \n const normalized = text\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, ''); // Remove diacritics\n \n // Check for common terms for adult/men's teams\n return /\\b(muzi|muž|muze|dospeli|dospělí|a[\\s-]?team|a[\\s-]?tym|senior)\\b/i.test(normalized);\n}\n\n/**\n * Gets the sort priority for a category\n * Lower numbers = higher priority (sorted first)\n * @param text - Category name or alias\n * @returns Sort priority number\n */\nfunction getSortPriority(text: string): number {\n if (!text) return 9999;\n \n // Muži always first\n if (isMuzi(text)) {\n return 0;\n }\n \n // U-numbers sorted descending (U19 before U17 before U15, etc.)\n const uNumber = extractUNumber(text);\n if (uNumber !== null) {\n // Use 1000 - uNumber so higher numbers come first\n // U19 = 1000 - 19 = 981\n // U17 = 1000 - 17 = 983\n // U15 = 1000 - 15 = 985\n return 1000 - uNumber;\n }\n \n // Everything else goes to the end, sorted alphabetically\n return 2000;\n}\n\n/**\n * Comparator function for sorting categories\n * @param a - First category\n * @param b - Second category\n * @returns Comparison result\n */\nexport function compareCategories<T extends CategoryItem>(a: T, b: T): number {\n // Use alias if available, otherwise use name\n const aText = a.alias || a.name || '';\n const bText = b.alias || b.name || '';\n \n const aPriority = getSortPriority(aText);\n const bPriority = getSortPriority(bText);\n \n // If priorities are different, sort by priority\n if (aPriority !== bPriority) {\n return aPriority - bPriority;\n }\n \n // If both have same priority (both in \"other\" category), sort alphabetically\n return aText.localeCompare(bText, 'cs');\n}\n\n/**\n * Sorts an array of categories by age (Muži first, then U19, U17, etc.)\n * @param categories - Array of categories to sort\n * @returns Sorted array (new array, does not mutate original)\n */\nexport function sortCategories<T extends CategoryItem>(categories: T[]): T[] {\n return [...categories].sort(compareCategories);\n}\n\n/**\n * Sorts categories with a custom order field, falling back to age-based sorting\n * @param categories - Array of categories to sort\n * @param orderField - Name of the field containing custom order (optional)\n * @returns Sorted array\n */\nexport function sortCategoriesWithOrder<T extends CategoryItem>(\n categories: T[],\n orderField: keyof T = 'display_order' as keyof T\n): T[] {\n return [...categories].sort((a, b) => {\n // If both have custom order, use that\n const aOrder = a[orderField] as number | undefined;\n const bOrder = b[orderField] as number | undefined;\n \n if (typeof aOrder === 'number' && typeof bOrder === 'number') {\n if (aOrder !== bOrder) {\n return aOrder - bOrder;\n }\n }\n \n // If only one has custom order, prioritize it\n if (typeof aOrder === 'number') return -1;\n if (typeof bOrder === 'number') return 1;\n \n // Otherwise fall back to age-based sorting\n return compareCategories(a, b);\n });\n}\n","import { Box, SimpleGrid, Heading, Text, useColorModeValue, HStack, Button, Link, Badge } from '@chakra-ui/react';\nimport { useEffect, useState } from 'react';\nimport HorizontalScroller from '../ui/HorizontalScroller';\nimport { getClothing, ClothingItem } from '../../services/clothing';\nimport { Link as RouterLink } from 'react-router-dom';\n\nconst MerchSection: React.FC<{ variant?: 'grid' | 'carousel' | 'featured' | 'list' }> = ({ variant = 'grid' }) => {\n const [items, setItems] = useState<ClothingItem[]>([]);\n const [loading, setLoading] = useState(true);\n const cardBg = useColorModeValue('white', 'gray.800');\n const eshopUrl = process.env.REACT_APP_ESHOP_URL;\n\n useEffect(() => {\n const fetchItems = async () => {\n try {\n const data = await getClothing();\n // Show only 5 newest items on homepage\n setItems(data.slice(0, 5));\n } catch (e) {\n console.error('Failed to fetch clothing items:', e);\n } finally {\n setLoading(false);\n }\n };\n\n fetchItems();\n }, []);\n\n if (loading || items.length === 0) return null;\n\n // Carousel variant: horizontally scrollable cards\n if (variant === 'carousel') {\n return (\n <Box>\n <HStack justify=\"space-between\" mb={3}>\n <Heading as=\"h3\" size=\"md\">Oblečení týmu</Heading>\n <HStack spacing={2}>\n <Link as={RouterLink} to=\"/obleceni\">\n <Button size=\"sm\" variant=\"outline\" colorScheme=\"blue\">Zobrazit vše</Button>\n </Link>\n {eshopUrl && (\n <Button\n as={Link}\n href={eshopUrl}\n size=\"sm\"\n colorScheme=\"blue\"\n variant=\"solid\"\n isExternal\n >\n E-shop\n </Button>\n )}\n </HStack>\n </HStack>\n <HorizontalScroller draggable>\n {items.map((it) => (\n <Box key={it.id} minW={{ base: '70%', md: '45%', lg: '28%' }}>\n <a \n href={it.url || '/obleceni'} \n target={it.url ? \"_blank\" : undefined}\n rel={it.url ? \"noreferrer noopener\" : undefined}\n >\n <Box \n className=\"card\"\n bg={cardBg} \n overflow=\"hidden\" \n borderWidth=\"1px\"\n transition=\"all 0.2s\"\n _hover={{ transform: 'translateY(-4px)', boxShadow: 'md' }}\n >\n <Box\n aria-hidden\n height={{ base: 140, md: 180 }}\n bgSize=\"cover\"\n bgPos=\"center\"\n style={{ backgroundImage: `url(${it.image_url})` }}\n />\n <Box p={3} borderTopWidth=\"1px\">\n <Text noOfLines={1} fontWeight=\"semibold\" fontSize=\"sm\">{it.title}</Text>\n {it.price && it.price > 0 && (\n <Badge colorScheme=\"blue\" mt={1} fontSize=\"xs\">\n {it.price} {it.currency || 'Kč'}\n </Badge>\n )}\n </Box>\n </Box>\n </a>\n </Box>\n ))}\n </HorizontalScroller>\n </Box>\n );\n }\n\n // Grid/list (default) variant\n return (\n <Box>\n <HStack justify=\"space-between\" mb={3}>\n <Heading as=\"h3\" size=\"md\">Oblečení týmu</Heading>\n <HStack spacing={2}>\n <Link as={RouterLink} to=\"/obleceni\">\n <Button size=\"sm\" variant=\"outline\" colorScheme=\"blue\">Zobrazit vše</Button>\n </Link>\n {eshopUrl && (\n <Button\n as={Link}\n href={eshopUrl}\n size=\"sm\"\n colorScheme=\"blue\"\n variant=\"solid\"\n isExternal\n >\n E-shop\n </Button>\n )}\n </HStack>\n </HStack>\n <SimpleGrid columns={{ base: 2, md: 3, lg: 5 }} spacing={4}>\n {items.map((it) => (\n <a \n key={it.id} \n href={it.url || '/obleceni'} \n target={it.url ? \"_blank\" : undefined}\n rel={it.url ? \"noreferrer noopener\" : undefined}\n >\n <Box \n className=\"card\"\n bg={cardBg} \n overflow=\"hidden\" \n borderWidth=\"1px\"\n transition=\"all 0.2s\"\n _hover={{ transform: 'translateY(-4px)', boxShadow: 'md' }}\n >\n <Box\n aria-hidden\n height={{ base: 140, md: 180 }}\n bgSize=\"cover\"\n bgPos=\"center\"\n style={{ backgroundImage: `url(${it.image_url})` }}\n />\n <Box p={3} borderTopWidth=\"1px\">\n <Text noOfLines={1} fontWeight=\"semibold\" fontSize=\"sm\">{it.title}</Text>\n {it.price && it.price > 0 && (\n <Badge colorScheme=\"blue\" mt={1} fontSize=\"xs\">\n {it.price} {it.currency || 'Kč'}\n </Badge>\n )}\n </Box>\n </Box>\n </a>\n ))}\n </SimpleGrid>\n </Box>\n );\n};\n\nexport default MerchSection;\n","import React from 'react';\nimport { IconButton, useColorMode } from '@chakra-ui/react';\nimport { MoonIcon, SunIcon } from '@chakra-ui/icons';\n\n// Basic Chakra-powered theme toggle button\nexport const ThemeToggle: React.FC = () => {\n const { colorMode, toggleColorMode } = useColorMode();\n\n return (\n <IconButton\n size=\"sm\"\n fontSize=\"lg\"\n aria-label=\"Přepnout barevné téma\"\n variant=\"ghost\"\n color=\"current\"\n onClick={toggleColorMode}\n icon={colorMode === 'light' ? <MoonIcon /> : <SunIcon />}\n />\n );\n};\n\n// Wrapper matching the requested DefaultToggle example\nexport function DefaultToggle() {\n return (\n <div className=\"space-y-2 text-center\">\n <div className=\"flex justify-center\">\n <ThemeToggle />\n </div>\n </div>\n );\n}\n\nexport { DefaultToggle as DefaultThemeToggle };\n","import api from './api';\n\nexport type EngagementProfile = {\n user_id: number;\n points: number;\n level: number;\n xp: number;\n username?: string;\n avatar_url?: string;\n animated_avatar_url?: string;\n avatar_upload_unlocked?: boolean;\n animated_avatar_upload_unlocked?: boolean;\n achievements: number;\n};\n\nexport async function getProfile(): Promise<EngagementProfile> {\n const res = await api.get('/engagement/profile');\n return res.data as EngagementProfile;\n}\n\nexport async function patchProfile(body: { username?: string }): Promise<{ ok: boolean }>{\n const res = await api.patch('/engagement/profile', body);\n return res.data as { ok: boolean };\n}\n\nexport type RewardItem = {\n id: number;\n name: string;\n type: 'avatar_static' | 'avatar_animated' | 'merch_coupon' | 'merch_physical' | 'merch_digital' | 'custom' | string;\n cost_points: number;\n image_url?: string;\n stock?: number;\n active?: boolean;\n metadata?: Record<string, any>;\n};\n\nexport async function getRewards(): Promise<RewardItem[]> {\n const res = await api.get('/engagement/rewards');\n return res.data as RewardItem[];\n}\n\nexport async function patchAvatar(body: { avatar_url?: string; animated_avatar_url?: string }): Promise<{ ok: boolean }>{\n const res = await api.patch('/engagement/avatar', body);\n return res.data as { ok: boolean };\n}\n\nexport async function redeemReward(reward_id: number): Promise<{ ok: boolean; status: string }>{\n const res = await api.post('/engagement/redeem', { reward_id });\n return res.data as { ok: boolean; status: string };\n}\n\nexport type AchievementsResponse = {\n achievements: Array<{\n id: number;\n code: string;\n title: string;\n description: string;\n points: number;\n xp: number;\n icon?: string;\n achieved: boolean;\n achieved_at?: string;\n }>;\n counters: {\n comments: number;\n votes: number;\n newsletter: boolean;\n };\n};\n\nexport async function getAchievements(): Promise<AchievementsResponse> {\n const res = await api.get('/engagement/achievements');\n return res.data as AchievementsResponse;\n}\n\nexport type LeaderboardItem = {\n rank: number;\n user_id: number;\n first_name?: string;\n last_name?: string;\n username?: string;\n role?: string;\n points: number;\n level: number;\n xp: number;\n avatar_url?: string;\n animated_avatar_url?: string;\n};\n\nexport type LeaderboardResponse = { items: LeaderboardItem[] };\n\nexport async function getLeaderboard(metric: 'points'|'level'|'xp' = 'points', limit?: number): Promise<LeaderboardResponse> {\n const res = await api.get('/engagement/leaderboard', { params: { metric, limit } });\n return res.data as LeaderboardResponse;\n}\n\nexport type PointsTx = {\n id: number;\n user_id: number;\n delta: number;\n xp_delta?: number;\n reason: string;\n meta?: Record<string, any>;\n created_at: string;\n};\n\nexport async function getMyTransactions(params?: { limit?: number; reason?: string }): Promise<PointsTx[]> {\n const res = await api.get('/engagement/transactions', { params });\n return (res.data?.items || []) as PointsTx[];\n}\n\nexport type CheckinResponse = { ok: boolean; awarded: boolean; points?: number; level?: number; xp?: number };\n\nexport async function checkin(): Promise<CheckinResponse> {\n const res = await api.post('/engagement/checkin');\n return res.data as CheckinResponse;\n}\n\nexport type ArticleReadResponse = { ok: boolean; awarded: boolean; points?: number; level?: number; xp?: number };\n\nexport async function articleRead(article_id: number): Promise<ArticleReadResponse> {\n const res = await api.post('/engagement/article-read', { article_id });\n return res.data as ArticleReadResponse;\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport { Box, Heading, Button, SimpleGrid, FormControl, FormLabel, Input, HStack, VStack, Text, IconButton, useToast, Divider, Alert, AlertIcon, Badge, Checkbox, Image, Spinner, Link, Switch, useDisclosure, Modal, ModalOverlay, ModalContent, ModalHeader, ModalCloseButton, ModalBody, ModalFooter, Tabs, TabList, TabPanels, Tab, TabPanel } from '@chakra-ui/react';\nimport { getAdminSettings, updateAdminSettings, AdminSettings } from '../../services/settings';\nimport { FiPlus, FiTrash2, FiSave } from 'react-icons/fi';\nimport { triggerPrefetch } from '../../services/admin/prefetch';\nimport { getCachedYouTube, YouTubeVideo } from '../../services/youtube';\n\nexport type AdminVideoItem = {\n url: string;\n title?: string;\n length?: string;\n uploaded_at?: string;\n thumbnail_url?: string;\n};\n\n//\n\nconst AdminVideosPage: React.FC = () => {\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [items, setItems] = useState<AdminVideoItem[]>([]);\n const videosSource: 'auto' = 'auto';\n const [videosEnabled, setVideosEnabled] = useState<boolean>(true);\n const toast = useToast();\n const { isOpen: isAddOpen, onOpen: onOpenAdd, onClose: onCloseAdd } = useDisclosure();\n\n // YouTube Scraper API integration state\n const [channelInput, setChannelInput] = useState<string>('');\n const [ytLoading, setYtLoading] = useState<boolean>(false);\n const [ytError, setYtError] = useState<string>('');\n const [ytVideos, setYtVideos] = useState<Array<{\n video_id: string;\n title: string;\n length?: string;\n thumbnail_url?: string;\n views?: number;\n views_text?: string;\n published_text?: string;\n published_date?: string;\n }>>([]);\n const [selectedIds, setSelectedIds] = useState<Record<string, boolean>>({});\n\n // Auto source preview state (cached YouTube)\n const [autoVideos, setAutoVideos] = useState<YouTubeVideo[]>([]);\n const [autoLoading, setAutoLoading] = useState<boolean>(false);\n const [autoError, setAutoError] = useState<string>('');\n const [filter, setFilter] = useState<string>('');\n // Title overrides for auto mode (video_id -> title)\n const [titleOverrides, setTitleOverrides] = useState<Record<string, string>>({});\n const [directUrl, setDirectUrl] = useState<string>('');\n const [didBackfill, setDidBackfill] = useState<boolean>(false);\n\n // Derived flags\n const hasChannel = useMemo(() => (channelInput || '').trim().length > 0, [channelInput]);\n\n useEffect(() => {\n let mounted = true;\n (async () => {\n try {\n const s: AdminSettings = await getAdminSettings();\n if (!mounted) return;\n const vids = Array.isArray((s as any).videos_items) ? (s as any).videos_items as AdminVideoItem[] : [];\n const legacy = Array.isArray((s as any).videos) ? ((s as any).videos as string[]).map((url) => ({ url })) : [];\n setItems(vids.length ? vids : legacy);\n // Force automatic source; manual editing is removed in favor of inline add/import\n // Default enable if not explicitly set and there are any videos configured\n const explicit = (s as any).videos_module_enabled;\n const hasAny = (vids.length + legacy.length) > 0;\n setVideosEnabled(typeof explicit === 'boolean' ? Boolean(explicit) : hasAny);\n // Prefill channel handle from settings if available (social/youtube_url)\n const ytUrl = (s as any).youtube_url || (s as any).social_youtube || '';\n if (ytUrl) setChannelInput(ytUrl);\n // Load existing overrides\n setTitleOverrides(((s as any).videos_title_overrides as any) || {});\n } catch (e) {\n // ignore\n } finally {\n if (mounted) setLoading(false);\n }\n })();\n return () => { mounted = false; };\n }, []);\n\n const getTitleFromUrl = async (url: string): Promise<string | undefined> => {\n try {\n const u = `https://noembed.com/embed?url=${encodeURIComponent(url)}`;\n const res = await fetch(u, { method: 'GET' });\n if (!res.ok) return undefined;\n const data = await res.json();\n const t = (data?.title || '').toString().trim();\n return t || undefined;\n } catch {\n return undefined;\n }\n };\n\n // Load cached YouTube videos for preview\n useEffect(() => {\n let mounted = true;\n const run = async () => {\n if (loading) return;\n setAutoError('');\n setAutoLoading(true);\n try {\n const payload = await getCachedYouTube();\n if (!mounted) return;\n setAutoVideos(payload?.videos || []);\n } catch (err) {\n if (!mounted) return;\n setAutoError('Nepodařilo se načíst cache videí. Zkuste Aktualizovat.');\n } finally {\n if (mounted) setAutoLoading(false);\n }\n };\n run();\n return () => { mounted = false; };\n }, [loading]);\n\n useEffect(() => {\n if (loading || didBackfill) return;\n const missing = (items || []).filter(it => (it.url || '').trim().length > 0 && !(it.title || '').trim()).slice(0, 5);\n if (missing.length === 0) return;\n let canceled = false;\n const run = async () => {\n const next = [...items];\n let changed = false;\n for (const m of missing) {\n if (canceled) break;\n const t = await getTitleFromUrl(m.url);\n if (t) {\n const idx = next.findIndex(p => p.url === m.url);\n if (idx >= 0) { next[idx] = { ...next[idx], title: t }; changed = true; }\n }\n }\n if (!canceled && changed) {\n setItems(next);\n try { await updateAdminSettings({ videos_items: next, videos_module_enabled: videosEnabled }); } catch {}\n }\n if (!canceled) setDidBackfill(true);\n };\n run();\n return () => { canceled = true; };\n }, [loading, items, videosEnabled, didBackfill]);\n\n type PreviewItem = {\n key: string;\n title: string;\n thumbnail_url?: string;\n published_date?: string;\n video_id?: string;\n source: 'manual'|'auto';\n url?: string;\n };\n\n // Combined preview for AUTO mode: manual + auto (dedup), filtered by title, ordered by date desc\n const combinedAutoPreview = useMemo(() => {\n const manual: PreviewItem[] = (items || []).filter(it => (it.url || '').trim().length > 0).map((it, idx) => {\n let id: string | undefined;\n try {\n const u = (it.url || '').trim();\n if (u.includes('youtu.be/')) {\n id = u.split('youtu.be/')[1]?.split(/[?&#]/)[0];\n } else if (u.includes('youtube.com')) {\n const url = new URL(u);\n id = url.searchParams.get('v') || undefined;\n }\n } catch {}\n return {\n key: `m-${idx}-${it.url}`,\n title: it.title || `Video ${idx + 1}`,\n thumbnail_url: it.thumbnail_url,\n published_date: it.uploaded_at,\n video_id: id,\n source: 'manual',\n url: it.url,\n } as PreviewItem;\n });\n const auto: PreviewItem[] = (autoVideos || []).map((v) => ({\n key: `a-${v.video_id}`,\n title: v.title,\n thumbnail_url: v.thumbnail_url,\n published_date: v.published_date,\n video_id: v.video_id,\n source: 'auto',\n }));\n const out: PreviewItem[] = [];\n const seen = new Set<string>();\n const pushUnique = (it: PreviewItem) => {\n const k = it.video_id || it.url || it.key;\n if (!k) return;\n if (seen.has(k)) return;\n seen.add(k);\n out.push(it);\n };\n manual.forEach(pushUnique);\n auto.forEach(pushUnique);\n const filtered = out\n .filter((it) => (it.title || '').toLowerCase().includes(filter.toLowerCase()))\n .slice()\n .sort((a, b) => {\n const ta = Date.parse(a.published_date || '') || 0;\n const tb = Date.parse(b.published_date || '') || 0;\n return tb - ta;\n });\n return { list: filtered, count: filtered.length };\n }, [items, autoVideos, filter]);\n\n // Auto-disable videos module if there is neither channel nor manual items configured\n useEffect(() => {\n if (loading) return;\n if (!hasChannel && items.length === 0 && videosEnabled) {\n setVideosEnabled(false);\n }\n }, [loading, hasChannel, items.length, videosEnabled]);\n\n // Auto-trigger backend prefetch of YouTube cache at most once per ~24h\n useEffect(() => {\n if (loading) return;\n const channel = (channelInput || '').trim();\n if (!channel) return;\n const KEY = 'youtube_autoload_last';\n let last = 0;\n try { last = Number(localStorage.getItem(KEY) || '0'); } catch {}\n const DAY_MS = 24 * 60 * 60 * 1000;\n const due = !last || (Date.now() - last) > (23 * 60 * 60 * 1000); // ~23h to allow slight drift\n if (!due) return;\n (async () => {\n try {\n // Ask backend to refresh cached files; it will update youtube_channel.json opportunistically\n await triggerPrefetch();\n try { localStorage.setItem(KEY, String(Date.now())); } catch {}\n toast({ status: 'info', title: 'Aktualizace videí', description: 'Na pozadí se aktualizuje cache videí z YouTube.', duration: 3000 });\n } catch {\n // silent\n }\n })();\n }, [loading, videosSource, channelInput, toast]);\n\n const refreshAuto = async () => {\n setAutoError('');\n setAutoLoading(true);\n try {\n await triggerPrefetch();\n const payload = await getCachedYouTube();\n setAutoVideos(payload?.videos || []);\n toast({ status: 'success', title: 'Aktualizováno', description: 'Cache videí byla obnovena.', duration: 3000 });\n } catch (e) {\n setAutoError('Aktualizace cache selhala.');\n } finally {\n setAutoLoading(false);\n }\n };\n\n const saveOverrides = async () => {\n try {\n await updateAdminSettings({ videos_title_overrides: titleOverrides } as any);\n toast({ status: 'success', title: 'Přepisy uloženy', description: 'Názvy videí byly aktualizovány.', duration: 2500 });\n } catch (e) {\n toast({ status: 'error', title: 'Chyba', description: 'Nepodařilo se uložit přepisy názvů.', duration: 3000 });\n }\n };\n\n const saveAll = async () => {\n setSaving(true);\n try {\n await updateAdminSettings({\n videos_items: items,\n videos_module_enabled: videosEnabled,\n videos_title_overrides: titleOverrides,\n } as any);\n toast({ status: 'success', title: 'Uloženo', description: 'Nastavení videí bylo uloženo.', duration: 2500 });\n } catch (e) {\n toast({ status: 'error', title: 'Chyba', description: 'Nepodařilo se uložit nastavení videí.', duration: 3000 });\n } finally {\n setSaving(false);\n }\n };\n\n const fetchChannelVideos = async () => {\n const channel = channelInput?.trim();\n if (!channel) {\n toast({ status: 'warning', title: 'Zadejte kanál', description: 'Zadejte YouTube handle nebo URL kanálu.' });\n return;\n }\n setYtError('');\n setYtLoading(true);\n setYtVideos([]);\n setSelectedIds({});\n try {\n const url = `https://youtube.tdvorak.dev/channel_videos?channel=${encodeURIComponent(channel)}`;\n const res = await fetch(url, { method: 'GET' });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const data = await res.json();\n const vids = Array.isArray(data?.videos) ? data.videos : [];\n setYtVideos(vids);\n if (vids.length === 0) {\n setYtError('Na kanálu nebyla nalezena žádná videa.');\n }\n } catch (err: any) {\n console.error(err);\n setYtError('Nepodařilo se načíst videa z API. Zkontrolujte dostupnost služby na https://youtube.tdvorak.dev/ a CORS.');\n } finally {\n setYtLoading(false);\n }\n };\n\n const toggleSelect = (id: string) => {\n setSelectedIds((prev) => ({ ...prev, [id]: !prev[id] }));\n };\n\n const importSelected = async () => {\n const selected = ytVideos.filter((v) => selectedIds[v.video_id]);\n if (selected.length === 0) {\n toast({ status: 'info', title: 'Nic k importu', description: 'Vyberte alespoň jedno video.' });\n return;\n }\n const newItems: AdminVideoItem[] = selected.map((v) => ({\n url: `https://www.youtube.com/watch?v=${v.video_id}`,\n title: v.title,\n length: v.length,\n uploaded_at: (v.published_date || '').slice(0,10),\n thumbnail_url: v.thumbnail_url,\n }));\n // Avoid duplicates by URL\n const merged = (() => {\n const urls = new Set(items.map((p) => p.url));\n const out = [...items];\n for (const it of newItems) {\n if (!urls.has(it.url)) {\n out.push(it);\n urls.add(it.url);\n }\n }\n return out;\n })();\n try {\n await updateAdminSettings({ videos_items: merged, videos_module_enabled: videosEnabled });\n setItems(merged);\n toast({ status: 'success', title: 'Videa přidána', description: `${selected.length} videí bylo přidáno do seznamu.` });\n } catch (e) {\n toast({ status: 'error', title: 'Chyba', description: 'Nepodařilo se uložit přidaná videa.' });\n }\n };\n\n const addDirectLink = async () => {\n const url = (directUrl || '').trim();\n if (!url) {\n toast({ status: 'warning', title: 'Zadejte odkaz', description: 'Vložte URL videa.' });\n return;\n }\n const today = new Date().toISOString().slice(0,10);\n const resolvedTitle = await getTitleFromUrl(url);\n const it: AdminVideoItem = { url, title: resolvedTitle, uploaded_at: today, thumbnail_url: getThumbFromUrl(url) };\n if (items.find((p) => p.url === it.url)) {\n toast({ status: 'info', title: 'Video už existuje', description: 'Tento odkaz je již v seznamu.' });\n return;\n }\n const merged = [...items, it];\n try {\n await updateAdminSettings({ videos_items: merged, videos_module_enabled: videosEnabled });\n setItems(merged);\n setDirectUrl('');\n toast({ status: 'success', title: 'Video přidáno', description: 'Video bylo přidáno k automatickým videím.' });\n } catch {\n toast({ status: 'error', title: 'Chyba', description: 'Nepodařilo se uložit video.' });\n }\n };\n\n //\n\n // Helper: derive YouTube thumbnail safely from a URL (supports youtube.com and youtu.be)\n const getThumbFromUrl = (raw: string): string | undefined => {\n try {\n const u = raw.trim();\n if (!u) return undefined;\n if (u.includes('youtu.be/')) {\n const id = u.split('youtu.be/')[1]?.split(/[?&#]/)[0];\n return id ? `https://i.ytimg.com/vi/${id}/hqdefault.jpg` : undefined;\n }\n if (u.includes('youtube.com')) {\n // Try URL API first\n try {\n const url = new URL(u);\n const id = url.searchParams.get('v') || '';\n if (id) return `https://i.ytimg.com/vi/${id}/hqdefault.jpg`;\n } catch {}\n // Fallback regex\n const m = u.match(/[?&]v=([^&#]+)/);\n const id = m?.[1];\n return id ? `https://i.ytimg.com/vi/${id}/hqdefault.jpg` : undefined;\n }\n } catch {}\n return undefined;\n };\n\n return (\n <AdminLayout requireAdmin={false}>\n <Box>\n <Heading size=\"md\" mb={2}>Videa (pro titulní stránku)</Heading>\n <Text fontSize=\"sm\" color=\"gray.600\" mb={2}>Přidejte až 5 videí (doporučeno). První se zobrazí jako hlavní, další 4 v mřížce. Podporováno YouTube/Vimeo URL.</Text>\n\n {/* Source toggle */}\n <HStack justify=\"space-between\" mb={3} flexWrap=\"wrap\">\n <HStack spacing={2}>\n <Button leftIcon={<FiPlus />} colorScheme=\"green\" size=\"sm\" onClick={onOpenAdd}>Přidat video</Button>\n </HStack>\n <FormControl display=\"flex\" alignItems=\"center\" w=\"auto\">\n <FormLabel mb={0}>Zobrazit sekci Videa na titulní stránce</FormLabel>\n <Switch\n isChecked={videosEnabled}\n isDisabled={loading || saving}\n onChange={async (e) => {\n const next = e.target.checked;\n // Require either channel or at least one manual video to enable\n if (next && !hasChannel && items.length === 0) {\n setVideosEnabled(false);\n toast({ status: 'warning', title: 'Doplňte kanál nebo videa', description: 'Pro zobrazení sekce vyplňte YouTube kanál nebo přidejte alespoň jedno video.', duration: 4000 });\n // Try to focus channel input\n setTimeout(() => {\n const el = document.getElementById('admin-videos-channel-input') as HTMLInputElement | null;\n if (el) el.focus();\n }, 0);\n return;\n }\n setVideosEnabled(next);\n try {\n await updateAdminSettings({ videos_module_enabled: next });\n } catch {\n toast({ status: 'error', title: 'Uložení selhalo', description: 'Nepodařilo se uložit změnu zobrazení sekce.', duration: 3000 });\n }\n }}\n />\n </FormControl>\n </HStack>\n {!hasChannel && items.length === 0 && (\n <Text fontSize=\"sm\" color=\"orange.600\" mb={2}>Pro aktivaci sekce vyplňte YouTube kanál nebo přidejte video.</Text>\n )}\n {videosSource === 'auto' && (\n <Alert status=\"info\" mb={3} borderRadius=\"md\">\n <AlertIcon />\n Automatický režim je zapnutý. Videa se načítají z YouTube kanálu z Nastavení → Sociální sítě (YouTube URL). Ručně přidaná videa se zobrazí před automatickými.\n </Alert>\n )}\n\n \n\n {/* Always-visible preview of effective videos */}\n <Box borderWidth=\"1px\" borderRadius=\"md\" p={3} mb={4}>\n <HStack justify=\"space-between\" align=\"center\" mb={2} flexWrap=\"wrap\">\n <Heading size=\"sm\">Náhled: všechna videa (aktivní zdroj)</Heading>\n {videosSource === 'auto' && (\n <HStack spacing={2} flexWrap=\"wrap\">\n <Input size=\"sm\" placeholder=\"Filtrovat podle názvu\" value={filter} onChange={(e) => setFilter(e.target.value)} width={{ base: '100%', md: '260px' }} />\n <Button size=\"sm\" onClick={refreshAuto} isLoading={autoLoading} variant=\"outline\" flexShrink={0} minW=\"max-content\">Aktualizovat cache</Button>\n <Button size=\"sm\" colorScheme=\"blue\" variant=\"solid\" onClick={saveOverrides} flexShrink={0} minW=\"max-content\">Uložit přepisy názvů</Button>\n </HStack>\n )}\n </HStack>\n {videosSource === 'auto' ? (\n <>\n {autoError && (\n <Alert status=\"error\" mb={2} borderRadius=\"md\"><AlertIcon />{autoError}</Alert>\n )}\n {autoLoading ? (\n <HStack color=\"gray.600\"><Spinner size=\"sm\" /><Text>Načítám videa…</Text></HStack>\n ) : (\n <>\n <Text fontSize=\"sm\" color=\"gray.600\" mb={2}>Počet videí: {combinedAutoPreview.count}</Text>\n <SimpleGrid columns={{ base: 1, sm: 2, md: 3, lg: 4 }} spacing={3}>\n {combinedAutoPreview.list.map((it) => (\n <Box key={it.key} borderWidth=\"1px\" borderRadius=\"md\" p={2}>\n <VStack align=\"stretch\" spacing={2}>\n <Image\n src={it.thumbnail_url || (it.source === 'manual' ? getThumbFromUrl(it.url || '') : undefined)}\n alt={it.title}\n borderRadius=\"md\"\n data-fallback-idx={0 as any}\n onError={(e) => {\n const el = e.currentTarget as HTMLImageElement & { dataset: { fallbackIdx?: string } };\n const idx = Number(el.dataset.fallbackIdx || '0');\n const id = it.video_id || '';\n const chain = id ? [\n `https://i.ytimg.com/vi/${id}/mqdefault.jpg`,\n `https://i.ytimg.com/vi/${id}/sddefault.jpg`,\n `https://i.ytimg.com/vi/${id}/hqdefault.jpg`,\n '/images/sponsors/placeholder.png',\n ] : ['/images/sponsors/placeholder.png'];\n if (idx < chain.length) {\n el.src = chain[idx];\n el.dataset.fallbackIdx = String(idx + 1);\n }\n }}\n />\n <Box>\n <HStack justify=\"space-between\" align=\"start\">\n <Box flex=\"1\">\n <Text fontWeight=\"semibold\" noOfLines={2}>{(it.source === 'auto' && it.video_id && (titleOverrides[it.video_id]?.trim()?.length ? titleOverrides[it.video_id] : it.title)) || it.title}</Text>\n <HStack spacing={2} color=\"gray.600\" fontSize=\"sm\">\n {it.published_date && <Badge>{new Date(it.published_date).toLocaleDateString('cs-CZ')}</Badge>}\n {it.source === 'manual' && <Badge colorScheme=\"purple\">Ručně</Badge>}\n </HStack>\n </Box>\n {it.source === 'manual' && (\n <IconButton\n aria-label=\"Smazat\"\n icon={<FiTrash2 />}\n size=\"sm\"\n variant=\"ghost\"\n colorScheme=\"red\"\n onClick={async () => {\n const next = items.filter((m) => m.url !== it.url);\n try {\n await updateAdminSettings({ videos_items: next, videos_module_enabled: videosEnabled });\n setItems(next);\n toast({ status: 'success', title: 'Smazáno', description: 'Video bylo odstraněno.' });\n } catch {\n toast({ status: 'error', title: 'Chyba', description: 'Odstranění se nepodařilo.' });\n }\n }}\n />\n )}\n </HStack>\n {it.source === 'auto' && it.video_id && (\n <FormControl mt={2}>\n <FormLabel fontSize=\"xs\" mb={1}>Přepis názvu (volitelné)</FormLabel>\n <Input\n size=\"sm\"\n placeholder=\"Např. Zápas Atýmu vs. Btým\"\n value={titleOverrides[it.video_id] ?? ''}\n onChange={(e) => {\n const val = e.target.value;\n setTitleOverrides(prev => ({ ...prev, [it.video_id!]: val }));\n }}\n />\n </FormControl>\n )}\n {it.source === 'manual' && it.url && (\n <FormControl mt={2}>\n <FormLabel fontSize=\"xs\" mb={1}>Název videa</FormLabel>\n <Input\n size=\"sm\"\n placeholder=\"Zadejte vlastní název\"\n value={(items.find(p => p.url === it.url)?.title) ?? ''}\n onChange={(e) => {\n const val = e.target.value;\n setItems(prev => prev.map(p => p.url === it.url ? { ...p, title: val } : p));\n }}\n onBlur={async (e) => {\n const val = e.target.value;\n const next = items.map(p => p.url === it.url ? { ...p, title: val } : p);\n try {\n await updateAdminSettings({ videos_items: next, videos_module_enabled: videosEnabled });\n setItems(next);\n } catch {}\n }}\n />\n </FormControl>\n )}\n </Box>\n </VStack>\n </Box>\n ))}\n </SimpleGrid>\n {combinedAutoPreview.count === 0 && (\n <Text color=\"gray.600\">Zatím žádná videa.</Text>\n )}\n </>\n )}\n </>\n ) : null}\n </Box>\n\n <HStack justify=\"flex-end\" mb={3}>\n <Button colorScheme=\"blue\" leftIcon={<FiSave />} onClick={saveAll} isLoading={saving}>\n Uložit vše\n </Button>\n </HStack>\n\n <Modal isOpen={isAddOpen} onClose={onCloseAdd} size=\"4xl\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Přidat video</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <Tabs variant=\"enclosed\">\n <TabList>\n <Tab>Odkaz na video</Tab>\n <Tab>Načíst z YouTube kanálu</Tab>\n </TabList>\n <TabPanels>\n <TabPanel>\n <VStack align=\"stretch\" spacing={3}>\n <FormControl>\n <FormLabel>URL videa</FormLabel>\n <Input placeholder=\"https://www.youtube.com/watch?v=...\" value={directUrl} onChange={(e) => setDirectUrl(e.target.value)} />\n </FormControl>\n <HStack>\n <Button colorScheme=\"green\" onClick={async () => { await addDirectLink(); onCloseAdd(); }}>Přidat</Button>\n </HStack>\n </VStack>\n </TabPanel>\n <TabPanel>\n <VStack align=\"stretch\" spacing={3}>\n <Text fontSize=\"sm\" color=\"gray.600\">\n Použijte Scraper API. Zadejte handle (např. <code>@FotbalKunovice</code>) nebo URL kanálu a načtěte videa z karty „Videa“. Služba: <Link href=\"https://youtube.tdvorak.dev/\" isExternal color=\"blue.500\">youtube.tdvorak.dev</Link>\n </Text>\n <HStack align=\"start\" spacing={3} flexWrap=\"wrap\">\n <FormControl maxW={{ base: '100%', md: '400px' }}>\n <FormLabel>Kanál (handle nebo URL)</FormLabel>\n <Input id=\"admin-videos-channel-input\" placeholder=\"@FCBizoniUH nebo https://www.youtube.com/@FCBizoniUH/videos\" value={channelInput} onChange={(e) => setChannelInput(e.target.value)} />\n </FormControl>\n <Button onClick={fetchChannelVideos} isLoading={ytLoading} variant=\"outline\" flexShrink={0} minW=\"max-content\">Načíst videa</Button>\n <Button colorScheme=\"green\" onClick={async () => { await importSelected(); onCloseAdd(); }} isDisabled={ytVideos.length === 0} flexShrink={0} minW=\"max-content\">Přidat vybraná</Button>\n </HStack>\n {ytError && (\n <Alert status=\"error\" borderRadius=\"md\">\n <AlertIcon />\n {ytError}\n </Alert>\n )}\n {ytLoading && (\n <HStack color=\"gray.600\"><Spinner size=\"sm\" /><Text>Načítám videa…</Text></HStack>\n )}\n {!ytLoading && ytVideos.length > 0 && (\n <SimpleGrid columns={{ base: 1, sm: 2, md: 3, lg: 4 }} spacing={3}>\n {ytVideos.map((v) => (\n <Box key={v.video_id} borderWidth=\"1px\" borderRadius=\"md\" p={2}>\n <VStack align=\"stretch\" spacing={2}>\n <Image src={v.thumbnail_url} alt={v.title} borderRadius=\"md\" />\n <Checkbox isChecked={!!selectedIds[v.video_id]} onChange={() => toggleSelect(v.video_id)}>\n Vybrat\n </Checkbox>\n <Box>\n <Text fontWeight=\"semibold\" noOfLines={2}>{v.title}</Text>\n <HStack spacing={2} color=\"gray.600\" fontSize=\"sm\">\n {v.length && <Badge>{v.length}</Badge>}\n {v.published_text && <Text>{v.published_text}</Text>}\n </HStack>\n </Box>\n </VStack>\n </Box>\n ))}\n </SimpleGrid>\n )}\n </VStack>\n </TabPanel>\n </TabPanels>\n </Tabs>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" onClick={onCloseAdd}>Zavřít</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </Box>\n </AdminLayout>\n );\n};\n\nexport default AdminVideosPage;\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n Box,\n VStack,\n HStack,\n Text,\n Icon,\n Button,\n Input,\n InputGroup,\n InputLeftElement,\n Progress,\n IconButton,\n useColorModeValue,\n useToast,\n Flex,\n Stack,\n Collapse,\n} from '@chakra-ui/react';\nimport {\n FiUploadCloud,\n FiFile,\n FiImage,\n FiFileText,\n FiX,\n FiLink2,\n FiCheckCircle,\n FiAlertCircle,\n} from 'react-icons/fi';\nimport { uploadFile as defaultUploadFile } from '../../services/articles';\n\nexport type UploadPanelFile = {\n url: string;\n name: string;\n type: string;\n size: number;\n};\n\nexport interface UploadPanelProps {\n label?: string;\n description?: string;\n value?: UploadPanelFile[];\n onChange?: (files: UploadPanelFile[]) => void;\n accept?: string;\n maxFiles?: number;\n maxFileSizeMB?: number;\n multiple?: boolean;\n uploadFn?: (file: File) => Promise<UploadPanelFile>;\n allowUrlImport?: boolean;\n onUrlImport?: (url: string) => void | Promise<void>;\n urlPlaceholder?: string;\n onUploadFinished?: (uploadedFiles: UploadPanelFile[], allFiles: UploadPanelFile[]) => void;\n}\n\nconst DEFAULT_MAX_MB = 10;\n\nconst UploadPanel: React.FC<UploadPanelProps> = ({\n label = 'Nahrát soubory',\n description = 'Vyberte soubory k nahrání nebo je přetáhněte do oblasti níže.',\n value,\n onChange,\n accept = 'image/*,application/pdf',\n maxFiles = 10,\n maxFileSizeMB = DEFAULT_MAX_MB,\n multiple = true,\n uploadFn,\n allowUrlImport = true,\n onUrlImport,\n urlPlaceholder = 'Vložit URL souboru',\n onUploadFinished,\n}) => {\n const [files, setFiles] = useState<UploadPanelFile[]>(() => value || []);\n const [uploading, setUploading] = useState(false);\n const [progress, setProgress] = useState(0);\n const [isDragging, setIsDragging] = useState(false);\n const [urlInput, setUrlInput] = useState('');\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n const toast = useToast();\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const bg = useColorModeValue('white', 'gray.800');\n const dropBg = useColorModeValue('gray.50', 'gray.900');\n const listHoverBg = useColorModeValue('gray.50', 'gray.900');\n\n useEffect(() => {\n if (value) {\n setFiles(value);\n }\n }, [value]);\n\n const getFileIcon = (type: string) => {\n if (type.startsWith('image/')) return FiImage;\n if (type.includes('pdf')) return FiFileText;\n return FiFile;\n };\n\n const formatSize = (bytes: number) => {\n if (!bytes) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${Math.round((bytes / Math.pow(k, i)) * 100) / 100} ${sizes[i]}`;\n };\n\n const emitChange = useCallback(\n (next: UploadPanelFile[]) => {\n setFiles(next);\n if (onChange) onChange(next);\n },\n [onChange]\n );\n\n const doUpload = useCallback(\n async (file: File): Promise<UploadPanelFile> => {\n if (uploadFn) {\n return uploadFn(file);\n }\n const res = await defaultUploadFile(file as any);\n return {\n url: res.url,\n name: file.name,\n type: file.type || res.type || 'application/octet-stream',\n size: file.size || res.size || 0,\n };\n },\n [uploadFn]\n );\n\n const handleFiles = useCallback(\n async (selected: FileList | File[]) => {\n const list = Array.from(selected || []);\n if (!list.length) return;\n\n if (files.length + list.length > maxFiles) {\n toast({\n title: 'Příliš mnoho souborů',\n description: `Můžete nahrát maximálně ${maxFiles} souborů`,\n status: 'warning',\n });\n return;\n }\n\n const maxBytes = maxFileSizeMB * 1024 * 1024;\n const validFiles = list.filter((f) => {\n if (f.size > maxBytes) {\n toast({\n title: 'Soubor je příliš velký',\n description: `${f.name} překračuje limit ${maxFileSizeMB} MB`,\n status: 'error',\n });\n return false;\n }\n return true;\n });\n if (!validFiles.length) return;\n\n setUploading(true);\n setProgress(0);\n\n const newlyUploaded: UploadPanelFile[] = [];\n const total = validFiles.length;\n\n try {\n for (let i = 0; i < validFiles.length; i += 1) {\n const f = validFiles[i];\n try {\n const uf = await doUpload(f);\n newlyUploaded.push(uf);\n } catch (err: any) {\n toast({\n title: 'Chyba při nahrávání',\n description: err?.message || f.name,\n status: 'error',\n });\n }\n setProgress(((i + 1) / total) * 100);\n }\n if (newlyUploaded.length) {\n const next = [...files, ...newlyUploaded];\n emitChange(next);\n if (onUploadFinished) {\n onUploadFinished(newlyUploaded, next);\n }\n toast({\n title: 'Nahrávání dokončeno',\n description: `${newlyUploaded.length} souborů bylo nahráno`,\n status: 'success',\n });\n }\n } finally {\n setUploading(false);\n setProgress(0);\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n }\n },\n [doUpload, emitChange, files, maxFileSizeMB, maxFiles, onUploadFinished, toast]\n );\n\n const onDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n if (e.dataTransfer?.files?.length) {\n handleFiles(e.dataTransfer.files);\n }\n };\n\n const onDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n if (!isDragging) setIsDragging(true);\n };\n\n const onDragLeave = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n };\n\n const removeFile = (idx: number) => {\n const next = files.filter((_, i) => i !== idx);\n emitChange(next);\n };\n\n const handleUrlSubmit = async () => {\n const url = urlInput.trim();\n if (!url) return;\n try {\n if (onUrlImport) {\n await onUrlImport(url);\n }\n const next: UploadPanelFile[] = [\n ...files,\n {\n url,\n name: url,\n type: 'text/url',\n size: 0,\n },\n ];\n emitChange(next);\n setUrlInput('');\n toast({ title: 'URL přidána', status: 'success', duration: 2000 });\n } catch (err: any) {\n toast({\n title: 'Nelze přidat URL',\n description: err?.message || 'Zkontrolujte odkaz a zkuste to znovu.',\n status: 'error',\n });\n }\n };\n\n return (\n <Box\n borderWidth=\"1px\"\n borderRadius=\"xl\"\n borderColor={borderColor}\n bg={bg}\n p={4}\n >\n <VStack align=\"stretch\" spacing={4}>\n <HStack justify=\"space-between\" align=\"flex-start\">\n <Box>\n <HStack spacing={2} mb={1}>\n <Icon as={FiUploadCloud} color=\"blue.500\" />\n <Text fontWeight=\"semibold\">{label}</Text>\n </HStack>\n <Text fontSize=\"sm\" color=\"gray.500\">\n {description}\n </Text>\n </Box>\n {files.length > 0 && (\n <HStack spacing={1} align=\"center\" color=\"gray.500\" fontSize=\"xs\">\n <Icon as={FiCheckCircle} color=\"green.400\" />\n <Text>{files.length} souborů</Text>\n </HStack>\n )}\n </HStack>\n\n <Box\n borderWidth=\"1px\"\n borderRadius=\"lg\"\n borderStyle={isDragging ? 'solid' : 'dashed'}\n borderColor={isDragging ? 'blue.400' : borderColor}\n bg={isDragging ? dropBg : 'transparent'}\n p={6}\n textAlign=\"center\"\n cursor=\"pointer\"\n transition=\"all 0.15s ease-out\"\n onClick={() => fileInputRef.current?.click()}\n onDrop={onDrop}\n onDragOver={onDragOver}\n onDragLeave={onDragLeave}\n >\n <VStack spacing={2}>\n <Icon as={FiUploadCloud} boxSize={7} color=\"blue.400\" />\n <Text fontWeight=\"medium\">Zvolte soubor nebo jej přetáhněte sem</Text>\n <Text fontSize=\"xs\" color=\"gray.500\">\n Podporované formáty: {accept || 'soubor'} • Limit {maxFileSizeMB} MB / soubor\n </Text>\n <Button size=\"sm\" variant=\"outline\" leftIcon={<FiUploadCloud />}>\n Vybrat soubor\n </Button>\n </VStack>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n style={{ display: 'none' }}\n onChange={(e) => {\n if (e.target.files) handleFiles(e.target.files);\n }}\n />\n </Box>\n\n <Collapse in={uploading || progress > 0} animateOpacity>\n {uploading && (\n <HStack spacing={2} align=\"center\">\n <Icon as={FiAlertCircle} color=\"blue.400\" />\n <Text fontSize=\"sm\">Nahrávám soubory…</Text>\n </HStack>\n )}\n {progress > 0 && (\n <Progress mt={2} value={progress} size=\"sm\" colorScheme=\"blue\" borderRadius=\"full\" />\n )}\n </Collapse>\n\n {files.length > 0 && (\n <Box borderTopWidth=\"1px\" borderColor={borderColor} pt={3}>\n <Stack spacing={2}>\n {files.map((f, idx) => {\n const IconComp = getFileIcon(f.type || '');\n return (\n <Flex\n key={`${f.url}-${idx}`}\n align=\"center\"\n justify=\"space-between\"\n p={2}\n borderRadius=\"md\"\n _hover={{ bg: listHoverBg }}\n >\n <HStack spacing={3} flex={1} minW={0}>\n <Icon as={IconComp} boxSize={5} color=\"blue.500\" />\n <Box flex={1} minW={0}>\n <Text fontSize=\"sm\" noOfLines={1}>\n {f.name || f.url}\n </Text>\n <HStack spacing={2} fontSize=\"xs\" color=\"gray.500\">\n {f.size ? <Text>{formatSize(f.size)}</Text> : null}\n <Text>{f.type}</Text>\n </HStack>\n </Box>\n </HStack>\n <IconButton\n aria-label=\"Odebrat soubor\"\n icon={<FiX />}\n size=\"xs\"\n variant=\"ghost\"\n onClick={(e) => {\n e.stopPropagation();\n removeFile(idx);\n }}\n />\n </Flex>\n );\n })}\n </Stack>\n </Box>\n )}\n\n {allowUrlImport && (\n <Box pt={2} borderTopWidth={files.length ? '1px' : '0'} borderColor={borderColor}>\n <Text fontSize=\"xs\" color=\"gray.500\" mb={1}>\n nebo importujte z URL odkazu\n </Text>\n <HStack spacing={2}>\n <InputGroup>\n <InputLeftElement pointerEvents=\"none\">\n <Icon as={FiLink2} color=\"gray.400\" />\n </InputLeftElement>\n <Input\n size=\"sm\"\n placeholder={urlPlaceholder}\n value={urlInput}\n onChange={(e) => setUrlInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleUrlSubmit();\n }\n }}\n />\n </InputGroup>\n <Button size=\"sm\" onClick={handleUrlSubmit} isDisabled={!urlInput.trim()}>\n Přidat\n </Button>\n </HStack>\n </Box>\n )}\n </VStack>\n </Box>\n );\n};\n\nexport default UploadPanel;\n","import React from 'react';\nimport { usePublicSettings } from '../../hooks/usePublicSettings';\nimport { useClubTheme } from '../../contexts/ClubThemeContext';\nimport { assetUrl } from '../../utils/url';\nimport { useTranslation } from 'react-i18next';\n\nexport type ClubHeroTopbarVariant = 'brand' | 'minimal' | 'badge';\n\nconst cls = (...parts: Array<string | false | null | undefined>) => parts.filter(Boolean).join(' ');\n\nconst ClubHeroTopbar: React.FC<{ variant?: ClubHeroTopbarVariant; fullBleed?: boolean }>= ({ variant = 'minimal', fullBleed = false }) => {\n const { t } = useTranslation();\n const { data: settings } = usePublicSettings();\n const theme = useClubTheme();\n const title = settings?.club_name || theme.name || 'Fotbalový klub';\n const tagline = t('homepage.official_website');\n const logo = assetUrl(settings?.club_logo_url || theme.logoUrl) || settings?.club_logo_url || theme.logoUrl || '/dist/img/logo-club-empty.svg';\n const shopUrl = settings?.shop_url || undefined;\n const calendarUrl = '/kalendar';\n\n return (\n <div className={cls('club-hero-topbar', fullBleed && 'full-bleed',\n variant === 'brand' && 'club-hero-topbar--brand',\n variant === 'minimal' && 'club-hero-topbar--minimal',\n variant === 'badge' && 'club-hero-topbar--badge'\n )}>\n <div className=\"club-hero-topbar__logo\">\n {/* eslint-disable-next-line jsx-a11y/alt-text */}\n <img src={logo} alt={title} style={{ width: 36, height: 36, objectFit: 'contain' }} />\n </div>\n <div style={{ display: 'flex', flexDirection: 'column' }}>\n <div className=\"club-hero-topbar__title\">{title}</div>\n <div className=\"club-hero-topbar__tagline\">{tagline}</div>\n </div>\n <div className=\"club-hero-topbar__spacer\" />\n {variant !== 'minimal' && (\n <div className=\"club-hero-topbar__actions\">\n <a href={calendarUrl} className=\"sparta-button-tertiary\">Kalendář</a>\n {shopUrl && (\n <a href={shopUrl} target=\"_blank\" rel=\"noreferrer\" className=\"sparta-button-primary\">Fanshop</a>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport default ClubHeroTopbar;\n","import React from 'react';\nimport { assetUrl } from '../../utils/url';\n\nexport type ActivityItem = {\n id: number | string;\n title: string;\n image_url?: string | null;\n start_time: string;\n location?: string | null;\n};\n\nconst ActivitiesList: React.FC<{\n items: ActivityItem[];\n}> = ({ items }) => {\n const list = Array.isArray(items) ? items.slice(0, 4) : [];\n return (\n <div className=\"blog-list\">\n {list.map((e) => (\n <a key={e.id} href={`/aktivita/${e.id}`} className=\"card\" style={{ textDecoration: 'none', color: 'inherit' }}>\n <div className=\"thumb\" style={{ backgroundImage: `url(${assetUrl(e.image_url) || '/images/news/placeholder.jpg'})` }} />\n <div>\n <h4>{e.title}</h4>\n <div style={{ color: 'var(--dark-gray)', fontSize: '0.9rem' }}>\n {new Date(e.start_time).toLocaleDateString()} {e.location ? `• ${e.location}` : ''}\n </div>\n </div>\n </a>\n ))}\n </div>\n );\n};\n\nexport default ActivitiesList;\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { useAuth } from '../../contexts/AuthContext';\nimport { getCurrentSweepstake, enterSweepstake, markSweepstakeVisualPlayed, CurrentSweepstakeResponse } from '../../services/sweepstakes';\nimport { useToast } from '@chakra-ui/react';\nimport { getImageUrl } from '../../utils/imageUtils';\nimport { useTranslation } from 'react-i18next';\n\nconst fmtDate = (iso?: string | null) => {\n if (!iso) return '';\n const d = new Date(iso);\n return isNaN(d.getTime()) ? '' : d.toLocaleString('cs-CZ');\n};\n\nconst SweepstakeWidget: React.FC = () => {\n const { t } = useTranslation();\n const { user } = useAuth();\n const [data, setData] = useState<CurrentSweepstakeResponse | null>(null);\n const [loading, setLoading] = useState<boolean>(true);\n const [joining, setJoining] = useState<boolean>(false);\n const [playing, setPlaying] = useState<boolean>(false);\n const playedRef = useRef(false);\n const toast = useToast();\n\n const load = async () => {\n setLoading(true);\n try {\n const res = await getCurrentSweepstake();\n setData(res);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => { load(); }, []);\n\n const s = data?.sweepstake;\n const prizes = data?.prizes || [];\n const winners = data?.winners || [];\n const state = data?.state || 'upcoming';\n const isLogged = !!user;\n const isAdmin = String((user as any)?.role || '').toLowerCase() === 'admin';\n const iWon = useMemo(() => {\n if (!isLogged || !winners?.length) return false;\n const myId = (user as any)?.id;\n return winners.some(w => w.user_id === myId);\n }, [winners, isLogged, user]);\n\n const hasEntered = !!data?.has_entered;\n const canEnter = !!data?.can_enter;\n\n useEffect(() => {\n // Autoplay visualization once for logged users within 3-day window, non-admins\n if (!s || !isLogged || !winners?.length) return;\n if (state !== 'finalized') return;\n if (data?.visual_played_at) return;\n if (playing || playedRef.current) return;\n if (isAdmin) return; // admin can trigger manually from admin page; avoid auto here\n setPlaying(true);\n playedRef.current = true;\n const t = setTimeout(async () => {\n try { await markSweepstakeVisualPlayed(s.id); } catch {}\n setPlaying(false);\n await load();\n }, 3000);\n return () => clearTimeout(t);\n }, [s, isLogged, winners, state, data?.visual_played_at, playing, isAdmin]);\n\n if (loading) return null;\n if (!s) return null;\n // Hide finalized widget for users who are not winners\n if ((data?.state || 'upcoming') === 'finalized' && !iWon) return null;\n\n const onJoin = async () => {\n if (!s) return;\n setJoining(true);\n try {\n await enterSweepstake(s.id);\n toast({ status: 'success', title: 'Úspěšně jste se přihlásili do soutěže' });\n await load();\n } catch (e: any) {\n const msg = e?.response?.data?.error || 'Nelze se přihlásit do soutěže';\n toast({ status: 'error', title: msg });\n } finally {\n setJoining(false);\n }\n };\n\n const doPlay = async () => {\n if (!s) return;\n setPlaying(true);\n const t = setTimeout(async () => {\n try { await markSweepstakeVisualPlayed(s.id); } catch {}\n setPlaying(false);\n await load();\n }, 2500);\n return () => clearTimeout(t);\n };\n\n return (\n <section data-element=\"sweepstakes\" data-variant=\"default\" style={{ marginTop: 16, marginBottom: 8 }}>\n <div className=\"card\" style={{ maxWidth: 1200, margin: '0 auto', padding: 16 }}>\n {state === 'upcoming' && (\n <div>\n <div className=\"section-head\" style={{ marginTop: 0 }}>\n <h3>Soutěž</h3>\n {s.rules_url && (<a href={getImageUrl(s.rules_url) || s.rules_url} className=\"see-all\" target=\"_blank\" rel=\"noreferrer noopener\">Pravidla</a>)}\n </div>\n <div style={{ display: 'flex', gap: 16, alignItems: 'center', flexWrap: 'wrap' }}>\n {s.image_url && (\n // eslint-disable-next-line jsx-a11y/alt-text\n <img src={getImageUrl(s.image_url)} style={{ width: 120, height: 120, objectFit: 'cover', borderRadius: 8 }} />\n )}\n <div style={{ flex: 1, minWidth: 240 }}>\n <div style={{ fontWeight: 700, fontSize: 18, marginBottom: 4 }}>{s.title}</div>\n {s.description && <div style={{ opacity: 0.8 }}>{s.description}</div>}\n <div style={{ marginTop: 8, fontSize: 14, opacity: 0.8 }}>Začíná: {fmtDate(s.start_at)} • Končí: {fmtDate(s.end_at)}</div>\n </div>\n {!isLogged ? (\n <a href=\"/login\" className=\"btn\" style={{ padding: '10px 16px' }}>{t('auth.login')}</a>\n ) : hasEntered ? (\n <span style={{ fontWeight: 600 }}>Už jste přihlášeni do soutěže ✓</span>\n ) : (\n <span style={{ fontSize: 14, opacity: 0.85 }}>Soutěž ještě nezačala. Vstup bude možný od {fmtDate(s.start_at)}.</span>\n )}\n </div>\n </div>\n )}\n\n {state === 'active' && (\n <div>\n <div className=\"section-head\" style={{ marginTop: 0 }}>\n <h3>Soutěž</h3>\n {s.rules_url && (<a href={getImageUrl(s.rules_url) || s.rules_url} className=\"see-all\" target=\"_blank\" rel=\"noreferrer noopener\">Pravidla</a>)}\n </div>\n <div style={{ display: 'flex', gap: 16, alignItems: 'center', flexWrap: 'wrap' }}>\n {s.image_url && (\n // eslint-disable-next-line jsx-a11y/alt-text\n <img src={getImageUrl(s.image_url)} style={{ width: 120, height: 120, objectFit: 'cover', borderRadius: 8 }} />\n )}\n <div style={{ flex: 1, minWidth: 240 }}>\n <div style={{ fontWeight: 700, fontSize: 18, marginBottom: 4 }}>{s.title}</div>\n {s.description && <div style={{ opacity: 0.8 }}>{s.description}</div>}\n <div style={{ marginTop: 8, fontSize: 14, opacity: 0.8 }}>Konec: {fmtDate(s.end_at)}</div>\n <div style={{ marginTop: 6, display: 'flex', gap: 8, alignItems: 'center', flexWrap: 'wrap' }}>\n <span style={{ fontSize: 13, background: '#eef', color: '#223', padding: '2px 8px', borderRadius: 12 }}>Vstup: {(s as any).entry_cost_points ? `${(s as any).entry_cost_points} bodů` : 'zdarma'}</span>\n {(s as any).max_entries_per_user > 1 && (\n <span style={{ fontSize: 13, background: '#f3f3f3', color: '#333', padding: '2px 8px', borderRadius: 12 }}>max {(s as any).max_entries_per_user}×/osoba</span>\n )}\n </div>\n </div>\n {!isLogged ? (\n <a href=\"/login\" className=\"btn\" style={{ padding: '10px 16px' }}>{t('auth.login')}</a>\n ) : hasEntered ? (\n <span style={{ fontWeight: 600 }}>Už jste přihlášeni do soutěže ✓</span>\n ) : canEnter ? (\n <button className=\"btn\" onClick={onJoin} disabled={joining}>\n {joining ? 'Přihlašuji…' : 'Přihlásit do soutěže'}\n </button>\n ) : (\n <span style={{ fontWeight: 600 }}>Vstup není dostupný</span>\n )}\n </div>\n </div>\n )}\n\n {state === 'finalized' && (\n <div>\n <div className=\"section-head\" style={{ marginTop: 0 }}>\n <h3>Výherci soutěže</h3>\n {s.rules_url && (<a href={getImageUrl(s.rules_url)} className=\"see-all\" target=\"_blank\" rel=\"noreferrer noopener\">Pravidla</a>)}\n </div>\n {winners.length === 0 ? (\n <div>Výherci budou vyhlášeni brzy.</div>\n ) : (\n <div>\n {/* Visualization */}\n {!data?.visual_played_at && isLogged && (\n <div style={{ marginBottom: 12 }}>\n {playing ? (\n <div style={{ padding: 16, border: '1px dashed #999', borderRadius: 8, textAlign: 'center' }}>\n <div style={{ fontWeight: 700, marginBottom: 6 }}>Losuji výherce…</div>\n <div className=\"spinner\" style={{ width: 24, height: 24, borderRadius: '50%', border: '3px solid #ccc', borderTopColor: '#333', margin: '0 auto', animation: 'spin 0.9s linear infinite' }} />\n </div>\n ) : (\n <div style={{ display: 'flex', gap: 8, alignItems: 'center' }}>\n <button className=\"btn\" onClick={doPlay}>Spustit losování</button>\n <span style={{ opacity: 0.8, fontSize: 14 }}>(animace pouze jednou na uživatele)</span>\n </div>\n )}\n </div>\n )}\n {/* Winners list */}\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(220px, 1fr))', gap: 12 }}>\n {winners.map((w) => (\n <div key={w.id} className=\"card\" style={{ padding: 12 }}>\n <div style={{ fontWeight: 700 }}>{w.prize_name || 'Výhra'}</div>\n <div style={{ fontSize: 14, opacity: 0.8 }}>Výherce: {user && w.user_id === (user as any).id ? 'Vy' : 'Vybraný uživatel'}</div>\n </div>\n ))}\n </div>\n {iWon && (\n <div style={{ marginTop: 8 }}>\n <div style={{ fontWeight: 800 }}>Vyhráli jste! Více informací najdete ve svém e-mailu.</div>\n <div style={{ marginTop: 6 }}>\n Pokud potřebujete pomoc, <a href={\"/kontakt?subject=\" + encodeURIComponent(\"Soutěž výhra: \" + (s.title || ''))} className=\"see-all\">kontaktujte nás</a>.\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n <style>{`@keyframes spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}`}</style>\n </section>\n );\n};\n\nexport default SweepstakeWidget;\n","import React, { useEffect, useRef, useState, useMemo, Suspense } from 'react';\nimport { IconButton, Tooltip, Box, Text } from '@chakra-ui/react';\nimport MainLayout from '../components/layout/MainLayout';\nimport { FiArrowRight, FiCalendar, FiUsers, FiAward, FiChevronLeft, FiChevronRight, FiEdit } from 'react-icons/fi';\nimport '../styles/theme.css';\nimport '../styles/sparta-styles.css';\nimport '../styles/club-styles.css';\nimport '../styles/home-style-pack.css';\nimport './styles/UnifiedHome.css';\nimport { getPublicSettings } from '../services/settings';\nimport { assetUrl, sanitizeClubName } from '../utils/url';\nimport { getPlayers as apiGetPlayers, Player as ApiPlayer } from '../services/players';\nimport { getSponsors as apiGetSponsors, Sponsor as ApiSponsor } from '../services/sponsors';\nimport { getBanners as apiGetBanners, Banner as ApiBanner } from '../services/banners';\nimport { translateNationality, getCountryFlag } from '../utils/nationality';\nconst BannerDisplay = React.lazy(() => import('../components/banners/BannerDisplay'));\nconst BlogCardsScroller = React.lazy(() => import('../components/home/BlogCardsScroller'));\nconst BlogSwiper = React.lazy(() => import('../components/home/BlogSwiper'));\nconst VideosSection = React.lazy(() => import('../components/home/VideosSection'));\nconst MerchSection = React.lazy(() => import('../components/home/MerchSection'));\nconst PollsWidget = React.lazy(() => import('../components/home/PollsWidget'));\nconst GallerySection = React.lazy(() => import('../components/home/GallerySection'));\nimport { getArticles as apiGetArticles, getFeaturedArticles, Article as ApiArticle } from '../services/articles';\nimport { getCompetitionAliasesPublic, CompetitionAlias } from '../services/competitionAliases';\nimport { getUpcomingEvents } from '../services/eventService';\nconst NewsletterSubscribe = React.lazy(() => import('../components/newsletter/NewsletterSubscribe'));\nconst MyUIbrixStyleEditor = React.lazy(() => import('../components/editor/MyUIbrixEditor'));\nconst MyUIbrixErrorBoundary = React.lazy(() => import('../components/editor/MyUIbrixErrorBoundary'));\nimport ClubModal from '../components/home/ClubModal';\nimport MatchModal from '../components/home/MatchModal';\nimport { useAllPageElementConfigs } from '../hooks/usePageElementConfig';\nimport { API_URL } from '../services/api';\nimport { TeamLogo } from '../components/common/TeamLogo';\nimport ClubHeroTopbar from '../components/home/ClubHeroTopbar';\nimport NewsList from '../components/pack/NewsList';\nconst StandingsCard = React.lazy(() => import('../components/pack/StandingsCard'));\nimport NextMatch from '../components/pack/NextMatch';\nconst MatchesSlider = React.lazy(() => import('../components/pack/MatchesSlider'));\nimport ActivitiesList from '../components/pack/ActivitiesList';\nimport { useAuth } from '../contexts/AuthContext';\nimport SweepstakeWidget from '../components/sweepstakes/SweepstakeWidget';\nimport { sortCategoriesWithOrder } from '../utils/categorySort';\nimport { useTranslation } from 'react-i18next';\n\n// Types for real API-driven data\ntype NewsItem = {\n id: number | string;\n title: string;\n excerpt?: string;\n image?: string;\n date?: string;\n category?: string;\n slug?: string;\n readTime?: number;\n viewCount?: number;\n featured?: boolean;\n};\n\ntype MatchItem = {\n id: number | string;\n homeTeam: string;\n awayTeam: string;\n competition?: string;\n date: string; // yyyy-mm-dd\n time: string; // HH:MM\n venue?: string;\n isHome?: boolean;\n homeLogoURL?: string;\n awayLogoURL?: string;\n};\n\nconst HomePage: React.FC = () => {\n const { t } = useTranslation();\n \n // Local state now starts empty; filled by FACR/cache/live APIs\n const [news, setNews] = useState<NewsItem[]>([]);\n const [matches, setMatches] = useState<MatchItem[]>([]);\n const [countdown, setCountdown] = useState<string>('');\n const [clubName, setClubName] = useState<string>('');\n const [clubLogo, setClubLogo] = useState<string>('');\n const [standings, setStandings] = useState<any[]>([]);\n const [activeComp, setActiveComp] = useState<number>(0);\n const [sponsorLayout, setSponsorLayout] = useState<'grid'|'slider'|'scroller'|'pyramid'>('grid');\n const [shopUrl, setShopUrl] = useState<string | null>(null);\n const [facebookUrl, setFacebookUrl] = useState<string | null>(null);\n const [instagramUrl, setInstagramUrl] = useState<string | null>(null);\n const [youtubeUrl, setYoutubeUrl] = useState<string | null>(null);\n const [galleryUrl, setGalleryUrl] = useState<string | null>(null);\n const [galleryLabel, setGalleryLabel] = useState<string>(t('homepage.gallery'));\n const [sponsorsTheme, setSponsorsTheme] = useState<'dark'|'light'>('light');\n const [unifiedCategory, setUnifiedCategory] = useState<string>(t('common.all'));\n const [heroStyle, setHeroStyle] = useState<'grid' | 'scroller' | 'swiper' | 'swiper_full'>('grid');\n // Removed: custom styles - using unified only\n // PRO style: hero index\n const [proHeroIndex, setProHeroIndex] = useState<number>(0);\n // EDGE style: hero index and back-to-top button\n const [edgeHeroIndex, setEdgeHeroIndex] = useState<number>(0);\n const [showEdgeTop, setShowEdgeTop] = useState<boolean>(false);\n const [edgeRoleIdx, setEdgeRoleIdx] = useState<number>(0);\n const blogAutoRef = useRef<HTMLDivElement | null>(null);\n // FACR competitions with matches (for slider)\n const [facrCompetitions, setFacrCompetitions] = useState<Array<{ name:string; matches:Array<any>; matches_link?:string; display_order?: number }>>([]);\n const [matchesTab, setMatchesTab] = useState<number>(0);\n const [selectedClub, setSelectedClub] = useState<any>(null);\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [selectedMatch, setSelectedMatch] = useState<any>(null);\n const [isMatchModalOpen, setIsMatchModalOpen] = useState(false);\n // Index for the NEXT MATCH competition carousel\n const [nextCompIdx, setNextCompIdx] = useState<number>(0);\n const [nextMatchLink, setNextMatchLink] = useState<string | undefined>(undefined);\n const [sidebarTop, setSidebarTop] = useState<number>(112);\n // Matches slider auto-centering handled internally by MatchesSlider component\n\n // API-driven players and sponsors\n type UiPlayer = { id:number|string; name:string; number?:number; position?:string; image?:string; slug?:string; age?: number; nationality?: string; active?: boolean };\n type UiSponsor = { id:number|string; name:string; logo:string; url?:string; tier?: string };\n type UiBanner = { id:number|string; name:string; image:string; url?:string; placement?:string; width?:number; height?:number };\n type UiMerch = { id?: number|string; title?: string; image_url: string; url?: string };\n type UiEvent = { id:number|string; title:string; start_time:string; end_time?:string|null; location?:string|null; type?:string; image_url?:string|null };\n const [players, setPlayers] = useState<UiPlayer[]>([]);\n const [sponsors, setSponsors] = useState<UiSponsor[]>([]);\n const [banners, setBanners] = useState<UiBanner[]>([]);\n const [featured, setFeatured] = useState<NewsItem[]>([]);\n const [videos, setVideos] = useState<string[]>([]);\n const [videosRich, setVideosRich] = useState<Array<{ url:string; title?:string; length?:string; uploaded_at?:string; thumbnail_url?:string }>>([]);\n const [merchItems, setMerchItems] = useState<UiMerch[]>([]);\n const [merchEnabled, setMerchEnabled] = useState<boolean>(false);\n const [upcomingEvents, setUpcomingEvents] = useState<UiEvent[]>([]);\n const [activitiesLoaded, setActivitiesLoaded] = useState<boolean>(false);\n const [defer, setDefer] = useState<boolean>(false);\n // Aliases\n const [aliases, setAliases] = useState<CompetitionAlias[]>([]);\n const [aliasMap, setAliasMap] = useState<Record<string, { alias: string; original_name?: string; display_order?: number }>>({});\n const [settings, setSettings] = useState<any>(null);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [isEditingMode, setIsEditingMode] = useState<boolean>(false);\n const { user } = useAuth();\n \n // MyUIbrix element configuration hook for live preview\n const { getVariant, isVisible, getStyles, loading: configLoading, refreshKey } = useAllPageElementConfigs('homepage');\n const stylePack = getVariant('style-pack', 'default');\n const containerVariant = getVariant('container', 'boxed');\n\n useEffect(() => {\n try {\n const cls = `style-pack-${stylePack}`;\n const all = ['style-pack-default','style-pack-modern','style-pack-minimal','style-pack-sparta'];\n all.forEach(c => document.body.classList.remove(c));\n document.body.classList.add(cls);\n } catch {}\n }, [stylePack]);\n\n useEffect(() => {\n const ric: any = (window as any).requestIdleCallback || ((cb: any) => setTimeout(cb, 1));\n ric(() => setDefer(true));\n }, []);\n\n useEffect(() => {\n try {\n const has = typeof document !== 'undefined' && document.body.classList.contains('myuibrix-edit-mode');\n setIsEditingMode(!!has);\n } catch {}\n }, []);\n\n useEffect(() => {\n const updateTop = () => {\n try {\n const hdr = (document.querySelector('header[data-element=\"header\"]') as HTMLElement) || (document.querySelector('header') as HTMLElement);\n const h = hdr ? Math.round(hdr.getBoundingClientRect().height) : 96;\n setSidebarTop(Math.max(64, h + 16));\n } catch {}\n };\n updateTop();\n window.addEventListener('resize', updateTop);\n return () => window.removeEventListener('resize', updateTop);\n }, [refreshKey]);\n\n const heroFallbackArticles = useMemo(() => featured.map((item, index) => ({\n id: typeof item.id === 'number' ? item.id : index,\n title: item.title,\n excerpt: item.excerpt,\n image: item.image,\n date: item.date,\n category: item.category\n ? { id: index, name: item.category }\n : undefined,\n slug: item.slug,\n })), [featured]);\n\n const upcomingCompIndices = useMemo(() => {\n const now = Date.now();\n try {\n return (facrCompetitions || [])\n .map((c, i) => {\n const items = Array.isArray(c?.matches) ? c.matches : [];\n const hasUpcoming = items.some((m: any) => {\n const t = new Date(`${m.date || ''}T${(m.time || '00:00')}:00`).getTime();\n return !isNaN(t) && t > now;\n });\n return hasUpcoming ? i : -1;\n })\n .filter((i) => i !== -1);\n } catch {\n return [] as number[];\n }\n }, [facrCompetitions]);\n\n useEffect(() => {\n try {\n if (!Array.isArray(upcomingCompIndices) || upcomingCompIndices.length === 0) return;\n if (!upcomingCompIndices.includes(nextCompIdx)) {\n setNextCompIdx(upcomingCompIndices[0]);\n }\n } catch {}\n }, [upcomingCompIndices, nextCompIdx]);\n\n useEffect(() => {\n try {\n setNextCompIdx(matchesTab);\n } catch {}\n }, [matchesTab]);\n\n useEffect(() => {\n let cancelled = false;\n\n const resolveBackendUrl = (path: string) => {\n try {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (path.startsWith('/cache') || path.startsWith('/uploads') || path.startsWith('/api/')) {\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n return new URL(path, origin).toString();\n }\n return path;\n } catch {\n return path;\n }\n };\n\n const fetchJSON = async (url: string) => {\n try {\n const res = await fetch(resolveBackendUrl(url), { cache: 'no-cache' });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return await res.json();\n } catch {\n return null;\n }\n };\n\n const mapArticles = (data: any): NewsItem[] => {\n if (!data) return [] as any;\n // Try common shapes: {items: []}, {data: []}, []\n const items = Array.isArray(data)\n ? data\n : Array.isArray(data?.items)\n ? data.items\n : Array.isArray(data?.data)\n ? data.data\n : [];\n const mapped: NewsItem[] = items.slice(0, 6).map((a: any, idx: number) => ({\n id: a.id ?? idx + 1,\n title: a.title ?? a.name ?? 'Article',\n excerpt: a.excerpt ?? a.summary ?? a.content?.slice?.(0, 140) ?? '',\n image: a.imageUrl ?? a.image_url ?? a.cover ?? '/images/news/placeholder.jpg',\n date: a.createdAt ?? a.created_at ?? a.publishedAt ?? a.published_at ?? new Date().toISOString(),\n category: a.category?.name ?? a.category ?? 'News',\n slug: a.slug ?? a.urlSlug ?? a.seoSlug ?? undefined,\n }));\n return mapped;\n };\n\n const mapMatches = (data: any): MatchItem[] => {\n if (!data) return [] as any;\n const items = Array.isArray(data)\n ? data\n : Array.isArray(data?.items)\n ? data.items\n : Array.isArray(data?.data)\n ? data.data\n : [];\n const mapped: MatchItem[] = items.slice(0, 2).map((m: any, idx: number) => ({\n id: m.id ?? idx + 1,\n homeTeam: m.homeTeam ?? m.home_team ?? m.home ?? 'Home',\n awayTeam: m.awayTeam ?? m.away_team ?? m.away ?? 'Away',\n competition: m.competition ?? m.league ?? 'Match',\n date: m.date ?? m.kickoffDate ?? m.kickoff_date ?? new Date().toISOString().slice(0, 10),\n time: m.time ?? m.kickoffTime ?? m.kickoff_time ?? '18:00',\n venue: m.venue ?? 'Stadium',\n isHome: Boolean(m.isHome ?? m.is_home ?? true),\n homeLogoURL: m.homeLogoURL ?? m.HomeLogoURL ?? m.home_logo_url ?? m.home_logo ?? m.homeLogo ?? undefined,\n awayLogoURL: m.awayLogoURL ?? m.AwayLogoURL ?? m.away_logo_url ?? m.away_logo ?? m.awayLogo ?? undefined,\n }));\n return mapped;\n };\n\n (async () => {\n // Prefer FACR prefetch cache if available\n const [\n articlesJSON,\n matchesJSON,\n cachedSettingsJSON,\n facrClubJSON,\n facrTablesJSON,\n teamLogoOverridesAPI,\n teamLogoOverridesFile,\n matchesApiJSON,\n matchesPastApiJSON,\n ] = await Promise.all([\n fetchJSON('/cache/prefetch/articles.json'),\n fetchJSON('/cache/prefetch/matches.json'),\n fetchJSON('/cache/prefetch/settings.json'),\n fetchJSON('/cache/prefetch/facr_club_info.json'),\n fetchJSON('/cache/prefetch/facr_tables.json'),\n // Prefer public endpoint (cache-busted) for overrides\n fetchJSON(`/api/v1/public/team-logo-overrides?t=${Date.now()}`),\n // Fallback to cached JSON snapshot written by backend after saves\n fetchJSON('/cache/prefetch/team_logo_overrides.json'),\n fetchJSON(`/api/v1/matches?t=${Date.now()}`),\n fetchJSON(`/api/v1/matches/history?t=${Date.now()}`),\n ]);\n // load aliases (public)\n let aliasesList: CompetitionAlias[] = [];\n try {\n aliasesList = await getCompetitionAliasesPublic();\n } catch {}\n const amap: Record<string, { alias: string; original_name?: string; display_order?: number }> = {};\n (aliasesList || []).forEach((a) => { if (a?.code && a?.alias) amap[a.code] = { alias: a.alias, original_name: a.original_name, display_order: a.display_order }; });\n // Try live settings API first\n let liveSettings: any = null;\n try {\n liveSettings = await getPublicSettings();\n } catch {}\n if (!cancelled) {\n setNews(mapArticles(articlesJSON));\n setAliases(aliasesList || []);\n setAliasMap(amap);\n // Prepare settings for overrides usage (club id/logo)\n const settingsJSON = liveSettings || cachedSettingsJSON;\n\n // Build override helpers (names + logos by ID and by name)\n const teamLogoOverridesJSON = (teamLogoOverridesAPI && (teamLogoOverridesAPI.by_name || teamLogoOverridesAPI.by_id)) ? teamLogoOverridesAPI : (teamLogoOverridesFile || {});\n const byName: Record<string, string> = (teamLogoOverridesJSON?.by_name || {}) as any;\n const byId: Record<string, { name?: string; logo_url?: string }> = (teamLogoOverridesJSON?.by_id || {}) as any;\n const normalize = (s: string) => String(s)\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\n const stripPrefixes = (s: string) => {\n // Remove common Czech prefixes/words in club names for more robust matching\n // e.g., \"Městský fotbalový klub Kravaře\" -> \"Kravaře\"\n let x = normalize(s);\n x = x.replace(/\\b(mestsky|m\\.?f\\.?k\\.?|mfk|tj|sk|sokol|fotbalovy|fotbalový|fotbalovy\\s+klub|fotbalovy\\s+klub)\\b/g, '').replace(/\\s+/g, ' ').trim();\n return x;\n };\n const byNameNormalized: Record<string, string> = Object.keys(byName || {}).reduce((acc: Record<string, string>, k: string) => {\n acc[normalize(k)] = byName[k];\n return acc;\n }, {});\n const byNameStrippedPairs: Array<{ keyNorm: string; url: string }> = Object.keys(byName || {}).map((k: string) => ({ keyNorm: stripPrefixes(k), url: byName[k] }));\n const normName = (s?: string) => String(s || '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[\\u2012\\u2013\\u2014\\u2015\\u2212]/g, '-')\n .replace(/\\bn\\.?\\b/g, ' nad ')\n .replace(/\\bp\\.?\\b/g, ' pod ')\n .replace(/[\\,\\s]*(z\\.?\\s*s\\.?|o\\.?\\s*s\\.?)\\s*$/g, '')\n .replace(/[\\.,!;:()\\[\\]{}]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\n const aliasNameIndex: Record<string, string> = (() => {\n const urlToName: Record<string, string> = {};\n for (const v of Object.values(byId || {})) {\n const nm = String((v as any)?.name || '').trim();\n const lg = String((v as any)?.logo_url || '').trim();\n if (nm && lg) urlToName[lg] = nm;\n }\n const idx: Record<string, string> = {};\n for (const [alias, url] of Object.entries(byName || {})) {\n const canon = urlToName[String(url)] || '';\n const key = normName(alias);\n if (canon && key) idx[key] = canon;\n }\n return idx;\n })();\n const nameIndex: Record<string, { id: string; name: string; logo_url: string }> = (() => {\n const idx: Record<string, { id: string; name: string; logo_url: string }> = {};\n for (const [id, v] of Object.entries(byId || {})) {\n const nm = String((v as any)?.name || '').trim();\n const lg = String((v as any)?.logo_url || '').trim();\n if (!nm) continue;\n const key = normName(nm);\n if (!key) continue;\n idx[key] = { id, name: nm, logo_url: lg } as any;\n }\n return idx;\n })();\n const getOverrideName = (teamName?: string, teamId?: string) => {\n const tid = teamId ? String(teamId) : '';\n if (tid && byId?.[tid]?.name && String(byId[tid].name).trim()) {\n return String(byId[tid].name).trim();\n }\n try {\n const n = normName(teamName);\n if (aliasNameIndex[n]) return aliasNameIndex[n];\n let hit: any = nameIndex[n];\n if (!hit) {\n for (const [k, v] of Object.entries(nameIndex)) {\n if (!k) continue;\n if (n.endsWith(k) || k.endsWith(n)) { hit = v; break; }\n }\n }\n if (hit && (hit as any).name) return String((hit as any).name);\n } catch {}\n return String(teamName || '');\n };\n const getFallbackLogo = (teamName?: string, original?: string) => {\n if (teamName) {\n const exact = (byName || {})[teamName];\n const normed = normalize(teamName);\n let candidate = exact || byNameNormalized[normed];\n if (!candidate) {\n const stripped = stripPrefixes(teamName);\n for (const { keyNorm, url } of byNameStrippedPairs) {\n if (!keyNorm) continue;\n if (stripped.endsWith(keyNorm) || keyNorm.endsWith(stripped)) { candidate = url; break; }\n }\n }\n if (candidate) {\n if (typeof candidate === 'string' && candidate.startsWith('/')) return resolveBackendUrl(candidate);\n return candidate;\n }\n }\n if (original) {\n if (typeof original === 'string' && original.startsWith('/')) return resolveBackendUrl(original);\n return original;\n }\n return undefined;\n };\n const getOverrideLogo = (teamName?: string, teamId?: string, original?: string) => {\n // Prefer explicit admin override by ID\n if (teamId && byId?.[teamId]?.logo_url) {\n const v = byId[teamId]!.logo_url as string;\n if (typeof v === 'string' && v.startsWith('/')) return resolveBackendUrl(v);\n return v;\n }\n // Prefer local club logo for our own team\n try {\n if (\n teamId && settingsJSON?.club_id && String(teamId) === String(settingsJSON.club_id) && settingsJSON?.club_logo_url\n ) {\n const local = settingsJSON.club_logo_url as string;\n if (typeof local === 'string' && local.startsWith('/')) return resolveBackendUrl(local);\n return local;\n }\n } catch {}\n // If we have a team ID and no explicit override, use logoapi as a high-quality source\n if (teamId) {\n return `http://logoapi.sportcreative.eu/logos/${teamId}`;\n }\n // Fallback to by-name overrides or original\n return getFallbackLogo(teamName, original);\n };\n\n // Build score overrides map from public API\n const scoreOverrideMap: Record<string, string> = {};\n const addScores = (arr: any[]) => {\n if (!Array.isArray(arr)) return;\n for (const it of arr) {\n const id = String(it?.match_id || it?.id || '').trim();\n const sc = String(it?.score || '').trim();\n if (id && sc) scoreOverrideMap[id] = sc;\n }\n };\n addScores(matchesApiJSON as any[]);\n addScores(matchesPastApiJSON as any[]);\n\n // Matches: map from FACR club info if available, otherwise fallback to matches.json\n if (facrClubJSON?.competitions?.length) {\n const allMatches = (facrClubJSON.competitions || [])\n .flatMap((c: any) =>\n (Array.isArray(c.matches) ? c.matches : []).map((m: any, idx: number) => {\n // m.date_time e.g. \"12.08.2023 18:00\" -> split\n const dt: string = String(m.date_time || '');\n const [d, t] = dt.includes(' ') ? dt.split(' ') : [dt, ''];\n const [day, month, year] = d.split('.');\n const isoDate = (day && month && year) ? `${year}-${month.padStart(2,'0')}-${day.padStart(2,'0')}` : new Date().toISOString().slice(0,10);\n const time = (t || '18:00').slice(0,5);\n const mid = String(m.match_id || '').trim();\n const score = (mid && scoreOverrideMap[mid]) ? scoreOverrideMap[mid] : m.score;\n return {\n id: m.match_id || idx + 1,\n homeTeam: getOverrideName(m.home, m.home_id),\n awayTeam: getOverrideName(m.away, m.away_id),\n competition: m.competition || m.competition_name || c?.name || c?.code || '',\n date: isoDate,\n time,\n venue: m.venue || '',\n isHome: facrClubJSON?.name ? (m.home || '').toLowerCase().includes(String(facrClubJSON.name).toLowerCase()) : true,\n homeLogoURL: getOverrideLogo(m.home, m.home_id, m.home_logo_url),\n awayLogoURL: getOverrideLogo(m.away, m.away_id, m.away_logo_url),\n score,\n facr_link: m.facr_link,\n report_url: m.report_url,\n };\n })\n );\n // Sort by datetime and filter to 14-day range (14 days past + 14 days future)\n const parseDT = (d: string, t: string) => new Date(`${d}T${(t || '00:00')}:00`).getTime();\n const now = Date.now();\n const fourteenDaysInMs = 14 * 24 * 60 * 60 * 1000;\n const minDate = now - fourteenDaysInMs;\n const maxDate = now + fourteenDaysInMs;\n const filteredMatches = allMatches\n .map((m: any & { __ts?: number }) => ({\n ...m,\n __ts: parseDT(m.date, m.time)\n }))\n .filter((m: { __ts?: number }) => {\n const ts = m.__ts;\n return typeof ts === 'number' && !isNaN(ts) && ts >= minDate && ts <= maxDate;\n })\n .sort((a: { __ts?: number }, b: { __ts?: number }) => (a.__ts as number) - (b.__ts as number))\n .map(({ __ts, ...rest }: any & { __ts?: number }) => rest);\n setMatches(filteredMatches);\n\n // Build competitions with their matches for slider (also filter to 14-day range)\n const comps = (facrClubJSON.competitions || []).map((c: any) => {\n const compMatches = (Array.isArray(c.matches) ? c.matches : []).map((m: any, idx: number) => {\n const dt: string = String(m.date_time || '');\n const [d, t] = dt.includes(' ') ? dt.split(' ') : [dt, ''];\n const [day, month, year] = (d || '').split('.');\n const isoDate = (day && month && year) ? `${year}-${month.padStart(2,'0')}-${day.padStart(2,'0')}` : new Date().toISOString().slice(0,10);\n const time = (t || '18:00').slice(0,5);\n const mid = String(m.match_id || '').trim();\n const score = (mid && scoreOverrideMap[mid]) ? scoreOverrideMap[mid] : m.score;\n const homeName = getOverrideName(m.home, m.home_id);\n const awayName = getOverrideName(m.away, m.away_id);\n return {\n id: m.match_id || idx + 1,\n date: isoDate,\n time,\n home: homeName,\n away: awayName,\n home_id: m.home_id,\n away_id: m.away_id,\n home_logo_url: getOverrideLogo(homeName, m.home_id, m.home_logo_url),\n away_logo_url: getOverrideLogo(awayName, m.away_id, m.away_logo_url),\n score,\n facr_link: m.facr_link,\n report_url: m.report_url,\n venue: m.venue || '',\n };\n });\n // Filter to 14-day range\n const filtered = compMatches.filter((m: any) => {\n const ts = new Date(`${m.date}T${(m.time || '00:00')}:00`).getTime();\n return !isNaN(ts) && ts >= minDate && ts <= maxDate;\n });\n return {\n name: (amap?.[c?.code]?.alias) || c.name || c.code || 'Soutěž',\n matches_link: c.matches_link,\n matches: filtered,\n display_order: (amap?.[c?.code]?.display_order),\n };\n });\n const sortedComps = sortCategoriesWithOrder(comps as any);\n setFacrCompetitions(sortedComps as any);\n\n // Next match FACR link\n const first = filteredMatches?.[0];\n setNextMatchLink((first && (first.facr_link || first.report_url)) || comps?.[0]?.matches_link || facrClubJSON?.url);\n } else {\n setMatches(mapMatches(matchesJSON));\n }\n\n // settingsJSON defined above\n setSettings(settingsJSON);\n if (settingsJSON) {\n const name = settingsJSON?.club_name || settingsJSON?.clubName || settingsJSON?.name || settingsJSON?.siteName;\n const logo = settingsJSON?.club_logo_url || settingsJSON?.clubLogo || settingsJSON?.logo || settingsJSON?.logoUrl || settingsJSON?.logoURL;\n if (name) setClubName(name);\n if (logo) setClubLogo(logo);\n\n // Load players via API (include inactive to show as non-active instead of hiding)\n try {\n const apiPlayers: ApiPlayer[] = await apiGetPlayers();\n const mappedPlayers: UiPlayer[] = (apiPlayers || []).map((p: ApiPlayer) => ({\n id: p.id,\n name: [p.first_name, p.last_name].filter(Boolean).join(' '),\n number: p.jersey_number,\n position: p.position,\n image: assetUrl(p.image_url) || undefined,\n nationality: (p as any).nationality,\n active: Boolean((p as any).is_active),\n age: (function(iso?: string){\n if (!iso) return undefined;\n const d = new Date(iso);\n if (isNaN(d.getTime())) return undefined;\n const today = new Date();\n let age = today.getFullYear() - d.getFullYear();\n const m = today.getMonth() - d.getMonth();\n if (m < 0 || (m === 0 && today.getDate() < d.getDate())) age--;\n return age;\n })( (p as any).date_of_birth ),\n }));\n setPlayers(mappedPlayers);\n } catch {}\n\n // Load sponsors via API (sponsors only)\n try {\n const apiSponsors: ApiSponsor[] = await apiGetSponsors();\n const mapped: UiSponsor[] = (apiSponsors || []).map((s: ApiSponsor) => ({\n id: s.id,\n name: s.name,\n logo: assetUrl(s.logo_url) || '/images/sponsors/placeholder.png',\n url: s.website_url || undefined,\n tier: (s as any).tier,\n }));\n setSponsors(mapped);\n } catch {}\n\n // Load banners via dedicated API (separate from sponsors)\n try {\n const apiBanners: ApiBanner[] = await apiGetBanners({ active: true });\n const mappedBanners: UiBanner[] = (apiBanners || []).map((b: any) => ({\n id: b.id,\n name: b.name,\n image: assetUrl(b.image_url) || '/images/sponsors/placeholder.png',\n url: b.click_url || undefined,\n placement: b.placement,\n width: typeof b.width === 'number' ? b.width : undefined,\n height: typeof b.height === 'number' ? b.height : undefined,\n }));\n setBanners(mappedBanners);\n } catch {}\n\n // Load featured articles (homepage primary) via dedicated endpoint\n try {\n // Fetch up to 3 featured articles for the homepage hero\n const resp = await getFeaturedArticles({ page_size: 3 });\n const all = (resp?.data || []).map((a: ApiArticle, idx: number) => ({\n id: a.id ?? idx + 1,\n title: a.title,\n excerpt: (a as any).excerpt || (a.content || '').slice(0, 140),\n image: (a as any).image || a.image_url || '/images/news/placeholder.jpg',\n date: (a as any).published_at || a.created_at || new Date().toISOString(),\n category: (a as any)?.category?.name || (a as any)?.category_name || t('homepage.latest_news'),\n slug: a.slug,\n readTime: (a as any)?.read_time ?? (a as any)?.estimated_read_minutes,\n viewCount: (a as any)?.view_count ?? (a as any)?.read_count,\n } as NewsItem));\n // Show only first 3 in hero; remove only those 3 from the other news list\n const top3 = all.slice(0, 3);\n setFeatured(top3);\n setNews((prev) => {\n const heroKeys = new Set(top3.map((f) => (f.slug ? `s:${f.slug}` : `i:${f.id}`)));\n return (prev || []).filter((n) => !heroKeys.has(n.slug ? `s:${n.slug}` : `i:${n.id}`));\n });\n\n // Load regular published articles for \"Další aktuality\" section\n try {\n const regularResp = await apiGetArticles({ page: 1, page_size: 12, published: true });\n const allRegular = (regularResp?.data || []).map((a: ApiArticle, idx: number) => ({\n id: a.id ?? idx + 1,\n title: a.title,\n excerpt: (a as any).excerpt || (a.content || '').slice(0, 140),\n image: (a as any).image || a.image_url || '/images/news/placeholder.jpg',\n date: (a as any).published_at || a.created_at || new Date().toISOString(),\n category: (a as any)?.category?.name || (a as any)?.category_name || t('homepage.latest_news'),\n slug: a.slug,\n readTime: (a as any)?.read_time ?? (a as any)?.estimated_read_minutes,\n viewCount: (a as any)?.view_count ?? (a as any)?.read_count,\n featured: a.featured || false,\n } as NewsItem));\n \n // Filter out featured articles (they're shown in hero)\n const featuredIds = new Set(top3.map((f: NewsItem) => f.id));\n const nonFeatured = allRegular.filter((article: NewsItem) => !featuredIds.has(article.id) && !article.featured);\n \n setNews(nonFeatured);\n } catch {}\n } catch {}\n\n // Shop URL for merchandise CTA\n const shop = settingsJSON?.shop_url || settingsJSON?.shopUrl || settingsJSON?.eshop_url || settingsJSON?.e_shop_url || null;\n if (shop) setShopUrl(String(shop));\n // Hero style variant\n const hs = settingsJSON?.hero_style || settingsJSON?.homepage?.hero_style || settingsJSON?.frontpage_hero_style;\n if (hs === 'grid' || hs === 'scroller' || hs === 'swiper' || hs === 'swiper_full') setHeroStyle(hs);\n // Sponsor layout preference: 'grid' or 'slider'\n const sponsorPref = settingsJSON?.homepage?.sponsors_layout || settingsJSON?.sponsors_layout || settingsJSON?.sponsorsLayout;\n if (sponsorPref === 'slider' || sponsorPref === 'grid' || sponsorPref === 'scroller' || sponsorPref === 'pyramid') {\n setSponsorLayout(sponsorPref);\n }\n // Sponsors theme: dark or light\n const sTheme = settingsJSON?.sponsors_theme || settingsJSON?.homepage?.sponsors_theme || settingsJSON?.sponsorsTheme;\n if (sTheme === 'dark' || sTheme === 'light') setSponsorsTheme(sTheme);\n // Sponsors data, if present in settings/cache\n const sponsorsData = settingsJSON?.sponsors || settingsJSON?.partners || null;\n if (Array.isArray(sponsorsData) && sponsorsData.length) {\n setSponsors(\n sponsorsData.map((s: any, i: number) => ({\n id: s.id ?? i + 1,\n name: s.name || 'Sponsor',\n logo: s.logo_url || s.logoUrl || s.logo || '/images/sponsors/placeholder.png',\n url: s.url || s.website || s.link || '#',\n tier: s.tier,\n }))\n );\n }\n // Socials & gallery\n setFacebookUrl(settingsJSON?.facebook_url || null);\n setInstagramUrl(settingsJSON?.instagram_url || null);\n setYoutubeUrl(settingsJSON?.youtube_url || null);\n setGalleryUrl(settingsJSON?.gallery_url || settingsJSON?.zonerama_url || null);\n setGalleryLabel(settingsJSON?.gallery_label || t('homepage.gallery'));\n // Removed: custom style selection - using unified only\n // Videos (optional)\n if (Array.isArray(settingsJSON?.videos)) setVideos(settingsJSON.videos as string[]);\n if (Array.isArray(settingsJSON?.videos_items)) setVideosRich(settingsJSON.videos_items as any);\n // Merch (optional)\n if (typeof settingsJSON?.merch_module_enabled === 'boolean') setMerchEnabled(!!settingsJSON.merch_module_enabled);\n if (Array.isArray(settingsJSON?.merch_items)) setMerchItems((settingsJSON.merch_items as any[]).map((m:any, i:number)=> ({ id: m.id ?? i, title: m.title, image_url: m.image_url, url: m.url })));\n }\n // Standings: prefer FACR tables JSON\n if (facrTablesJSON?.competitions?.length) {\n const comps = (facrTablesJSON.competitions || []).map((c: any) => ({\n name: (amap?.[c?.code]?.alias) || c.name || c.code,\n display_order: (amap?.[c?.code]?.display_order),\n code: c.code,\n table: (c.table?.overall || []).map((r: any, idx: number) => ({\n position: Number(r.rank || idx + 1),\n team: r.team || r.team_name || '-',\n team_logo_url: getOverrideLogo(r.team || r.team_name, r.team_id, r.team_logo_url),\n team_id: r.team_id,\n points: Number(r.points || r.pts || 0),\n played: Number(r.played || 0),\n wins: Number(r.wins || 0),\n draws: Number(r.draws || 0),\n losses: Number(r.losses || 0),\n score: r.score || '0:0',\n })),\n }));\n const sortedTables = sortCategoriesWithOrder(comps as any);\n setStandings(sortedTables);\n }\n\n // Club name/logo from FACR if not provided by settings\n if (facrClubJSON) {\n if (facrClubJSON.name && !clubName) setClubName(facrClubJSON.name);\n if (facrClubJSON.logo_url && !clubLogo) setClubLogo(facrClubJSON.logo_url);\n // If settings did not override, still prefer FACR values\n if (facrClubJSON.name) setClubName(facrClubJSON.name);\n if (facrClubJSON.logo_url) setClubLogo(facrClubJSON.logo_url);\n }\n \n // Mark loading complete\n setIsLoading(false);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, []);\n\n // Removed: legacy auto-scroll. Handled by MatchesSlider.\n \n // MyUIbrix events are handled by useAllPageElementConfigs hook\n // It automatically updates getVariant() and isVisible() when changes occur in edit mode\n\n // Countdown to next match (uses selected competition upcoming if available)\n useEffect(() => {\n const getUpcomingForComp = (c: any) => {\n const items = Array.isArray(c?.matches) ? c.matches : [];\n const future = items\n .map((m: any) => ({ m, t: new Date(`${m.date}T${(m.time || '00:00')}:00`).getTime() }))\n .filter((x: any) => !isNaN(x.t) && x.t > Date.now())\n .sort((a: any, b: any) => a.t - b.t);\n return future[0]?.m || null;\n };\n const getNextKickoff = () => {\n if (facrCompetitions.length) {\n const sel = facrCompetitions[Math.max(0, Math.min(matchesTab, facrCompetitions.length - 1))];\n const up = getUpcomingForComp(sel);\n if (up) {\n const iso = `${up.date}T${(up.time || '00:00')}:00`;\n const d = new Date(iso);\n return isNaN(d.getTime()) ? null : d;\n }\n }\n if (!matches.length) return null;\n const m = matches[0];\n const iso = `${m.date}T${(m.time || '00:00')}:00`;\n const d = new Date(iso);\n return isNaN(d.getTime()) ? null : d;\n };\n const update = () => {\n const next = getNextKickoff();\n if (!next) { setCountdown(''); return; }\n const diff = next.getTime() - Date.now();\n if (diff <= 0) { setCountdown('Začátek'); return; }\n const s = Math.floor(diff / 1000);\n const days = Math.floor(s / 86400);\n const hrs = Math.floor((s % 86400) / 3600);\n const mins = Math.floor((s % 3600) / 60);\n const secs = s % 60;\n setCountdown(`${days} d ${hrs} h ${mins} m ${secs} s`);\n };\n update();\n const id = setInterval(update, 1000);\n return () => clearInterval(id);\n }, [matches, facrCompetitions, matchesTab]);\n\n useEffect(() => {\n let active = true;\n (async () => {\n try {\n const evs = await getUpcomingEvents();\n const mapped: UiEvent[] = (evs || []).map((e: any) => ({\n id: e.id,\n title: e.title,\n start_time: e.start_time,\n end_time: e.end_time,\n location: e.location,\n type: e.type,\n image_url: e.image_url,\n }));\n if (active) setUpcomingEvents(mapped);\n } catch {}\n finally {\n if (active) setActivitiesLoaded(true);\n }\n })();\n return () => { active = false; };\n }, []);\n\n // Removed: Edge auto-cycle\n\n // Removed: Aurora layout\n if (false) {\n const heroItems = [...featured, ...news].slice(0, 3);\n const top = heroItems[0] || news[0];\n return (\n <MainLayout>\n <div className=\"aurora\">\n <section className=\"aurora-hero\">\n <div className=\"bg\" style={{ backgroundImage: `url(${assetUrl(top?.image) || '/images/news/placeholder.jpg'})` }} />\n <div className=\"gradient\" aria-hidden />\n <div className=\"glow\" aria-hidden />\n <div className=\"content\">\n <img className=\"logo\" src={assetUrl(clubLogo) || '/images/club-logo-fallback.svg'} alt=\"Klub\" />\n <h1 className=\"title\">{clubName || 'Fotbal Club'}</h1>\n {top && (<a className=\"pill\" href={`/news/${top.slug || top.id}`}>{top.title}</a>)}\n <div className=\"quick\">\n {galleryUrl && (<a href={galleryUrl || undefined} target=\"_blank\" rel=\"noreferrer noopener\">{galleryLabel}</a>)}\n {facebookUrl && (<a href={facebookUrl || undefined} target=\"_blank\" rel=\"noreferrer noopener\">Facebook</a>)}\n {instagramUrl && (<a href={instagramUrl || undefined} target=\"_blank\" rel=\"noreferrer noopener\">Instagram</a>)}\n {youtubeUrl && (<a href={youtubeUrl || undefined} target=\"_blank\" rel=\"noreferrer noopener\">YouTube</a>)}\n </div>\n </div>\n </section>\n\n <section className=\"aurora-main\">\n <div className=\"card matches\">\n <div className=\"head\">\n <h3>{t('homepage.nearest_matches')}</h3>\n <div className=\"tabs\">\n {facrCompetitions.map((c, i) => (\n <button key={`${c.name}-${i}`} className={i===matchesTab ? 'active' : ''} onClick={()=>setMatchesTab(i)}>{c.name}</button>\n ))}\n </div>\n </div>\n <div className=\"list\">\n {(facrCompetitions[matchesTab]?.matches || []).slice(0,4).map((m:any, idx:number) => (\n <a key={m.id || idx} className=\"row\" href={m.facr_link || m.report_url || '#'} target=\"_blank\" rel=\"noopener noreferrer\">\n <div className=\"team\"><img src={assetUrl(m.home_logo_url)} alt={m.home} /><span>{sanitizeClubName(m.home)}</span></div>\n <div className=\"meta\"><span>{new Date(`${m.date}T${(m.time||'00:00')}:00`).toLocaleDateString()}</span><span>•</span><span>{m.time || ''}</span></div>\n <div className=\"team\"><img src={assetUrl(m.away_logo_url)} alt={m.away} /><span>{sanitizeClubName(m.away)}</span></div>\n </a>\n ))}\n </div>\n <div className=\"action\"><a className=\"btn\" href=\"/kalendar\">{t('nav.all_matches')}</a></div>\n </div>\n\n <div className=\"card news\">\n <div className=\"head\"><h3>{t('homepage.latest_news')}</h3></div>\n <div className=\"grid\">\n {news.slice(0,6).map((n)=> (\n <a key={n.id} href={`/news/${n.slug || n.id}`} className=\"n\">\n <div className=\"thumb\" style={{ backgroundImage: `url(${assetUrl(n.image) || '/images/news/placeholder.jpg'})` }} />\n <div className=\"meta\"><div className=\"tag\">{n.category || t('homepage.latest_news')}</div><div className=\"title\">{n.title}</div></div>\n </a>\n ))}\n </div>\n <div className=\"action\"><a className=\"btn\" href=\"/news\">{t('nav.all_articles')}</a></div>\n </div>\n\n {/* Merch section (Aurora) */}\n <div className=\"card\" style={{ marginTop: 24 }}>\n <MerchSection />\n </div>\n\n <div className=\"card tables\">\n <div className=\"head\"><h3>{t('homepage.tables')}</h3></div>\n <div className=\"tabs small\">\n {(standings.length ? standings.map((s:any)=> s.name || 'Soutěž') : ['Liga']).map((t: string, i: number) => (\n <button key={`${t}-${i}`} className={i===activeComp ? 'active' : ''} onClick={()=>setActiveComp(i)}>{t}</button>\n ))}\n </div>\n <div className=\"table\">\n {(standings[activeComp]?.table || standings[activeComp]?.rows || []).slice(0,8).map((row:any, idx:number) => (\n <div key={idx} className=\"tr\"><span>#{row.position ?? row.pos ?? idx+1}</span><span className=\"team\">{row.team?.name ?? row.team ?? row.club ?? '-'}</span><span>{row.points ?? row.pts ?? '-'}</span></div>\n ))}\n </div>\n <div className=\"action\"><a className=\"btn\" href=\"/tabulky\">{t('nav.all_tables')}</a></div>\n </div>\n </section>\n\n {sponsors.length > 0 && (\n <section className=\"aurora-sponsors\">\n <div className=\"belt\">\n {[...sponsors, ...sponsors].slice(0, Math.max(8, sponsors.length)).map((s, idx) => (\n <a key={`${s.id}-${idx}`} className=\"tile\" href={s.url || '#'} target=\"_blank\" rel=\"noreferrer noopener\"><img src={assetUrl(s.logo) || '/images/sponsors/placeholder.png'} alt={s.name} /></a>\n ))}\n </div>\n </section>\n )}\n </div>\n </MainLayout>\n );\n }\n\n // Removed: Magazine layout\n if (false) {\n return (\n <MainLayout>\n <div className=\"magazine\">\n {/* Top color bars */}\n <div className=\"mag-bars\" aria-hidden>\n <div className=\"c1\" />\n <div className=\"c2\" />\n </div>\n <div className=\"mag-container\">\n {/* Club header */}\n <header className=\"mag-header\">\n <div className=\"club-colors\">\n <span className=\"swatch\" style={{ background: 'var(--primary)' }} />\n <span className=\"swatch\" style={{ background: 'var(--secondary)' }} />\n </div>\n <div className=\"brand\">\n <img className=\"logo\" src={assetUrl(clubLogo) || '/images/club-logo-fallback.svg'} alt=\"Klub\" />\n <h1 className=\"name\">{clubName || 'Fotbal Club'}</h1>\n </div>\n {/* Category nav in club color (optional) */}\n <nav className=\"mag-nav\" aria-label=\"Sekce webu\">\n <a href=\"/\" className=\"link\">{t('nav.home')}</a>\n <a href=\"/blog\" className=\"link\">{t('nav.articles')}</a>\n <a href=\"/kalendar\" className=\"link\">{t('nav.calendar')}</a>\n <a href=\"/tabulky\" className=\"link\">{t('nav.tables')}</a>\n <a href=\"/kontakt\" className=\"link\">{t('nav.contact')}</a>\n </nav>\n </header>\n\n {/* 3-feature grid like in picture */}\n <section className=\"mag-hero\">\n {[0,1,2].map((i) => {\n const n = featured[i] || news[i];\n if (!n) return (\n <a key={`ph-${i}`} className=\"mag-card\" href=\"#\" aria-hidden />\n );\n return (\n <a key={n.id} href={`/news/${n.slug || n.id}`} className={`mag-card ${i===0 ? 'large' : ''}`}>\n <div className=\"bg\" style={{ backgroundImage: `url(${assetUrl(n.image) || '/images/news/placeholder.jpg'})` }} />\n <div className=\"overlay\">\n <div className=\"cat\">{n.category || t('homepage.latest_news')}</div>\n <h2 className=\"title\">{n.title}</h2>\n </div>\n </a>\n );\n })}\n </section>\n\n {/* Upcoming matches slider (2 visible), with competition switcher */}\n {facrCompetitions.length > 0 && (\n <section className=\"mag-upcoming\">\n <div className=\"head\">\n <h3>{t('homepage.nearest_matches')}</h3>\n <div className=\"tabs\">\n {facrCompetitions.map((c, i) => (\n <button key={`${c.name}-${i}`} className={i===matchesTab ? 'active' : ''} onClick={() => setMatchesTab(i)}>{c.name}</button>\n ))}\n </div>\n </div>\n <div className=\"match-slider\">\n {(facrCompetitions[matchesTab]?.matches || []).map((m:any, idx:number) => (\n <a key={m.id || idx} className=\"match-tile\" href={m.facr_link || m.report_url || '#'} target=\"_blank\" rel=\"noopener noreferrer\">\n <div className=\"row top\">\n <span className=\"meta\">{new Date(`${m.date}T${(m.time||'00:00')}:00`).toLocaleDateString()} • {(m.time||'')}</span>\n </div>\n <div className=\"row teams\">\n <div className=\"team\">\n <img src={assetUrl(m.home_logo_url)} alt={m.home} />\n <span>{sanitizeClubName(m.home)}</span>\n </div>\n <span className=\"vs\">vs</span>\n <div className=\"team\">\n <img src={assetUrl(m.away_logo_url)} alt={m.away} />\n <span>{sanitizeClubName(m.away)}</span>\n </div>\n </div>\n </a>\n ))}\n </div>\n </section>\n )}\n <aside className=\"col right\">\n <div className=\"widget\">\n <h3>{t('homepage.tables')}</h3>\n {standings.length ? (\n <div>\n {(standings[activeComp]?.table || standings[activeComp]?.rows || []).slice(0,8).map((row: any, idx: number) => (\n <div key={idx} className=\"row-table\">\n <div>#{row.position ?? row.pos ?? idx+1}</div>\n <div className=\"team\">{row.team?.name ?? row.team ?? row.club ?? '-'}</div>\n <div>{row.points ?? row.pts ?? '-'}</div>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"muted\">{t('message.no_data_found')}</div>\n )}\n </div>\n <div className=\"widget\">\n <h3>{t('nav.club')}</h3>\n <p className=\"muted\">{clubName} {t('homepage.official_website')}</p>\n </div>\n </aside>\n </div>\n\n {/* Merch section (Magazine) - optional via settings */}\n <section className=\"mag-merch\" style={{ marginTop: 16, marginBottom: 16 }}>\n <div className=\"mag-container\">\n <MerchSection />\n </div>\n </section>\n\n {/* Sponsors: grid or slider (controlled by settings) */}\n <section\n className={`sponsors ${sponsorsTheme === 'dark' ? 'dark' : ''}`}\n style={{\n width: '100vw',\n position: 'relative',\n left: '50%',\n right: '50%',\n transform: 'translateX(-50%)',\n paddingLeft: 'max(16px, calc((100vw - 1200px) / 2))',\n paddingRight: 'max(16px, calc((100vw - 1200px) / 2))',\n boxSizing: 'border-box',\n }}\n >\n <div className=\"section-head\">\n <h3>{t('nav.sponsors')}</h3>\n </div>\n {(sponsorLayout==='grid' || sponsorLayout==='pyramid') ? (\n (()=>{\n const title = sponsors.find((s:any)=>s.tier==='title') || sponsors[0];\n const others = sponsors.filter((s)=>s !== title);\n return (\n <>\n {title && (\n <div className=\"title-sponsor\">\n <a className=\"sponsor-tile\" href={title.url || '#'} target=\"_blank\" rel=\"noreferrer noopener\">\n <img src={assetUrl(title.logo) || '/images/sponsors/placeholder.png'} alt={title.name} />\n </a>\n </div>\n )}\n <div className=\"divider\" aria-hidden />\n <div className=\"sponsors-grid\">\n {others.map((s) => (\n <a key={s.id} className=\"sponsor-tile\" href={s.url || '#'} target=\"_blank\" rel=\"noreferrer noopener\">\n <img src={assetUrl(s.logo) || '/images/sponsors/placeholder.png'} alt={s.name} />\n </a>\n ))}\n </div>\n </>\n );\n })()\n ) : sponsorLayout==='slider' ? (\n <div className=\"sponsors-slider\">\n <div className=\"track\">\n {[...sponsors, ...sponsors].map((s, idx) => (\n <a key={`${s.id}-${idx}`} className=\"sponsor-tile\" href={s.url || '#'} target=\"_blank\" rel=\"noreferrer noopener\">\n <img src={assetUrl(s.logo) || '/images/sponsors/placeholder.png'} alt={s.name} />\n </a>\n ))}\n </div>\n </div>\n ) : (\n <div className=\"sponsors-scroller\">\n <div className=\"belt\">\n {[...sponsors, ...sponsors, ...sponsors].map((s, idx) => (\n <a key={`${s.id}-${idx}`} className=\"sponsor-tile\" href={s.url || '#'} target=\"_blank\" rel=\"noreferrer noopener\">\n <img src={assetUrl(s.logo) || '/images/sponsors/placeholder.png'} alt={s.name} />\n </a>\n ))}\n </div>\n </div>\n )}\n </section>\n </div>\n </MainLayout>\n );\n }\n\n // Removed: Edge layout\n if (false) {\n const heroItems = [...featured, ...news].slice(0, 5);\n const heroItem = heroItems[edgeHeroIndex];\n const splitTitle = (t?: string) => {\n if (!t) return { em: '', strong: '' } as const;\n const parts = t.split(' ');\n const n = Math.max(1, Math.floor(parts.length / 3));\n return { em: parts.slice(0, n).join(' '), strong: parts.slice(n).join(' ') } as const;\n };\n const { em, strong } = splitTitle(heroItem?.title);\n const heroKeys = new Set(heroItems.map((f) => (f?.slug ? `s:${f.slug}` : `i:${f?.id}`)));\n const restBlogs = (news || []).filter((n) => !heroKeys.has(n.slug ? `s:${n.slug}` : `i:${n.id}`));\n const videoUrlToEmbed = (u: string) => {\n try {\n if (/youtu\\.be\\//i.test(u)) { const id = u.split('/').pop(); return `https://www.youtube.com/embed/${id}`; }\n const m = u.match(/v=([^&]+)/); if (m) return `https://www.youtube.com/embed/${m[1]}`;\n } catch {}\n return u;\n };\n return (\n <MainLayout>\n <div className=\"edge\">\n <section className=\"edge-hero bleed\">\n <div className=\"slides\">\n {heroItems.map((n, i) => (\n <a key={n?.id || i} href={n ? `/news/${n.slug || n.id}` : '#'} className={`slide ${i===edgeHeroIndex ? 'active' : ''}`} style={{ backgroundImage: `url(${assetUrl(n?.image) || '/images/news/placeholder.jpg'})` }}>\n <div className=\"overlay\">\n <h2 className=\"title\"><span className=\"em\">{em}</span>{em ? ' ' : ''}<span className=\"strong\">{strong}</span></h2>\n {n && <a className=\"link\" href={`/news/${n.slug || n.id}`}>Přejít na článek</a>}\n </div>\n </a>\n ))}\n <div className=\"pagers\">\n {heroItems.map((_, i) => (\n <button key={i} className={`pager ${i===edgeHeroIndex ? 'active' : ''}`} onClick={()=>setEdgeHeroIndex(i)}>{i+1}</button>\n ))}\n </div>\n </div>\n </section>\n\n {facrCompetitions.length > 0 && (()=>{\n const comp = facrCompetitions[Math.max(0, Math.min(matchesTab, facrCompetitions.length - 1))];\n const items = Array.isArray(comp?.matches) ? comp.matches : [];\n const upcoming = items\n .map((m: any) => ({ m, t: new Date(`${m.date}T${(m.time || '00:00')}:00`).getTime() }))\n .filter((x: any) => !isNaN(x.t) && x.t > Date.now())\n .sort((a: any, b: any) => a.t - b.t)[0]?.m;\n const show = upcoming || items[0] || null;\n const isFuture = show ? (new Date(`${show.date}T${(show.time||'00:00')}:00`).getTime() > Date.now()) : false;\n return (\n <section className=\"edge-upcoming\">\n <div className=\"head\">\n <h3>{t('homepage.nearest_matches')}</h3>\n <div className=\"tabs\">\n {facrCompetitions.map((c, i) => (\n <button key={`${c.name}-${i}`} className={i===matchesTab ? 'active' : ''} onClick={()=>setMatchesTab(i)}>{c.name}</button>\n ))}\n </div>\n </div>\n <div className=\"card\">\n <div className=\"team\">\n <img src={assetUrl(show?.home_logo_url) || assetUrl(clubLogo) || '/images/club-logo-fallback.svg'} alt=\"Domácí\" />\n <div>{show?.home || clubName}</div>\n </div>\n <div className=\"meta\">\n {isFuture ? <><div style={{ fontWeight: 800 }}>{countdown || '—'}</div><div>Začátek</div></> : <div style={{ fontWeight: 800 }}>{show?.score || '—'}</div>}\n </div>\n <div className=\"team\">\n <img src={assetUrl(show?.away_logo_url) || '/images/club-opponent.svg'} alt=\"Hosté\" />\n <div>{show?.away || 'Soupeř'}</div>\n </div>\n </div>\n <div className=\"links\">\n {show && (show.facr_link || show.report_url) && <a href={show.facr_link || show.report_url} target=\"_blank\" rel=\"noreferrer noopener\">Detail na FACR</a>}\n <a href=\"#edge-tables\">{t('homepage.tables')}</a>\n <a href=\"/kalendar\">{t('nav.all_matches')}</a>\n </div>\n </section>\n );\n })()}\n\n <section className=\"edge-grid\">\n <div className=\"left\">\n <div className=\"blogs4\">\n {restBlogs.slice(0,4).map((n) => (\n <a key={n.id} href={`/news/${n.slug || n.id}`} className=\"bcard\">\n <div className=\"thumb\" style={{ backgroundImage: `url(${assetUrl(n.image) || '/images/news/placeholder.jpg'})` }} />\n <div className=\"meta\">{n.title}</div>\n </a>\n ))}\n </div>\n <div style={{ marginTop: 10 }}>\n <a className=\"btn\" href=\"/news\">{t('nav.all_articles')}</a>\n </div>\n </div>\n <aside className=\"right\" id=\"edge-tables\">\n <div className=\"tables\">\n <div className=\"tabs\">\n {(standings.length ? standings.map((s:any)=> s.name || 'Soutěž') : ['Liga']).map((t: string, i: number) => (\n <button key={`${t}-${i}`} className={i===activeComp ? 'active' : ''} onClick={()=>setActiveComp(i)}>{t}</button>\n ))}\n </div>\n {standings.length ? (\n <div>\n {(standings[activeComp]?.table || standings[activeComp]?.rows || []).slice(0,10).map((row: any, idx: number) => (\n <div className=\"row\" key={idx}>\n <div>#{row.position ?? row.pos ?? idx+1}</div>\n <div>{row.team?.name ?? row.team ?? row.club ?? '-'}</div>\n <div>{row.points ?? row.pts ?? '-'}</div>\n </div>\n ))}\n </div>\n ) : (\n <div style={{ color: 'var(--dark-gray)' }}>{t('message.no_data_found')}</div>\n )}\n </div>\n </aside>\n </section>\n\n {(videosRich.length > 0 || (Array.isArray(videos) && videos.length > 0)) && (\n <section className=\"edge-videos\">\n <div className=\"wrap\">\n <div className=\"main\">\n {videosRich.length > 0 ? (\n <iframe title=\"video-main\" src={videoUrlToEmbed(videosRich[0].url)} allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; web-share\" allowFullScreen />\n ) : (\n <iframe title=\"video-main\" src={videoUrlToEmbed(videos[0])} allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; web-share\" allowFullScreen />\n )}\n </div>\n <div className=\"grid4\">\n {(videosRich.length > 0 ? videosRich.slice(1,5).map(v=>v.url) : videos.slice(1,5)).map((v, i) => (\n <div key={i} className=\"small\"><a href={v} target=\"_blank\" rel=\"noreferrer noopener\" /></div>\n ))}\n </div>\n </div>\n </section>\n )}\n\n {players.length > 0 && (\n <section className=\"edge-team\">\n {(() => {\n const roles = Array.from(new Set(players.map((p:any)=> p.position || 'Tým')));\n const role = roles[Math.max(0, Math.min(edgeRoleIdx, roles.length - 1))];\n const items = players.filter((p:any)=> (p.position || 'Tým') === role);\n return (\n <>\n <div className=\"tabs\">\n {roles.map((r, i)=> (\n <button key={r + i} className={i===edgeRoleIdx? 'active' : ''} onClick={()=>setEdgeRoleIdx(i)}>{r}</button>\n ))}\n </div>\n <div className=\"track\">\n {items.map((p)=> (\n <div key={p.id} className=\"card\" style={{ opacity: p.active === false ? 0.6 : 1 }}>\n <div className=\"photo\" style={{ backgroundImage: `url(${assetUrl((p as any).image) || '/images/player-placeholder.jpg'})` }} />\n <div className=\"name\">{p.name}</div>\n <div className=\"role\">{p.position || 'Hráč'}</div>\n {typeof p.number !== 'undefined' && <div className=\"number\">#{p.number}</div>}\n </div>\n ))}\n </div>\n </>\n );\n })()}\n </section>\n )}\n\n {merchEnabled && (shopUrl || merchItems.length > 0) && (\n <section className=\"edge-merch\">\n <div className=\"head\" style={{ marginBottom: 8 }}><h3>Oblečení týmu</h3></div>\n <div className=\"grid\">\n {(merchItems.length > 0 ? merchItems.map((m)=> ({ id: m.id, name: m.title, image: m.image_url, url: m.url })) : (banners || []).filter((b:any)=> (b.placement === 'merch' || b.placement === 'homepage_merch'))).slice(0,8).map((it:any) => (\n <a key={it.id} className=\"item\" href={it.url || shopUrl || '#'} target=\"_blank\" rel=\"noreferrer noopener\">\n <div className=\"thumb\" style={{ backgroundImage: `url(${it.image})` }} />\n <div className=\"meta\">{it.name || 'Fanshop'}</div>\n </a>\n ))}\n </div>\n </section>\n )}\n\n {sponsors.length > 0 && (\n <section className=\"edge-sponsors\">\n <div className=\"grid\">\n {sponsors.map((s) => (\n <a key={s.id} className=\"tile\" href={s.url || '#'} target=\"_blank\" rel=\"noreferrer noopener\">\n <img src={assetUrl(s.logo) || '/images/sponsors/placeholder.png'} alt={s.name} />\n </a>\n ))}\n </div>\n </section>\n )}\n\n <div className={`edge-top ${showEdgeTop ? 'show' : ''}`}>\n <button className=\"btn\" onClick={() => window.scrollTo({ top: 0, behavior: 'smooth' })}>Nahoru</button>\n </div>\n </div>\n </MainLayout>\n );\n }\n\n // Removed: Pro layout\n // if (false) {\n // const heroItems = [...featured, ...news].slice(0, 5);\n // return (\n // <MainLayout>\n // <div className=\"pro\">\n // {/* Fullscreen hero with numeric pagers and glow */}\n // <section className=\"pro-hero\">\n // <div className=\"slides\">\n // {heroItems.map((n, i) => (\n // <a\n // key={n.id}\n // href={`/news/${n.slug || n.id}`}\n // className={`slide ${i===proHeroIndex ? 'active' : ''}`}\n // aria-hidden={i!==proHeroIndex}\n // style={{ backgroundImage: `url(${assetUrl(n.image) || '/images/news/placeholder.jpg'})` }}\n // >\n // <div className=\"overlay\">\n // <h2 className=\"title\">{n.title}</h2>\n // </div>\n // </a>\n // ))}\n // <div className=\"glow\" aria-hidden />\n // <div className=\"pagers\">\n // {heroItems.map((_, i) => (\n // <button key={i} className={`pager ${i===proHeroIndex ? 'active' : ''}`} aria-label={`Slide ${i+1}`} onClick={()=>setProHeroIndex(i)}>{i+1}</button>\n // ))}\n // </div>\n // </div>\n // </section>\n\n // {/* Main two-column grid */}\n // <div className=\"pro-container\">\n // <section className=\"pro-grid\">\n // {/* Left column */}\n // <div className=\"col left\">\n // {/* Matches by competitions with switcher and horizontal scroller */}\n // {facrCompetitions.length > 0 && (\n // <div className=\"widget\">\n // <div className=\"head\">\n // <h3>Nejbližší zápasy</h3>\n // <div className=\"tabs\">\n // {facrCompetitions.map((c, i) => (\n // <button key={`${c.name}-${i}`} className={i===matchesTab ? 'active' : ''} onClick={() => setMatchesTab(i)}>{c.name}</button>\n // ))}\n // </div>\n // </div>\n // <div className=\"match-scroller\">\n // {(facrCompetitions[matchesTab]?.matches || []).map((m:any, idx:number) => (\n // <a key={m.id || idx} className=\"mcard\" href={m.facr_link || m.report_url || '#'} target=\"_blank\" rel=\"noopener noreferrer\">\n // <div className=\"row meta\">\n // <span>{new Date(`${m.date}T${(m.time||'00:00')}:00`).toLocaleDateString()}</span>\n // <span>•</span>\n // <span>{m.time || ''}</span>\n // </div>\n // <div className=\"row teams\">\n // <div className=\"team\">\n // <img src={assetUrl(m.home_logo_url)} alt={m.home} />\n // <span>{m.home}</span>\n // </div>\n // <span className=\"vs\">vs</span>\n // <div className=\"team\">\n // <img src={assetUrl(m.away_logo_url)} alt={m.away} />\n // <span>{m.away}</span>\n // </div>\n // </div>\n // </a>\n // ))}\n // </div>\n // <div className=\"more\"><a href=\"/kalendar\" className=\"btn\">{t('nav.all_matches')}</a></div>\n // </div>\n // )}\n\n // {/* Blogs auto scroller with arrows */}\n // <div className=\"widget\">\n // <div className=\"head\">\n // <h3>Aktuality</h3>\n // <div className=\"arrows\" aria-hidden>\n // <button className=\"prev\" aria-label=\"Zpět\" onClick={()=>{ const el = blogAutoRef.current; if (el) el.scrollBy({ left: -280, behavior: 'smooth' }); }}></button>\n // <button className=\"next\" aria-label=\"Vpřed\" onClick={()=>{ const el = blogAutoRef.current; if (el) el.scrollBy({ left: 280, behavior: 'smooth' }); }}></button>\n // </div>\n // </div>\n // <div className=\"blog-auto\" ref={blogAutoRef}>\n // {news.slice(0, 10).map((n) => (\n // <a key={n.id} href={`/news/${n.slug || n.id}`} className=\"bcard\">\n // <div className=\"thumb\" style={{ backgroundImage: `url(${assetUrl(n.image) || '/images/news/placeholder.jpg'})` }} />\n // <div className=\"meta\">\n // <div className=\"tag\">{n.category || 'Aktuality'}</div>\n // <div className=\"title\">{n.title}</div>\n // <div className=\"date\">{new Date(n.date || Date.now()).toLocaleDateString()}</div>\n // </div>\n // </a>\n // ))}\n // </div>\n // <div className=\"more\"><a href=\"/news\" className=\"btn\">Všechny aktuality</a></div>\n // </div>\n\n // {/* Standings Z V R P B with switcher */}\n // {standings.length > 0 && (\n // <div className=\"widget\">\n // <div className=\"head\">\n // <h3>Tabulky</h3>\n // <div className=\"tabs\">\n // {standings.map((s:any, i:number) => (\n // <button key={`${s.name}-${i}`} className={i===activeComp ? 'active' : ''} onClick={() => setActiveComp(i)}>{s.name || 'Soutěž'}</button>\n // ))}\n // </div>\n // </div>\n // <div className=\"table\">\n // <div className=\"thead\">\n // <span>#</span><span>Tým</span><span>Z</span><span>V</span><span>R</span><span>P</span><span>B</span>\n // </div>\n // <div className=\"tbody\">\n // {(standings[activeComp]?.table || []).map((row:any, idx:number) => (\n // <div key={idx} className=\"tr\">\n // <span>{row.position ?? idx+1}</span>\n // <span className=\"team\">{row.team?.name ?? row.team ?? '-'}</span>\n // <span>{row.played ?? row.matches ?? '-'}</span>\n // <span>{row.wins ?? row.win ?? '-'}</span>\n // <span>{row.draws ?? row.draw ?? '-'}</span>\n // <span>{row.losses ?? row.loss ?? '-'}</span>\n // <span>{row.points ?? row.pts ?? '-'}</span>\n // </div>\n // ))}\n // </div>\n // </div>\n // </div>\n // )}\n\n // {/* Sponsors belt with faded edges */}\n // <div className=\"widget\">\n // <div className=\"head\"><h3>Sponzoři</h3></div>\n // <div className=\"sponsor-belt\">\n // <div className=\"mask left\" aria-hidden />\n // <div className=\"track\">\n // {[...sponsors, ...sponsors].map((s, idx) => (\n // <a key={`${s.id}-${idx}`} className=\"tile\" href={s.url || '#'} target=\"_blank\" rel=\"noreferrer noopener\">\n // <img src={assetUrl(s.logo) || '/images/sponsors/placeholder.png'} alt={s.name} />\n // </a>\n // ))}\n // </div>\n // <div className=\"mask right\" aria-hidden />\n // </div>\n // </div>\n // </div>\n\n // {/* Right column: ticket next match */}\n // <aside className=\"col right\">\n // {(() => {\n // const comp = facrCompetitions[Math.max(0, Math.min(nextCompIdx, facrCompetitions.length - 1))];\n // const items = Array.isArray(comp?.matches) ? comp.matches : [];\n // const upcoming = items\n // .map((m: any) => ({ m, t: new Date(`${m.date}T${(m.time || '00:00')}:00`).getTime() }))\n // .filter((x: any) => !isNaN(x.t) && x.t > Date.now())\n // .sort((a: any, b: any) => a.t - b.t)[0]?.m;\n // const show = upcoming || items[0] || null;\n // const link = (show && (show.facr_link || show.report_url)) || comp?.matches_link || nextMatchLink;\n // return (\n // <div className=\"ticket\">\n // <div className=\"ticket-head\">\n // <h3>Další zápas</h3>\n // <div className=\"tabs\">\n // {facrCompetitions.map((c, i) => (\n // <button key={`${c.name}-${i}`} className={i===nextCompIdx ? 'active' : ''} onClick={() => setNextCompIdx(i)}>{c.name}</button>\n // ))}\n // </div>\n // </div>\n // <div className=\"ticket-body\">\n // <div className=\"team\">\n // <img src={assetUrl(show?.home_logo_url) || assetUrl(clubLogo) || '/images/club-logo-fallback.svg'} alt=\"Domácí\" />\n // <div className=\"name\">{show?.home || clubName}</div>\n // </div>\n // <div className=\"vs\">VS</div>\n // <div className=\"team\">\n // <img src={assetUrl(show?.away_logo_url) || '/images/club-opponent.svg'} alt=\"Hosté\" />\n // <div className=\"name\">{show?.away || 'Soupeř'}</div>\n // </div>\n // <div className=\"venue\">{show?.venue || ''}</div>\n // </div>\n // <div className=\"ticket-countdown\">{countdown || '—'}</div>\n // <div className=\"ticket-action\">\n // {link && <a className=\"btn\" href={link} target=\"_blank\" rel=\"noopener noreferrer\">Detail na FACR</a>}\n // </div>\n // </div>\n // );\n // })()}\n // </aside>\n // </section>\n // </div>\n\n // {/* Merch section (Pro) - optional via settings */}\n // <section className=\"pro-merch\" style={{ marginTop: 16, marginBottom: 16 }}>\n // <div className=\"pro-container\">\n // <MerchSection />\n // </div>\n // </section>\n // {/* Socials & Embeds */}\n // {(facebookUrl || instagramUrl || youtubeUrl || galleryUrl) && (\n // <section className=\"pro-socials\">\n // <div className=\"pro-container\">\n // <div className=\"links\">\n // {galleryUrl && (<a className=\"sbtn\" href={galleryUrl || undefined} target=\"_blank\" rel=\"noreferrer noopener\">{galleryLabel}</a>)}\n // {facebookUrl && (<a className=\"sbtn\" href={facebookUrl || undefined} target=\"_blank\" rel=\"noreferrer noopener\">Facebook</a>)}\n // {instagramUrl && (<a className=\"sbtn\" href={instagramUrl || undefined} target=\"_blank\" rel=\"noreferrer noopener\">Instagram</a>)}\n // {youtubeUrl && (<a className=\"sbtn\" href={youtubeUrl || undefined} target=\"_blank\" rel=\"noreferrer noopener\">YouTube</a>)}\n // </div>\n // {facebookUrl && (\n // <div className=\"embeds\" style={{ marginTop: 12 }}>\n // <iframe\n // title=\"Facebook Page\"\n // src={`https://www.facebook.com/plugins/page.php?href=${encodeURIComponent(facebookUrl ?? '')}&tabs=timeline&width=500&height=280&small_header=false&adapt_container_width=true&hide_cover=false&show_facepile=true`}\n // width=\"100%\"\n // height=\"280\"\n // style={{ border: 'none', overflow: 'hidden', maxWidth: 700 }}\n // scrolling=\"no\"\n // frameBorder={0}\n // allow=\"autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share\"\n // />\n // </div>\n // )}\n // </div>\n // </section>\n // )}\n\n // {/* Optional Ads row from banners with placement 'homepage_ads' */}\n // {(banners || []).some(b => b.placement === 'homepage_ads') && (\n // <section className=\"pro-ads\">\n // <div className=\"pro-container\">\n // <div className=\"ads-row\">\n // {(banners || []).filter(b => b.placement === 'homepage_ads').map((b) => (\n // <a key={b.id} className=\"ad\" href={b.url || '#'} target={b.url ? '_blank' : undefined} rel={b.url ? 'noopener noreferrer' : undefined}>\n // {/* eslint-disable-next-line jsx-a11y/alt-text */}\n // <img src={b.image} alt={b.name} />\n // </a>\n // ))}\n // </div>\n // </div>\n // </section>\n // )}\n // </div>\n // </MainLayout>\n // );\n // }\n\n return (\n <MainLayout showSponsorsSection={false}>\n <div\n className=\"container\"\n data-element=\"container\"\n data-variant={containerVariant}\n style={\n containerVariant === 'fullwidth'\n ? { maxWidth: '100%', paddingLeft: 0, paddingRight: 0, ...getStyles('container') }\n : containerVariant === 'wide'\n ? { maxWidth: '1400px', ...getStyles('container') }\n : { ...getStyles('container') }\n }\n >\n <div data-element=\"style-pack\" data-variant={stylePack} style={{ display: 'none' }} />\n \n {/* Above-hero club bar (MyUIbrix managed) */}\n {isVisible('hero-topbar', true) && (\n <section key={`hero-topbar-${refreshKey}-${getVariant('hero-topbar', 'minimal')}`} data-element=\"hero-topbar\" data-variant={getVariant('hero-topbar', 'minimal')} style={{ ...getStyles('hero-topbar') }}>\n <ClubHeroTopbar\n variant={(getVariant('hero-topbar', 'minimal') as any) as 'brand' | 'minimal' | 'badge'}\n fullBleed={getVariant('header', 'unified') === 'fullwidth'}\n />\n </section>\n )}\n {/* Header: logo + club name (legacy). Hidden when hero-topbar is visible */}\n {!isVisible('hero-topbar', true) && (\n <div className=\"home-header\">\n <TeamLogo\n teamId={settings?.club_id}\n teamName={clubName}\n facrLogo={assetUrl(clubLogo) || undefined}\n size=\"custom\"\n alt=\"Klub\"\n borderRadius=\"full\"\n style={{ width: 56, height: 56 }}\n />\n <div>\n <h1 style={{ margin: 0 }}>{clubName}</h1>\n <div className=\"subtitle\" style={{ fontSize: '0.95rem' }}>{t('homepage.official_website')}</div>\n </div>\n </div>\n )}\n\n {/* Hero section: variant controlled by MyUIbrix (getVariant) or fallback to settings.hero_style */}\n {getVariant('hero', heroStyle) === 'grid' && isVisible('hero', true) && (\n <section key={`hero-grid-${refreshKey}`} data-element=\"hero\" data-variant={getVariant('hero', heroStyle)} className=\"hero-grid\" style={{ position: 'relative', ...getStyles('hero') }}>\n {featured[0] ? (\n <a href={`/news/${featured[0].slug || featured[0].id}`} className=\"hero-card big\" style={{ textDecoration: 'none' }}>\n <div className=\"bg\" style={{ backgroundImage: `url(${assetUrl(featured[0].image) || '/images/news/placeholder.jpg'})` }} />\n <div className=\"overlay\">\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', opacity: 0.9, fontSize: '0.8rem', color: '#ffffff' }}>\n <span>{featured[0].category || t('homepage.latest_news')}</span>\n {typeof featured[0].readTime === 'number' && featured[0].readTime > 0 && (\n <span>{featured[0].readTime} {t('common.read_time')}</span>\n )}\n </div>\n <h2 style={{ margin: '4px 0 0 0', color: '#ffffff' }}>{featured[0].title}</h2>\n </div>\n </a>\n ) : (\n isLoading ? (\n <div className=\"hero-card big skeleton\" style={{ borderRadius: 16 }} />\n ) : (\n <a href=\"/news\" className=\"hero-card big\" style={{ textDecoration: 'none' }}>\n <div className=\"bg\" style={{ backgroundImage: `url('/images/news/placeholder.jpg')` }} />\n <div className=\"overlay\">\n <div style={{ opacity: 0.9, fontSize: '0.8rem', color: '#ffffff' }}>{t('homepage.latest_news')}</div>\n <h2 style={{ margin: '4px 0 0 0', color: '#ffffff' }}>{t('homepage.latest_title')}</h2>\n </div>\n </a>\n )\n )}\n <div className=\"small-col\">\n {featured.slice(1, 3).map((n, idx) => (\n <a key={n.id} href={`/news/${n.slug || n.id}`} className=\"hero-card small\" style={{ textDecoration: 'none' }}>\n <div className=\"bg\" style={{ backgroundImage: `url(${assetUrl(n.image) || '/images/news/placeholder.jpg'})` }} />\n <div className=\"overlay\">\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', opacity: 0.9, fontSize: '0.8rem', color: '#ffffff' }}>\n <span>{n.category || t('homepage.latest_news')}</span>\n {typeof n.readTime === 'number' && n.readTime > 0 && (\n <span>{n.readTime} {t('common.read_time')}</span>\n )}\n </div>\n <h3 style={{ margin: '4px 0 0 0', color: '#ffffff' }}>{n.title}</h3>\n </div>\n </a>\n ))}\n {Array.from({ length: Math.max(0, 2 - Math.min(2, Math.max(0, featured.length - 1))) }).map((_, idx) => (\n isLoading ? (\n <div key={`placeholder-${idx}`} className=\"hero-card small skeleton\" style={{ borderRadius: 16 }} />\n ) : (\n <a key={`placeholder-${idx}`} href=\"/news\" className=\"hero-card small\" style={{ textDecoration: 'none' }}>\n <div className=\"bg\" style={{ backgroundImage: `url('/images/news/placeholder.jpg')`, filter: 'grayscale(50%) brightness(0.7)' }} />\n <div className=\"overlay\">\n <div style={{ opacity: 0.8, fontSize: '0.8rem', color: '#fff' }}>{t('homepage.latest_news')}</div>\n <h3 style={{ margin: '4px 0 0 0', color: '#fff' }}>{t('message.loading')}</h3>\n </div>\n </a>\n )\n ))}\n </div>\n </section>\n )}\n {/* Banner: homepage_middle */}\n {(banners || []).some(b => b.placement === 'homepage_middle') && isVisible('banner', true) && (\n <section data-element=\"banner\" data-variant={getVariant('banner', 'top')} className=\"banner banner-middle\" style={{ margin: '24px 0', textAlign: 'center', ...getStyles('banner') }}>\n {(banners || []).filter(b => b.placement === 'homepage_middle').map((b) => (\n <a key={b.id} href={b.url || '#'} target={b.url ? '_blank' : undefined} rel={b.url ? 'noopener noreferrer' : undefined} style={{ display: 'inline-block', margin: 8 }}>\n {/* eslint-disable-next-line jsx-a11y/alt-text */}\n <img loading=\"lazy\" decoding=\"async\" src={b.image} alt={b.name} style={{ maxWidth: '100%', width: b.width ? `${b.width}px` : undefined, height: b.height ? `${b.height}px` : 'auto' }} />\n </a>\n ))}\n </section>\n )}\n\n {/* Featured articles are now shown in the hero grid above, not here */}\n\n \n {getVariant('hero', heroStyle) === 'scroller' && isVisible('hero', true) && (\n <section key={`hero-scroller-${refreshKey}`} data-element=\"hero\" data-variant={getVariant('hero', heroStyle)} style={{ position: 'relative', ...getStyles('hero') }}>\n <Suspense fallback={<div style={{ minHeight: 240 }} />}> \n <BlogCardsScroller />\n </Suspense>\n </section>\n )}\n {(getVariant('hero', heroStyle) === 'swiper' || getVariant('hero', heroStyle) === 'swiper_full') && isVisible('hero', true) && (\n <section\n key={`hero-swiper-${refreshKey}`}\n data-element=\"hero\"\n data-variant={getVariant('hero', heroStyle)}\n style={{ position: 'relative', ...getStyles('hero') }}\n >\n <Suspense fallback={<div style={{ minHeight: 280 }} />}> \n <BlogSwiper fallbackArticles={heroFallbackArticles} />\n </Suspense>\n </section>\n )}\n\n {/* Next match: categories (competitions) with left/right navigation - synced with matchesTab */}\n {isVisible('matches', true) ? (\n facrCompetitions.length > 0 ? (\n (() => {\n // Only render when the currently selected competition has an upcoming match\n if (upcomingCompIndices.length === 0) return null;\n const effectiveIndex = Math.max(0, Math.min(matchesTab, facrCompetitions.length - 1));\n const comp = facrCompetitions[effectiveIndex];\n const items = Array.isArray(comp?.matches) ? comp.matches : [];\n const upcoming = items\n .map((m: any) => ({ m, t: new Date(`${m.date}T${(m.time || '00:00')}:00`).getTime() }))\n .filter((x: any) => !isNaN(x.t) && x.t > Date.now())\n .sort((a: any, b: any) => a.t - b.t)[0]?.m;\n if (!upcoming) return null;\n const show = upcoming;\n const link = (show && (show.facr_link || show.report_url)) || comp?.matches_link || nextMatchLink;\n // Compute prev/next among competitions that actually have upcoming matches\n const pos = upcomingCompIndices.indexOf(effectiveIndex);\n const prevIdx = upcomingCompIndices[(Math.max(0, pos) - 1 + upcomingCompIndices.length) % upcomingCompIndices.length];\n const nextIdx = upcomingCompIndices[(Math.max(0, pos) + 1) % upcomingCompIndices.length];\n const handleNextMatchClick = () => {\n if (show) {\n setSelectedMatch({\n ...show,\n competition: comp?.name,\n });\n setIsMatchModalOpen(true);\n } else if (link) {\n window.open(link, '_blank', 'noopener,noreferrer');\n }\n };\n\n return (\n <NextMatch\n data={show}\n competitionName={comp?.name}\n countdown={countdown}\n onPrev={() => { setNextCompIdx(prevIdx); setMatchesTab(prevIdx); }}\n onNext={() => { setNextCompIdx(nextIdx); setMatchesTab(nextIdx); }}\n onOpen={handleNextMatchClick}\n elementProps={{\n 'data-element': 'matches' as any,\n 'data-variant': getVariant('matches', 'compact') as any,\n 'aria-live': 'polite' as any,\n style: { ...getStyles('matches') },\n }}\n />\n );\n })()\n ) : (\n (() => {\n // Fallback without FACR: show only if there is an upcoming match in the fallback list\n if (!matches || matches.length === 0) return null;\n const future = matches\n .map((m: any) => ({ m, t: new Date(`${m.date}T${(m.time || '00:00')}:00`).getTime() }))\n .filter((x: any) => !isNaN(x.t) && x.t > Date.now())\n .sort((a: any, b: any) => a.t - b.t);\n const next = future[0]?.m;\n if (!next) return null;\n return (\n <div className=\"card\">\n <NextMatch\n key={`matches-${refreshKey}-${getVariant('matches', 'compact')}`}\n data={{\n home: next?.homeTeam || clubName,\n home_logo_url: next?.homeLogoURL || clubLogo,\n away: next?.awayTeam || 'Soupeř',\n away_logo_url: next?.awayLogoURL,\n }}\n countdown={countdown}\n elementProps={{ 'data-element': 'matches', 'data-variant': getVariant('matches', 'compact'), 'aria-live': 'polite', style: { position: 'relative', ...getStyles('matches') } }}\n />\n </div>\n );\n })()\n )\n ) : null}\n\n {/* Sweepstakes / Lottery widget (visible around matches section) */}\n <SweepstakeWidget />\n\n {/* (Removed) Full-bleed top banner (homepage_top) */}\n\n {/* Matches slider with scores by competition (moved after news+tables) */}\n {facrCompetitions.length > 0 && (\n defer ? (\n <Suspense fallback={null}>\n <MatchesSlider\n key={`matches-slider-${refreshKey}-${getVariant('matches-slider', 'carousel')}`}\n comps={facrCompetitions as any}\n activeIndex={matchesTab}\n onActiveChange={setMatchesTab}\n onMatchClick={(m: any, compName?: string) => {\n setSelectedMatch({ ...m, competition: compName, competitionName: compName });\n setIsMatchModalOpen(true);\n }}\n variant={getVariant('matches-slider', 'carousel') as any}\n elementProps={{ 'data-element': 'matches-slider', 'data-variant': getVariant('matches-slider', 'carousel'), style: { position: 'relative', ...getStyles('matches-slider') } }}\n />\n </Suspense>\n ) : null\n )}\n \n {facrCompetitions.length === 0 && isLoading && (\n <section data-element=\"matches-slider\" data-variant={getVariant('matches-slider', 'carousel')} aria-label=\"Zápasy\" style={{ position: 'relative', contentVisibility: 'auto' as any, containIntrinsicSize: '280px', ...getStyles('matches-slider') }}>\n <div className=\"section-head\" style={{ marginTop: 16, marginBottom: 16 }}>\n <h3>{t('nav.matches')}</h3>\n <a href=\"/kalendar\" className=\"see-all\">{t('nav.all_matches')}</a>\n </div>\n <div style={{ display: 'flex', gap: 18, overflow: 'hidden', padding: '8px 2px 16px 2px' }}>\n {[1,2,3].map((i) => (\n <div key={i} className=\"card skeleton\" style={{ minWidth: 340, height: 160, borderRadius: 12 }} />\n ))}\n </div>\n </section>\n )}\n\n {/* News + Tables: split into two independent sections */}\n {(() => {\n // Compute matching standings for the selected competition\n const currentCompetition = facrCompetitions[matchesTab];\n const currentCompetitionName = currentCompetition?.name || '';\n const matchingStanding = standings.find((s: any) => s.name === currentCompetitionName);\n const hasStandingsForCurrentTab = !!matchingStanding && (\n (matchingStanding.table && matchingStanding.table.length > 0) ||\n (matchingStanding.rows && matchingStanding.rows.length > 0)\n );\n\n const newsVariant = getVariant('news', 'grid_one');\n const showNews = isVisible('news', true);\n let showTable = isVisible('table', true) && hasStandingsForCurrentTab;\n if (newsVariant === 'grid_one') { showTable = false; }\n const variant = showNews && showTable ? undefined : 'standard';\n if (!showNews && !showTable) return null;\n\n return (\n <section\n key={`news-table-${refreshKey}-${newsVariant}-${getVariant('table', 'split_news')}`}\n className=\"standings\"\n data-variant={variant}\n style={{ marginTop: 32 }}\n >\n {showNews && (\n <section key={`news-${refreshKey}-${newsVariant}`} data-element=\"news\" data-variant={newsVariant} className=\"news-list\" aria-labelledby=\"home-news-heading\" style={{ ...getStyles('news'), contentVisibility: 'auto' as any, containIntrinsicSize: '600px' }}>\n <div className=\"section-head\" style={{ marginTop: 0 }}>\n <h3 id=\"home-news-heading\">{t('homepage.more_articles_home')}</h3>\n <a href=\"/news\" className=\"see-all\" style={{ fontSize: '0.85rem' }}>{t('nav.view_all')} <FiArrowRight size={14} /></a>\n </div>\n {newsVariant === 'scroller' ? (\n <BlogCardsScroller />\n ) : (\n isLoading && (!news || (news as any).length === 0) ? (\n <div className=\"blog-list\">\n {[1,2,3,4].map(i => (\n <div key={i} className=\"card skeleton\" style={{ height: 96, borderRadius: 12 }} />\n ))}\n </div>\n ) : (\n <NewsList items={news as any} />\n )\n )}\n </section>\n )}\n\n {showTable && (\n <div key={`table-${refreshKey}-${getVariant('table', 'split_news')}`} data-element=\"table\" data-variant={getVariant('table', 'split_news')} role=\"region\" aria-labelledby=\"home-table-heading\" style={{ ...getStyles('table'), contentVisibility: 'auto' as any, containIntrinsicSize: '520px' }}>\n <div className=\"section-head\" style={{ marginTop: 0, marginBottom: 12 }}>\n <h3 id=\"home-table-heading\">{t('homepage.tables')}</h3>\n <a href=\"/tabulky\" className=\"see-all\" style={{ fontSize: '0.85rem' }}>{t('nav.view_all')} <FiArrowRight size={14} /></a>\n </div>\n {defer ? (\n <Suspense fallback={null}>\n <StandingsCard\n variant={((): 'logos'|'plain' => { const v = getVariant('table_rows', 'logos'); return v === 'plain' ? 'plain' : 'logos'; })()}\n rows={(matchingStanding?.table || matchingStanding?.rows || []) as any}\n onRowClick={(row) => {\n const clubData = {\n team: (row as any).team?.name ?? (row as any).team ?? (row as any).club ?? '-',\n team_id: (row as any).team_id || '',\n team_logo_url: (row as any).team_logo_url,\n rank: (row as any).position ?? (row as any).pos ?? (row as any).rank ?? 0,\n played: (row as any).played ?? (row as any).matches ?? '-',\n wins: (row as any).wins ?? (row as any).win ?? '-',\n draws: (row as any).draws ?? (row as any).draw ?? '-',\n losses: (row as any).losses ?? (row as any).loss ?? '-',\n score: (row as any).score ?? '-',\n points: (row as any).points ?? (row as any).pts ?? '-',\n };\n setSelectedClub(clubData);\n setIsModalOpen(true);\n }}\n />\n </Suspense>\n ) : (\n <div className=\"table-card\">\n <div className=\"standings\">\n {[1,2,3,4,5,6,7,8].map(i => (\n <div key={i} className=\"standing-row skeleton\" style={{ borderRadius: 12 }} />\n ))}\n </div>\n </div>\n )}\n {/* Banners under the table, inside the table column */}\n {(banners || []).some(b => b.placement === 'homepage_under_table') && (\n defer ? (\n <Suspense fallback={null}>\n <BannerDisplay banners={banners as any} placement=\"homepage_under_table\" />\n </Suspense>\n ) : null\n )}\n </div>\n )}\n </section>\n );\n })()}\n\n {/* (Moved) Banner under tables now renders inside the table column above */}\n\n {/* Competition tables moved into right column below */}\n \n {isVisible('activities', true) && !activitiesLoaded && (\n <section data-element=\"activities\" data-variant={getVariant('activities', 'list')} aria-labelledby=\"home-activities-heading\" style={{ marginTop: 32, marginBottom: 16, position: 'relative', contentVisibility: 'auto' as any, containIntrinsicSize: '600px', ...getStyles('activities') }}>\n <div style={{ maxWidth: 1200, margin: '0 auto', padding: '0 12px' }}>\n <div className=\"section-head\" style={{ marginTop: 0 }}>\n <h3 id=\"home-activities-heading\">{t('nav.activities')}</h3>\n <a href=\"/aktivity\" className=\"see-all\">{t('nav.view_all')} <FiArrowRight /></a>\n </div>\n <div style={{ display: 'grid', gridTemplateColumns: '1fr', gap: 12 }}>\n {[1,2,3].map(i => (\n <div key={i} className=\"card skeleton\" style={{ height: 120, borderRadius: 12 }} />\n ))}\n </div>\n </div>\n </section>\n )}\n\n {upcomingEvents.length > 0 && isVisible('activities', true) && (\n <section key={`activities-${refreshKey}-${getVariant('activities', 'list')}`} data-element=\"activities\" data-variant={getVariant('activities', 'list')} aria-labelledby=\"home-activities-heading\" style={{ marginTop: 32, marginBottom: 16, position: 'relative', contentVisibility: 'auto' as any, containIntrinsicSize: '600px', ...getStyles('activities') }}>\n <div style={{ maxWidth: 1200, margin: '0 auto', padding: '0 12px' }}>\n <div className=\"section-head\" style={{ marginTop: 0 }}>\n <h3 id=\"home-activities-heading\">{t('nav.activities')}</h3>\n <a href=\"/aktivity\" className=\"see-all\">{t('nav.view_all')} <FiArrowRight /></a>\n </div>\n <ActivitiesList items={upcomingEvents as any} />\n </div>\n </section>\n )}\n\n {/* Players scroller */}\n \n {isVisible('team', false) && players.length === 0 && isLoading && (\n <section\n data-element=\"team\"\n data-variant={getVariant('team', 'grid')}\n className=\"players-scroller\"\n aria-labelledby=\"home-players-heading\"\n style={{\n marginTop: 32,\n position: 'relative',\n contentVisibility: 'auto' as any,\n containIntrinsicSize: '600px',\n ...getStyles('team'),\n }}\n >\n <div style={{ maxWidth: 1200, margin: '0 auto', padding: '0 12px' }}>\n <div className=\"section-head\">\n <h3 id=\"home-players-heading\">Hráči</h3>\n <a href=\"/players\" className=\"see-all\">\n {t('nav.view_all')} <FiArrowRight />\n </a>\n </div>\n <div className=\"scroll-x\">\n {[1, 2, 3, 4, 5, 6].map((i) => (\n <div\n key={i}\n className=\"player-card skeleton\"\n style={{ width: 170, height: 210, borderRadius: 14 }}\n />\n ))}\n </div>\n </div>\n </section>\n )}\n\n {players.length > 0 && isVisible('team', false) && (\n <section\n key={`team-${refreshKey}-${getVariant('team', 'grid')}`}\n data-element=\"team\"\n data-variant={getVariant('team', 'grid')}\n className=\"players-scroller\"\n aria-labelledby=\"home-players-heading\"\n style={{\n marginTop: 32,\n position: 'relative',\n contentVisibility: 'auto' as any,\n containIntrinsicSize: '600px',\n ...getStyles('team'),\n }}\n >\n <div style={{ maxWidth: 1200, margin: '0 auto', padding: '0 12px' }}>\n <div className=\"section-head\">\n <h3 id=\"home-players-heading\">Hráči</h3>\n <a href=\"/players\" className=\"see-all\">\n {t('nav.view_all')} <FiArrowRight />\n </a>\n </div>\n <div className=\"scroll-x\">\n {players.map((p) => (\n <a\n key={p.id}\n href={p.slug ? `/players/${p.slug}` : `/players/${p.id}`}\n className=\"player-card card\"\n style={{ opacity: p.active === false ? 0.6 : 1 }}\n >\n <div\n className=\"photo\"\n style={{ backgroundImage: `url(${assetUrl(p.image) || p.image})` }}\n />\n <div className=\"meta\">\n {typeof p.number !== 'undefined' ? (\n <>\n <span className=\"nr\">#{p.number}</span> {p.name}\n </>\n ) : (\n p.name\n )}\n </div>\n <div className=\"pos\">{p.position}</div>\n </a>\n ))}\n </div>\n </div>\n </section>\n )}\n\n {/* Gallery */}\n {isVisible('gallery', true) && (\n <section key={`gallery-${refreshKey}-${getVariant('gallery', 'grid')}`} data-element=\"gallery\" data-variant={getVariant('gallery', 'grid')} aria-labelledby=\"home-gallery-heading\" style={{ marginTop: 32, marginBottom: 32, position: 'relative', contentVisibility: 'auto' as any, containIntrinsicSize: '700px', ...getStyles('gallery') }}>\n <div style={{ maxWidth: 1200, margin: '0 auto', padding: '0 12px' }}>\n {defer ? (\n <Suspense fallback={null}>\n <GallerySection zoneramaUrl={galleryUrl} />\n </Suspense>\n ) : null}\n </div>\n </section>\n )}\n\n {/* Videos */}\n {isVisible('videos', false) && (\n <section key={`videos-${refreshKey}-${getVariant('videos', 'carousel')}`} data-element=\"videos\" data-variant={getVariant('videos', 'carousel')} aria-labelledby=\"home-videos-heading\" style={{ marginTop: 32, marginBottom: 32, position: 'relative', contentVisibility: 'auto' as any, containIntrinsicSize: '700px', ...getStyles('videos') }}>\n <div style={{ maxWidth: 1200, margin: '0 auto', padding: '0 12px' }}>\n {defer ? (\n <Suspense fallback={null}>\n <VideosSection\n key={`videos-comp-${refreshKey}-${getVariant('videos', 'carousel')}`}\n variant={(getVariant('videos', 'carousel') as any) as 'grid' | 'carousel'}\n />\n </Suspense>\n ) : (\n <>\n <div className=\"section-head\">\n <h3 id=\"home-videos-heading\">Videa</h3>\n <a href=\"/videa\" className=\"see-all\">{t('videos.more_videos', { defaultValue: 'More videos' })}</a>\n </div>\n <div style={{ display: 'grid', gridTemplateColumns: '1fr', gap: 12 }}>\n {[1,2,3].map((i) => (\n <div key={i} className=\"card skeleton\" style={{ height: 240, borderRadius: 12 }} />\n ))}\n </div>\n </>\n )}\n </div>\n </section>\n )}\n\n {isVisible('merch', true) && (\n <section key={`merch-${refreshKey}-${getVariant('merch', 'grid')}`} data-element=\"merch\" data-variant={getVariant('merch', 'grid')} aria-labelledby=\"home-merch-heading\" style={{ marginTop: 24, marginBottom: 24, position: 'relative', contentVisibility: 'auto' as any, containIntrinsicSize: '600px', ...getStyles('merch') }}>\n <div style={{ maxWidth: 1200, margin: '0 auto', padding: '0 12px' }}>\n {defer ? (\n <Suspense fallback={null}>\n <MerchSection variant={(getVariant('merch', 'grid') as any) as 'grid' | 'carousel' | 'featured' | 'list'} />\n </Suspense>\n ) : (\n <>\n <div className=\"section-head\">\n <h3 id=\"home-merch-heading\">Oblečení týmu</h3>\n <a href=\"/obleceni\" className=\"see-all\">{t('nav.view_all')}</a>\n </div>\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr 1fr', gap: 12 }}>\n {[1,2,3,4,5].map((i) => (\n <div key={i} className=\"card skeleton\" style={{ height: 180, borderRadius: 12 }} />\n ))}\n </div>\n </>\n )}\n </div>\n </section>\n )}\n\n {/* Polls / Voting */}\n {isVisible('poll', false) && (\n <section key={`poll-${refreshKey}-${getVariant('poll', 'vertical')}`} data-element=\"poll\" data-variant={getVariant('poll', 'vertical')} aria-label=\"Anketa\" style={{ marginTop: 32, marginBottom: 32, position: 'relative', contentVisibility: 'auto' as any, containIntrinsicSize: '500px', ...getStyles('poll') }}>\n <div style={{ maxWidth: 1200, margin: '0 auto', padding: '0 12px' }}>\n {defer ? (\n <Suspense fallback={null}>\n <PollsWidget featuredOnly={false} maxPolls={1} title=\"Anketa\" />\n </Suspense>\n ) : (\n <div className=\"card skeleton\" style={{ height: 320, borderRadius: 12 }} />\n )}\n </div>\n </section>\n )}\n\n {/* Banner: homepage_footer */}\n {(banners || []).some(b => b.placement === 'homepage_footer') && (\n <section data-element=\"banner\" data-variant={getVariant('banner', 'bottom')} className=\"banner banner-footer\" style={{ margin: '24px 0', textAlign: 'center', ...getStyles('banner') }}>\n {(banners || []).filter(b => b.placement === 'homepage_footer').map((b) => (\n <a key={b.id} href={b.url || '#'} target={b.url ? '_blank' : undefined} rel={b.url ? 'noopener noreferrer' : undefined} style={{ display: 'inline-block', margin: 8 }}>\n {/* eslint-disable-next-line jsx-a11y/alt-text */}\n <img loading=\"lazy\" decoding=\"async\" src={b.image} alt={b.name} style={{ maxWidth: '100%', width: b.width ? `${b.width}px` : undefined, height: b.height ? `${b.height}px` : 'auto' }} />\n </a>\n ))}\n </section>\n )}\n\n {/* CTA (Newsletter) moved up */}\n {isVisible('newsletter', false) && (\n <section key={`newsletter-${refreshKey}-${getVariant('newsletter', 'default')}`} data-element=\"newsletter\" data-variant={getVariant('newsletter', 'default')} className=\"newsletter-cta\" aria-label=\"Přihlášení k newsletteru\" style={{ marginTop: 24, marginBottom: 24, position: 'relative', contentVisibility: 'auto' as any, containIntrinsicSize: '420px', ...getStyles('newsletter') }}>\n <div className=\"card\" style={{ maxWidth: 960, margin: '0 auto' }}>\n {defer ? (\n <Suspense fallback={null}>\n <NewsletterSubscribe />\n </Suspense>\n ) : (\n <div className=\"skeleton\" style={{ height: 280, borderRadius: 12 }} />\n )}\n </div>\n </section>\n )}\n\n {/* Sponsors: MyUIbrix-controlled variant (grid | slider | scroller | logos3 | pyramid); dark theme supported; full-bleed */}\n {isVisible('sponsors', true) && (\n (() => {\n const variant = (getVariant('sponsors', sponsorLayout) as any) as 'grid' | 'slider' | 'scroller' | 'logos3' | 'pyramid';\n const all = sponsors || [];\n const general = all.filter((s: any) => String(s.tier || '').toLowerCase() === 'general' || String(s.tier || '').toLowerCase() === 'title' || String(s.tier || '').toLowerCase() === 'main');\n const standard = all.filter((s: any) => !(String(s.tier || '').toLowerCase() === 'general' || String(s.tier || '').toLowerCase() === 'title' || String(s.tier || '').toLowerCase() === 'main'));\n const ordered = [...general, ...standard];\n\n const renderPyramid = () => {\n const capacities = [1, 4, 8, 12, 16];\n const takeRows = (items: typeof ordered) => {\n const rows: Array<typeof ordered> = [];\n let idx = 0;\n for (let capIndex = 0; idx < items.length && capIndex < capacities.length; capIndex++) {\n const cap = capacities[capIndex];\n rows.push(items.slice(idx, idx + cap));\n idx += cap;\n }\n // If still remaining, continue with last capacity repeated\n const lastCap = capacities[capacities.length - 1];\n while (idx < items.length) {\n rows.push(items.slice(idx, idx + lastCap));\n idx += lastCap;\n }\n return rows;\n };\n const generalRows = takeRows(general);\n const standardRows = takeRows(standard);\n\n return (\n <div className=\"pyramid\">\n {generalRows.map((row, i) => (\n <div key={`gen-${i}`} className=\"pyramid-row\" style={{ display: 'grid', gridTemplateColumns: `repeat(${Math.max(1, row.length)}, 1fr)`, gap: 16, marginBottom: 12 }}>\n {row.map((s) => (\n <a key={`g-${s.id}`} className=\"sponsor-tile\" href={s.url || '#'} target=\"_blank\" rel=\"noreferrer noopener\">\n <img src={assetUrl(s.logo) || '/images/sponsors/placeholder.png'} alt={s.name} />\n </a>\n ))}\n </div>\n ))}\n {generalRows.length > 0 && standardRows.length > 0 && <div className=\"divider\" aria-hidden />}\n {standardRows.map((row, i) => (\n <div key={`std-${i}`} className=\"pyramid-row\" style={{ display: 'grid', gridTemplateColumns: `repeat(${Math.max(1, row.length)}, 1fr)`, gap: 16, marginBottom: 12 }}>\n {row.map((s) => (\n <a key={`s-${s.id}`} className=\"sponsor-tile\" href={s.url || '#'} target=\"_blank\" rel=\"noreferrer noopener\">\n <img src={assetUrl(s.logo) || '/images/sponsors/placeholder.png'} alt={s.name} />\n </a>\n ))}\n </div>\n ))}\n </div>\n );\n };\n\n return (\n <section\n data-element=\"sponsors\"\n data-variant={variant}\n className={`sponsors ${sponsorsTheme === 'dark' ? 'dark' : ''}`}\n aria-labelledby=\"home-sponsors-heading\"\n style={{\n width: '100vw',\n position: 'relative',\n left: '50%',\n right: '50%',\n transform: 'translateX(-50%)',\n paddingLeft: 'max(16px, calc((100vw - 1200px) / 2))',\n paddingRight: 'max(16px, calc((100vw - 1200px) / 2))',\n boxSizing: 'border-box',\n contentVisibility: 'auto' as any,\n containIntrinsicSize: '520px',\n ...getStyles('sponsors')\n }}\n >\n <div className=\"section-head\">\n <h3 id=\"home-sponsors-heading\">{t('nav.sponsors')}</h3>\n </div>\n {isLoading && ordered.length === 0 && (\n <div className=\"sponsors-grid\">\n {[1,2,3,4,5,6,7,8].map(i => (\n <div key={i} className=\"sponsor-tile skeleton\" style={{ minHeight: 90, borderRadius: 12 }} />\n ))}\n </div>\n )}\n {variant === 'grid' && (\n <>\n {general.length > 0 && (\n <div className=\"title-sponsor\">\n {general.map((g) => (\n <a key={`g-${g.id}`} className=\"sponsor-tile\" href={g.url || '#'} target=\"_blank\" rel=\"noreferrer noopener\">\n <img loading=\"lazy\" decoding=\"async\" src={assetUrl(g.logo) || '/images/sponsors/placeholder.png'} alt={g.name} />\n </a>\n ))}\n </div>\n )}\n {(general.length > 0 && standard.length > 0) && <div className=\"divider\" aria-hidden />}\n <div className=\"sponsors-grid\">\n {(standard.length > 0 ? standard : (general.length === 0 ? ordered : [])).map((s) => (\n <a key={s.id} className=\"sponsor-tile\" href={s.url || '#'} target=\"_blank\" rel=\"noreferrer noopener\">\n <img loading=\"lazy\" decoding=\"async\" src={assetUrl(s.logo) || '/images/sponsors/placeholder.png'} alt={s.name} />\n </a>\n ))}\n </div>\n </>\n )}\n {variant === 'pyramid' && renderPyramid()}\n {variant === 'slider' && (\n <div className=\"sponsors-slider\">\n <div className=\"track\">\n {[...ordered, ...ordered].map((s, idx) => (\n <a key={`${s.id}-${idx}`} className=\"sponsor-tile\" href={s.url || '#'} target=\"_blank\" rel=\"noreferrer noopener\">\n <img loading=\"lazy\" decoding=\"async\" src={assetUrl(s.logo) || '/images/sponsors/placeholder.png'} alt={s.name} />\n </a>\n ))}\n </div>\n </div>\n )}\n {(variant === 'scroller' || variant === 'logos3') && (\n <div className={`sponsors-scroller${variant === 'logos3' ? ' sponsors-scroller-logos3' : ''}`}>\n <div className=\"belt\">\n {[...ordered, ...ordered, ...ordered].map((s, idx) => (\n <a key={`${s.id}-${idx}`} className=\"sponsor-tile\" href={s.url || '#'} target=\"_blank\" rel=\"noreferrer noopener\">\n <img loading=\"lazy\" decoding=\"async\" src={assetUrl(s.logo) || '/images/sponsors/placeholder.png'} alt={s.name} />\n </a>\n ))}\n </div>\n </div>\n )}\n </section>\n );\n })()\n )}\n </div>\n <ClubModal\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n club={selectedClub}\n clubType={(settings?.club_type as 'football' | 'futsal') || 'football'}\n />\n <MatchModal\n isOpen={isMatchModalOpen}\n onClose={() => setIsMatchModalOpen(false)}\n match={selectedMatch}\n onTeamClick={(teamName, teamLogoUrl) => {\n // Optional: could open club modal when clicking team in match modal\n console.log('Team clicked:', teamName);\n }}\n />\n {isEditingMode ? (\n <Suspense fallback={null}>\n <MyUIbrixErrorBoundary>\n <MyUIbrixStyleEditor pageType=\"homepage\" />\n </MyUIbrixErrorBoundary>\n </Suspense>\n ) : null}\n {user?.role === 'admin' && !isEditingMode ? (\n <div style={{ position: 'fixed', left: 16, bottom: 16, zIndex: 10000 }}>\n <Tooltip label=\"Aktivovat MyUIbrix Editor\" placement=\"right\">\n <IconButton\n aria-label=\"Upravit stránku\"\n icon={<FiEdit />}\n colorScheme=\"blue\"\n size=\"lg\"\n borderRadius=\"full\"\n onClick={() => {\n try {\n const url = new URL(window.location.href);\n url.searchParams.set('myuibrix', 'edit');\n window.history.replaceState({}, '', url.toString());\n } catch {}\n try { document.body.classList.add('myuibrix-edit-mode'); } catch {}\n setIsEditingMode(true);\n }}\n />\n </Tooltip>\n </div>\n ) : null}\n </MainLayout>\n );\n};\n\nfunction czYears(n: number): string {\n if (n === 1) return 'rok';\n if (n >= 2 && n <= 4) return 'roky';\n return 'let';\n}\n\nexport default HomePage;\n","import React from 'react';\nimport { useParams, Link as RouterLink } from 'react-router-dom';\nimport { useQuery } from '@tanstack/react-query';\nimport { getPlayer } from '../services/public';\nimport { assetUrl } from '../utils/url';\nimport { Box, Badge, Button, Container, Divider, Heading, HStack, Image, SimpleGrid, Skeleton, Stack, Text, VStack, useColorModeValue, AspectRatio, Tabs, TabList, TabPanels, TabPanel, Tab, Stat, StatLabel, StatNumber } from '@chakra-ui/react';\nimport MainLayout from '../components/layout/MainLayout';\nimport NewsletterCTA from '../components/common/NewsletterCTA';\nimport { translateNationality, getCountryFlag } from '../utils/nationality';\n\nconst PlayerDetailPage: React.FC = () => {\n const { id } = useParams<{ id: string }>();\n const { data, isLoading, isError } = useQuery({ queryKey: ['player', id], queryFn: () => getPlayer(String(id)) });\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n\n if (isLoading) {\n return (\n <MainLayout>\n <Container maxW=\"7xl\" py={8}>\n <Skeleton height=\"320px\" />\n </Container>\n </MainLayout>\n );\n }\n\n\n\n if (isError || !data) {\n return (\n <MainLayout>\n <Container maxW=\"7xl\" py={8}>\n <Text color=\"red.500\">Hráče se nepodařilo načíst.</Text>\n </Container>\n </MainLayout>\n );\n }\n\n const fullName = [data.first_name, data.last_name].filter(Boolean).join(' ');\n const age = data.date_of_birth ? calculateAge(data.date_of_birth) : null;\n const hasContact = Boolean(data.email || data.phone);\n\n return (\n <MainLayout>\n <Box>\n <Container maxW=\"7xl\" py={{ base: 6, md: 10 }}>\n <VStack align=\"stretch\" spacing={6}>\n <HStack justify=\"space-between\">\n <HStack spacing={3}>\n <Heading as=\"h1\" size={{ base: 'xl', md: '2xl' }}>{fullName}</Heading>\n {typeof data.jersey_number === 'number' && (\n <Badge colorScheme=\"blue\" fontSize=\"md\" px={3} py={1}>#{data.jersey_number}</Badge>\n )}\n {data.position && (\n <Badge variant=\"subtle\" colorScheme=\"purple\" fontSize=\"md\" px={3} py={1}>{data.position}</Badge>\n )}\n {!data.is_active && (\n <Badge colorScheme=\"gray\" fontSize=\"md\" px={3} py={1}>Neaktivní</Badge>\n )}\n </HStack>\n <Button as={RouterLink} to=\"/hraci\" variant=\"outline\">Zpět na přehled</Button>\n </HStack>\n\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={6}>\n <Box>\n <AspectRatio ratio={3/4}>\n <Image\n src={assetUrl(data.image_url) || '/logo512.png'}\n alt={fullName}\n borderRadius=\"lg\"\n objectFit=\"cover\"\n w=\"100%\"\n />\n </AspectRatio>\n </Box>\n <Stack spacing={5} bg={cardBg} borderWidth=\"1px\" borderColor={borderColor} borderRadius=\"lg\" p={6} shadow=\"sm\">\n <SimpleGrid columns={{ base: 2, md: 4 }} spacing={4}>\n <Box borderWidth=\"1px\" borderColor={borderColor} borderRadius=\"md\" p={4} textAlign=\"center\">\n <Stat>\n <StatLabel>Věk</StatLabel>\n <StatNumber>{age != null ? age : '—'}</StatNumber>\n </Stat>\n </Box>\n <Box borderWidth=\"1px\" borderColor={borderColor} borderRadius=\"md\" p={4} textAlign=\"center\">\n <Stat>\n <StatLabel>Výška</StatLabel>\n <StatNumber>{data.height ? `${data.height} cm` : '—'}</StatNumber>\n </Stat>\n </Box>\n <Box borderWidth=\"1px\" borderColor={borderColor} borderRadius=\"md\" p={4} textAlign=\"center\">\n <Stat>\n <StatLabel>Váha</StatLabel>\n <StatNumber>{data.weight ? `${data.weight} kg` : '—'}</StatNumber>\n </Stat>\n </Box>\n <Box borderWidth=\"1px\" borderColor={borderColor} borderRadius=\"md\" p={4} textAlign=\"center\">\n <Stat>\n <StatLabel>Dres</StatLabel>\n <StatNumber>{typeof data.jersey_number === 'number' ? `#${data.jersey_number}` : '—'}</StatNumber>\n </Stat>\n </Box>\n </SimpleGrid>\n\n <Divider />\n\n <Tabs variant=\"soft-rounded\" colorScheme=\"blue\">\n <TabList>\n <Tab>Profil</Tab>\n {hasContact && <Tab>Kontakt</Tab>}\n </TabList>\n <TabPanels>\n <TabPanel px={0}>\n <Stack spacing={3}>\n {data.position && (\n <Text><b>Pozice:</b> {data.position}</Text>\n )}\n {data.date_of_birth && (\n <Text><b>Datum narození:</b> {new Date(data.date_of_birth).toLocaleDateString('cs-CZ')} {age != null ? `— ${age} ${czYears(age)}` : ''}</Text>\n )}\n {data.team?.name ? (\n <Text><b>Tým:</b> {data.team.name}</Text>\n ) : (typeof data.team_id === 'number' && data.team_id > 0) ? (\n <Text><b>Tým ID:</b> {data.team_id}</Text>\n ) : null}\n {data.nationality && (\n <HStack>\n <Text><b>Národnost:</b></Text>\n <Text as=\"span\" fontSize=\"xl\">{getCountryFlag(data.nationality)}</Text>\n <Text>{translateNationality(data.nationality)}</Text>\n </HStack>\n )}\n </Stack>\n </TabPanel>\n {hasContact && (\n <TabPanel px={0}>\n <Stack spacing={3}>\n {data.email && (\n <Text><b>Email:</b> <a href={`mailto:${data.email}`}>{data.email}</a></Text>\n )}\n {data.phone && (\n <Text><b>Telefon:</b> <a href={`tel:${normalizeTel(data.phone)}`}>{data.phone}</a></Text>\n )}\n </Stack>\n </TabPanel>\n )}\n </TabPanels>\n </Tabs>\n </Stack>\n </SimpleGrid>\n\n </VStack>\n </Container>\n <NewsletterCTA />\n </Box>\n </MainLayout>\n );\n};\n\nfunction calculateAge(iso: string): number | null {\n try {\n const d = new Date(iso);\n if (isNaN(d.getTime())) return null;\n const today = new Date();\n let age = today.getFullYear() - d.getFullYear();\n const m = today.getMonth() - d.getMonth();\n if (m < 0 || (m === 0 && today.getDate() < d.getDate())) age--;\n return age;\n } catch {\n return null;\n }\n}\n\nfunction czYears(n: number): string {\n if (n === 1) return 'rok';\n if (n >= 2 && n <= 4) return 'roky';\n return 'let';\n}\n\nfunction normalizeTel(input: string): string {\n if (!input) return '';\n let s = String(input).trim();\n s = s.replace(/[\\s\\-()]/g, '');\n if (s.startsWith('00')) s = '+' + s.slice(2);\n s = s.replace(/(?!^)[^\\d]/g, '');\n if (s[0] !== '+' && s.startsWith('+')) {\n // keep + if present\n }\n return s;\n}\n\nexport default PlayerDetailPage;\n","import React from 'react';\nimport { assetUrl } from '../../utils/url';\nimport { useTranslation } from 'react-i18next';\n\nexport type NewsListItem = {\n id: number | string;\n title: string;\n excerpt?: string;\n image?: string;\n slug?: string;\n};\n\nconst NewsList: React.FC<{\n items: NewsListItem[];\n emptyText?: string;\n seeAllHref?: string;\n seeAllLabel?: string;\n}> = ({ items, emptyText, seeAllHref, seeAllLabel }) => {\n const { t } = useTranslation();\n \n // Use provided text or fallback to translations\n const emptyTextFinal = emptyText || t('news.no_news');\n const seeAllLabelFinal = seeAllLabel || t('news.view_all_news');\n \n return (\n <>\n <div className=\"blog-list\">\n {items && items.length > 0 ? (\n items.slice(0, 4).map((n) => (\n <a key={n.id} href={`/news/${n.slug || n.id}`} className=\"card\" style={{ textDecoration: 'none', color: 'inherit' }}>\n <div className=\"thumb\" style={{ backgroundImage: `url(${assetUrl(n.image) || '/images/news/placeholder.jpg'})` }} />\n <div>\n <h4>{n.title}</h4>\n {n.excerpt && (\n <div style={{ color: 'var(--dark-gray)', fontSize: '0.9rem' }}>{n.excerpt}</div>\n )}\n </div>\n </a>\n ))\n ) : (\n <div style={{ padding: '24px', textAlign: 'center', color: 'var(--dark-gray)', background: 'var(--bg-soft)', borderRadius: '12px' }}>\n <p>{emptyTextFinal}</p>\n </div>\n )}\n </div>\n {seeAllHref && items && items.length > 0 && (\n <div style={{ marginTop: 12 }}>\n <a className=\"btn\" href={seeAllHref}>{seeAllLabelFinal}</a>\n </div>\n )}\n </>\n );\n};\n\nexport default NewsList;\n","import React from 'react';\nimport {\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalBody,\n ModalFooter,\n VStack,\n HStack,\n Text,\n Spinner,\n Progress,\n Box,\n Icon,\n useColorModeValue,\n} from '@chakra-ui/react';\nimport { FiCpu, FiClock } from 'react-icons/fi';\n\ninterface AILoadingModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n message?: string;\n progress?: number;\n estimatedTime?: number; // in seconds\n}\n\nconst AILoadingModal: React.FC<AILoadingModalProps> = ({\n isOpen,\n onClose,\n title = 'AI generuje obsah',\n message = 'Pracuji na vašem požadavku...',\n progress,\n estimatedTime,\n}) => {\n const bg = useColorModeValue('white', 'gray.800');\n const textColor = useColorModeValue('gray.700', 'gray.200');\n const progressColor = useColorModeValue('blue.500', 'blue.300');\n const borderColor = useColorModeValue('gray.200', 'gray.600');\n\n const getProgressMessage = () => {\n if (progress !== undefined) {\n if (progress < 25) return 'AI analyzuje požadavek...';\n if (progress < 50) return 'AI komunikuje s modelem...';\n if (progress < 75) return 'AI zpracovává obsah...';\n if (progress < 90) return 'AI optimalizuje výstup...';\n return 'AI dokončuje...';\n }\n return message;\n };\n\n const getTimeRemaining = () => {\n if (estimatedTime && progress !== undefined && progress > 0) {\n const remaining = Math.ceil((estimatedTime * (100 - progress)) / 100);\n if (remaining > 0) {\n return `Předpokládaný čas: ${remaining}s`;\n }\n }\n if (estimatedTime) {\n return `Předpokládaný čas: ${estimatedTime}s`;\n }\n return '';\n };\n\n const getRoundedProgress = () => {\n if (progress !== undefined) {\n return Math.round(progress);\n }\n return 0;\n };\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} isCentered closeOnEsc={false} closeOnOverlayClick={false}>\n <ModalOverlay bg=\"blackAlpha.400\" backdropFilter=\"blur(6px)\" />\n <ModalContent bg={bg} borderRadius=\"2xl\" boxShadow=\"2xl\" border=\"1px solid\" borderColor={borderColor}>\n <ModalHeader borderBottom=\"1px solid\" borderColor={borderColor} pb={4}>\n <VStack spacing={3} align=\"center\">\n <HStack spacing={3}>\n <Box bg=\"blue.50\" p={2} borderRadius=\"full\">\n <Icon as={FiCpu} color=\"blue.500\" boxSize={5} />\n </Box>\n <Text fontSize=\"lg\" fontWeight=\"600\" color={textColor}>\n {title}\n </Text>\n </HStack>\n </VStack>\n </ModalHeader>\n \n <ModalBody py={8}>\n <VStack spacing={6} align=\"center\">\n {/* Single centered AI Animation with model logo */}\n <VStack spacing={4}>\n <Box bg=\"blue.50\" p={4} borderRadius=\"full\">\n <Icon as={FiCpu} color=\"blue.500\" boxSize={6} />\n </Box>\n <Spinner size=\"lg\" color=\"blue.500\" thickness=\"3px\" />\n </VStack>\n\n {/* Status Message */}\n <Text fontSize=\"md\" color={textColor} textAlign=\"center\" fontWeight=\"500\">\n {getProgressMessage()}\n </Text>\n\n {/* Progress Bar */}\n {progress !== undefined && (\n <Box w=\"100%\" maxW=\"400px\">\n <Progress\n value={progress}\n size=\"lg\"\n colorScheme=\"blue\"\n borderRadius=\"full\"\n bg=\"gray.100\"\n sx={{\n '& > div': {\n bg: progressColor,\n transition: 'width 0.4s ease-out',\n },\n }}\n />\n <Text fontSize=\"sm\" color=\"gray.600\" mt={3} textAlign=\"center\" fontWeight=\"500\">\n {getRoundedProgress()}% hotovo\n </Text>\n </Box>\n )}\n\n {/* Time Estimate */}\n {getTimeRemaining() && (\n <HStack spacing={2} color=\"gray.500\">\n <Icon as={FiClock} boxSize={4} />\n <Text fontSize=\"sm\">{getTimeRemaining()}</Text>\n </HStack>\n )}\n\n {/* Additional Info */}\n <VStack spacing={2} align=\"center\" pt={2}>\n <Text fontSize=\"sm\" color=\"gray.400\" fontStyle=\"italic\">\n AI pracuje na vašem obsahu\n </Text>\n <Text fontSize=\"xs\" color=\"gray.400\">\n Vygenerovaný obsah bude automaticky vložen do formuláře\n </Text>\n </VStack>\n </VStack>\n </ModalBody>\n\n <ModalFooter borderTop=\"1px solid\" borderColor={borderColor}>\n <Text fontSize=\"sm\" color=\"gray.400\">\n Prosím čekejte, proces nelze přerušit\n </Text>\n </ModalFooter>\n </ModalContent>\n </Modal>\n );\n};\n\nexport default AILoadingModal;\n","import { \n Box, \n Heading, \n Text, \n Spinner, \n Alert, \n AlertIcon, \n Table, \n Thead, \n Tbody, \n Tr, \n Th, \n Td, \n HStack, \n Badge, \n Button, \n useToast, \n Drawer, \n DrawerOverlay, \n DrawerContent, \n DrawerHeader, \n DrawerBody, \n DrawerFooter, \n FormControl, \n FormLabel, \n Input, \n Stack, \n FormErrorMessage, \n useBreakpointValue, \n Wrap,\n WrapItem,\n useColorModeValue,\n Select\n} from '@chakra-ui/react';\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport { patchMatchOverride, fetchAdminMatches } from '../../services/adminMatches';\nimport { getPublicSettings } from '../../services/settings';\n\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { parse, format } from 'date-fns';\nimport { API_URL } from '../../services/api';\nimport TeamLogo from '../../components/common/TeamLogo';\nimport DateRangePicker from '../../components/common/DateRangePicker';\nimport { getCompetitionAliasesPublic } from '../../services/competitionAliases';\n\nconst MatchesAdminPage = () => {\n const queryClient = useQueryClient();\n const toast = useToast();\n const [isOpen, setIsOpen] = useState(false);\n const [selected, setSelected] = useState<any | null>(null);\n const [form, setForm] = useState({\n venue_override: '',\n date_time_edit: '',\n score_override: '',\n });\n const [origDateLocal, setOrigDateLocal] = useState<string>('');\n\n const normalizeName = (s: string) => {\n let out = String(s || '');\n out = out\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase();\n out = out.replace(/[\\u2012\\u2013\\u2014\\u2015\\u2212]/g, '-');\n const orgPhrases = [\n 'fotbalovy klub',\n 'sportovni klub',\n 'telovychovna jednota',\n 'skolni sportovni klub',\n 'fotbal',\n 'futsal',\n ];\n for (const phrase of orgPhrases) {\n const re = new RegExp(`(^|\\\\b)${phrase}(\\\\b|$)`, 'g');\n out = out.replace(re, ' ');\n }\n out = out.replace(/\\b(1\\.)?\\s*(sfc|afc|fc|fk|mfk|tj|sk|afk)\\b\\.?/g, ' ');\n out = out.replace(/[\\.,!;:()\\[\\]{}]/g, ' ');\n out = out.replace(/\\s+/g, ' ').trim();\n return out;\n };\n \n \n // Team name/logo editing removed\n\n const { data: matches = [], isLoading, error } = useQuery<any[], Error>({\n queryKey: ['admin-matches-list-cache'],\n queryFn: async () => {\n const items = await fetchAdminMatches();\n const FACR_DATE_FMT = 'dd.MM.yyyy HH:mm';\n const parseTs = (obj: any): number => {\n const s = String(obj?.date_time || (obj?.date && obj?.time ? `${obj.date} ${obj.time}` : obj?.date) || '').trim();\n if (!s) return Number.MAX_SAFE_INTEGER;\n try {\n const dt = parse(s, FACR_DATE_FMT, new Date());\n if (!isNaN(dt.getTime())) return dt.getTime();\n } catch {}\n const d2 = new Date(s);\n if (!isNaN(d2.getTime())) return d2.getTime();\n return Number.MAX_SAFE_INTEGER;\n };\n items.sort((a: any, b: any) => parseTs(a) - parseTs(b));\n return items;\n },\n });\n \n \n // Filters\n const [teamFilter, setTeamFilter] = useState('');\n const [dateFrom, setDateFrom] = useState<string>(''); // YYYY-MM-DD\n const [dateTo, setDateTo] = useState<string>(''); // YYYY-MM-DD\n const [competitionFilter, setCompetitionFilter] = useState<string>('');\n const [sideFilter, setSideFilter] = useState<'home' | 'away' | ''>('');\n const normalizedTeam = teamFilter.trim().toLowerCase();\n const FACR_DATE_FMT = 'dd.MM.yyyy HH:mm';\n const formatDisplayDate = (s: string, t?: string): string => {\n // Prefer full date-time string; if only date and time parts exist, combine them\n const str = String((s && t ? `${s} ${t}` : s) || '').trim();\n if (!str) return '';\n try {\n const dt = parse(str, FACR_DATE_FMT, new Date());\n if (!isNaN(dt.getTime())) return format(dt, FACR_DATE_FMT);\n } catch {}\n const d2 = new Date(str);\n if (!isNaN(d2.getTime())) return format(d2, FACR_DATE_FMT);\n return str;\n };\n // Club name (for side filter)\n const { data: publicSettings } = useQuery({\n queryKey: ['public-settings'],\n queryFn: getPublicSettings,\n });\n const { data: facrClubInfo } = useQuery({\n queryKey: ['facr-club-info-name'],\n queryFn: async () => {\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n const url = `${origin}/cache/prefetch/facr_club_info.json`;\n const res = await fetch(url, { headers: { 'Cache-Control': 'no-cache' } });\n if (!res.ok) return null;\n return await res.json();\n },\n });\n const clubName: string = (publicSettings as any)?.club_name || (facrClubInfo as any)?.name || '';\n const normalize = (s: string) => String(s || '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\n const stripPrefixes = (s: string) => {\n let x = normalize(s);\n // Common Czech club prefixes/words\n x = x.replace(/\\b(mestsky|m\\.?f\\.?k\\.?|mfk|tj|sk|sokol|fotbalovy|fotbalový|fotbalovy\\s+klub|fotbalovy\\s+klub)\\b/g, '').replace(/\\s+/g, ' ').trim();\n return x;\n };\n const clubNorm = normalize(clubName);\n const clubStrip = stripPrefixes(clubName);\n const teamMatchesClub = (team: string): boolean => {\n const t = normalize(team);\n const ts = stripPrefixes(team);\n return !!clubNorm && (t.includes(clubNorm) || ts.includes(clubStrip) || t.endsWith(clubStrip) || clubStrip.endsWith(ts));\n };\n // Load competition aliases (ordered by display_order in backend)\n const { data: compAliases = [] } = useQuery({\n queryKey: ['competition-aliases-public'],\n queryFn: getCompetitionAliasesPublic,\n });\n const competitionOptions = useMemo(() => {\n const set = new Set<string>();\n const competitionMap = new Map<string, { name: string; alias?: string; order: number }>();\n \n // Collect unique competitions and find their aliases\n for (const m of matches) {\n if (m.competitionName) {\n const name = String(m.competitionName);\n if (!set.has(name)) {\n set.add(name);\n \n // Find matching alias\n let foundAlias: any = null;\n let order = Number.MAX_SAFE_INTEGER;\n const n = normalizeName(name);\n \n if (Array.isArray(compAliases) && compAliases.length > 0) {\n for (let i = 0; i < compAliases.length; i++) {\n const al: any = compAliases[i] as any;\n const a1 = normalizeName(String(al.alias || ''));\n const a2 = normalizeName(String(al.original_name || ''));\n \n if ((a1 && (n.includes(a1) || a1.includes(n))) || (a2 && (n.includes(a2) || a2.includes(n)))) {\n foundAlias = al;\n order = i;\n break;\n }\n }\n }\n \n competitionMap.set(name, {\n name,\n alias: foundAlias ? String(foundAlias.alias || '') : undefined,\n order\n });\n }\n }\n }\n \n // Convert to array and sort by alias order, then by name\n const arr = Array.from(competitionMap.values());\n return arr.sort((a, b) => {\n if (a.order !== b.order) return a.order - b.order;\n return a.name.localeCompare(b.name);\n });\n }, [matches, compAliases]);\n const filteredMatches = matches.filter((m: any) => {\n // team filter\n const teamOk = normalizedTeam\n ? (\n sideFilter === 'home'\n ? [m.home, m.home_team].filter(Boolean).some((v: string) => String(v).toLowerCase().includes(normalizedTeam))\n : sideFilter === 'away'\n ? [m.away, m.away_team].filter(Boolean).some((v: string) => String(v).toLowerCase().includes(normalizedTeam))\n : [m.home, m.home_team, m.away, m.away_team]\n .filter(Boolean)\n .some((v: string) => String(v).toLowerCase().includes(normalizedTeam))\n )\n : true;\n if (!teamOk) return false;\n\n // competition filter\n if (competitionFilter && String(m.competitionName || '') !== competitionFilter) return false;\n\n // side filter based on club name\n if (sideFilter && clubNorm) {\n const homeName = String(m.home || m.home_team || '');\n const awayName = String(m.away || m.away_team || '');\n if (sideFilter === 'home' && !teamMatchesClub(homeName)) return false;\n if (sideFilter === 'away' && !teamMatchesClub(awayName)) return false;\n }\n\n // date parse\n const dtStr = String(m.date_time || (m.date && m.time ? `${m.date} ${m.time}` : m.date) || '');\n let ts = NaN;\n try {\n ts = parse(dtStr, FACR_DATE_FMT, new Date()).getTime();\n } catch (_) {\n const d2 = new Date(dtStr);\n ts = d2.getTime();\n }\n if (isNaN(ts)) return true; // if can't parse, let it pass other filters\n\n // date range filter\n if (dateFrom) {\n const fromTs = new Date(dateFrom + 'T00:00:00').getTime();\n if (!isNaN(fromTs) && ts < fromTs) return false;\n }\n if (dateTo) {\n const toTs = new Date(dateTo + 'T23:59:59').getTime();\n if (!isNaN(toTs) && ts > toTs) return false;\n }\n return true;\n });\n\n // Pagination (Load more) + page size selector\n const [pageSize, setPageSize] = useState(50);\n const [limit, setLimit] = useState(50);\n const [searchParams, setSearchParams] = useSearchParams();\n\n // Initialize filters from URL on first load and when data changes (so comps are known)\n useEffect(() => {\n const spTeam = searchParams.get('team') || '';\n const spFrom = searchParams.get('from') || '';\n const spTo = searchParams.get('to') || '';\n const spComp = searchParams.get('comp') || '';\n const spVenue = searchParams.get('venue') || '';\n const spSide = searchParams.get('side') || '';\n const spSize = parseInt(searchParams.get('size') || '') || undefined;\n const spLimit = parseInt(searchParams.get('limit') || '') || undefined;\n if (spTeam) setTeamFilter(spTeam);\n if (spFrom) setDateFrom(spFrom);\n if (spTo) setDateTo(spTo);\n if (spComp) setCompetitionFilter(spComp);\n // venue filter removed\n if (spSide === 'home' || spSide === 'away') setSideFilter(spSide);\n if (spSize) {\n setPageSize(spSize);\n setLimit(spSize);\n }\n if (spLimit) setLimit(spLimit);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Keep URL in sync when filters/pagination change\n useEffect(() => {\n const params: Record<string, string> = {};\n if (teamFilter) params.team = teamFilter;\n if (dateFrom) params.from = dateFrom;\n if (dateTo) params.to = dateTo;\n if (competitionFilter) params.comp = competitionFilter;\n // venue filter removed\n if (sideFilter) params.side = sideFilter;\n if (pageSize !== 50) params.size = String(pageSize);\n if (limit !== pageSize) params.limit = String(limit);\n setSearchParams(params, { replace: true });\n }, [teamFilter, dateFrom, dateTo, competitionFilter, sideFilter, pageSize, limit, setSearchParams]);\n useEffect(() => {\n // reset pagination on filter change\n setLimit(pageSize);\n }, [normalizedTeam, dateFrom, dateTo, competitionFilter, sideFilter, clubNorm, pageSize]);\n const visibleMatches = filteredMatches.slice(0, limit);\n\n // Date presets\n const setThisWeek = () => {\n const now = new Date();\n const day = now.getDay(); // 0 Sun .. 6 Sat\n const diffToMonday = (day === 0 ? -6 : 1 - day); // Monday start\n const monday = new Date(now);\n monday.setDate(now.getDate() + diffToMonday);\n const sunday = new Date(monday);\n sunday.setDate(monday.getDate() + 6);\n const f = monday.toISOString().slice(0, 10);\n const t = sunday.toISOString().slice(0, 10);\n setDateFrom(f);\n setDateTo(t);\n };\n const setNext30Days = () => {\n const now = new Date();\n const to = new Date(now);\n to.setDate(now.getDate() + 30);\n const f = now.toISOString().slice(0, 10);\n const t = to.toISOString().slice(0, 10);\n setDateFrom(f);\n setDateTo(t);\n };\n\n // Export CSV of filtered results\n const exportCsv = () => {\n const rows = filteredMatches.map((m: any) => {\n const date = m.date_time || m.date || '';\n const comp = m.competitionName || '';\n const home = m.home || m.home_team || '';\n const away = m.away || m.away_team || '';\n const score = m.score || (m.result_home != null && m.result_away != null ? `${m.result_home}:${m.result_away}` : '');\n const venue = m.venue || '';\n return { date, competition: comp, home, away, score, venue };\n });\n const headers = ['date', 'competition', 'home', 'away', 'score', 'venue'];\n const escape = (v: any) => {\n const s = String(v ?? '');\n if (/[\",\\n]/.test(s)) return '\"' + s.replace(/\"/g, '\"\"') + '\"';\n return s;\n };\n const csv = [headers.join(','), ...rows.map(r => headers.map(h => escape((r as any)[h])).join(','))].join('\\n');\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'matches.csv';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n // Datetime validation for datetime-local\n const isDateInvalid = form.date_time_edit.trim() !== '' && isNaN(new Date(form.date_time_edit).getTime());\n\n const saveMutation = useMutation({\n mutationFn: async () => {\n const externalMatchId: string = String((selected?.match_id ?? selected?.id ?? '')).trim();\n if (!externalMatchId) throw new Error('Chybí match_id');\n const body: any = {};\n // Venue: send only if changed\n const currentVenue = String(selected?.venue || '');\n if (form.venue_override.trim() !== currentVenue) {\n body.venue_override = form.venue_override.trim() === '' ? null : form.venue_override.trim();\n }\n // Score: send only if changed\n const currentScore = String(selected?.score || (selected?.result_home != null && selected?.result_away != null ? `${selected.result_home}:${selected.result_away}` : '') || '');\n if (form.score_override.trim() !== currentScore) {\n body.score_override = form.score_override.trim() === '' ? null : form.score_override.trim();\n }\n // Datetime: send only if changed\n if (form.date_time_edit !== origDateLocal) {\n body.date_time_override = form.date_time_edit.trim() === '' ? null : form.date_time_edit;\n }\n // If nothing changed, do nothing\n if (Object.keys(body).length === 0) return { ok: true };\n await patchMatchOverride(externalMatchId, body);\n return { ok: true };\n },\n onSuccess: () => {\n toast({ title: 'Uloženo', status: 'success' });\n setIsOpen(false);\n setSelected(null);\n queryClient.invalidateQueries({ queryKey: ['admin-matches-list-cache'] });\n },\n onError: (e: any) => {\n toast({ title: 'Uložení selhalo', description: e?.message || 'Zkuste to znovu', status: 'error' });\n },\n });\n\n const openEdit = (m: any) => {\n setSelected(m);\n const facrStr: string = m.date_time || (m.date && m.time ? `${m.date} ${m.time}` : m.date) || '';\n let localStr = '';\n if (facrStr) {\n try {\n const dt = parse(String(facrStr), 'dd.MM.yyyy HH:mm', new Date());\n if (!isNaN(dt.getTime())) {\n const pad = (n: number) => String(n).padStart(2, '0');\n localStr = `${dt.getFullYear()}-${pad(dt.getMonth() + 1)}-${pad(dt.getDate())}T${pad(dt.getHours())}:${pad(dt.getMinutes())}`;\n }\n } catch (_) {\n const d2 = new Date(facrStr);\n if (!isNaN(d2.getTime())) {\n const pad = (n: number) => String(n).padStart(2, '0');\n localStr = `${d2.getFullYear()}-${pad(d2.getMonth() + 1)}-${pad(d2.getDate())}T${pad(d2.getHours())}:${pad(d2.getMinutes())}`;\n }\n }\n }\n setOrigDateLocal(localStr);\n setForm({\n venue_override: m.venue || '',\n date_time_edit: localStr,\n score_override: String(m.score || (m.result_home != null && m.result_away != null ? `${m.result_home}:${m.result_away}` : '') || ''),\n });\n setIsOpen(true);\n };\n\n // Removed autofocus logic for team inputs\n\n const drawerSize = useBreakpointValue({ base: 'full', md: 'md' });\n // Horizontal scroll affordance\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const [canScrollLeft, setCanScrollLeft] = useState(false);\n const [canScrollRight, setCanScrollRight] = useState(false);\n const [showScrollHint, setShowScrollHint] = useState(true);\n \n // Drag-to-scroll state\n const [isDragging, setIsDragging] = useState(false);\n const [startX, setStartX] = useState(0);\n const [scrollLeft, setScrollLeft] = useState(0);\n const lastXRef = useRef(0);\n const lastTimeRef = useRef(0);\n const velocityRef = useRef(0);\n const animationRef = useRef<number | null>(null);\n const scrollRaf = useRef<number | null>(null);\n \n const updateScrollShadow = () => {\n const el = scrollRef.current;\n if (!el) return;\n const left = el.scrollLeft > 0;\n const right = el.scrollLeft + el.clientWidth < el.scrollWidth - 1;\n if (left !== canScrollLeft) setCanScrollLeft(left);\n if (right !== canScrollRight) setCanScrollRight(right);\n };\n \n // Drag-to-scroll handlers\n const handleMouseDown = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!scrollRef.current) return;\n // Cancel any ongoing momentum animation\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n animationRef.current = null;\n }\n setIsDragging(true);\n setStartX(e.pageX - scrollRef.current.offsetLeft);\n setScrollLeft(scrollRef.current.scrollLeft);\n lastXRef.current = e.pageX;\n lastTimeRef.current = Date.now();\n velocityRef.current = 0;\n scrollRef.current.style.cursor = 'grabbing';\n scrollRef.current.style.userSelect = 'none';\n scrollRef.current.style.scrollBehavior = 'auto'; // Disable smooth scroll during drag\n };\n \n const handleMouseLeave = () => {\n setIsDragging(false);\n if (scrollRef.current) {\n scrollRef.current.style.cursor = 'grab';\n scrollRef.current.style.userSelect = 'auto';\n }\n };\n \n const handleMouseUp = () => {\n setIsDragging(false);\n if (scrollRef.current) {\n scrollRef.current.style.cursor = 'grab';\n scrollRef.current.style.userSelect = 'auto';\n scrollRef.current.style.scrollBehavior = 'smooth';\n \n // Apply momentum scrolling\n const velocity = velocityRef.current;\n if (Math.abs(velocity) > 0.5) {\n const applyMomentum = () => {\n if (!scrollRef.current) return;\n velocityRef.current *= 0.95; // Deceleration factor\n scrollRef.current.scrollLeft -= velocityRef.current;\n \n if (Math.abs(velocityRef.current) > 0.5) {\n animationRef.current = requestAnimationFrame(applyMomentum);\n } else {\n animationRef.current = null;\n }\n };\n animationRef.current = requestAnimationFrame(applyMomentum);\n }\n }\n };\n \n const handleMouseMove = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!isDragging || !scrollRef.current) return;\n e.preventDefault();\n const x = e.pageX - scrollRef.current.offsetLeft;\n const walk = (x - startX) * 1.5; // Scroll speed multiplier (reduced for smoother feel)\n scrollRef.current.scrollLeft = scrollLeft - walk;\n \n // Calculate velocity for momentum\n const now = Date.now();\n const timeDelta = now - lastTimeRef.current;\n if (timeDelta > 0) {\n const currentX = e.pageX;\n const distance = currentX - lastXRef.current;\n velocityRef.current = distance / timeDelta * 16; // Normalize to ~60fps\n lastXRef.current = currentX;\n lastTimeRef.current = now;\n }\n };\n \n // Touch handlers for mobile\n const handleTouchStart = (e: React.TouchEvent<HTMLDivElement>) => {\n if (!scrollRef.current) return;\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n animationRef.current = null;\n }\n const touch = e.touches[0];\n setIsDragging(true);\n setStartX(touch.pageX - scrollRef.current.offsetLeft);\n setScrollLeft(scrollRef.current.scrollLeft);\n lastXRef.current = touch.pageX;\n lastTimeRef.current = Date.now();\n velocityRef.current = 0;\n if (scrollRef.current) scrollRef.current.style.scrollBehavior = 'auto';\n };\n \n const handleTouchMove = (e: React.TouchEvent<HTMLDivElement>) => {\n if (!isDragging || !scrollRef.current) return;\n const touch = e.touches[0];\n const x = touch.pageX - scrollRef.current.offsetLeft;\n const walk = (x - startX) * 1.5;\n scrollRef.current.scrollLeft = scrollLeft - walk;\n \n const now = Date.now();\n const timeDelta = now - lastTimeRef.current;\n if (timeDelta > 0) {\n const currentX = touch.pageX;\n const distance = currentX - lastXRef.current;\n velocityRef.current = distance / timeDelta * 16;\n lastXRef.current = currentX;\n lastTimeRef.current = now;\n }\n };\n \n const handleTouchEnd = () => {\n setIsDragging(false);\n if (scrollRef.current) {\n scrollRef.current.style.scrollBehavior = 'smooth';\n \n const velocity = velocityRef.current;\n if (Math.abs(velocity) > 0.5) {\n const applyMomentum = () => {\n if (!scrollRef.current) return;\n velocityRef.current *= 0.95;\n scrollRef.current.scrollLeft -= velocityRef.current;\n \n if (Math.abs(velocityRef.current) > 0.5) {\n animationRef.current = requestAnimationFrame(applyMomentum);\n } else {\n animationRef.current = null;\n }\n };\n animationRef.current = requestAnimationFrame(applyMomentum);\n }\n }\n };\n \n // Utility to check if match is in the past\n const isMatchPast = (dateTimeStr: string): boolean => {\n if (!dateTimeStr) return false;\n // Try full date+time first: dd.MM.yyyy HH:mm\n try {\n const dt = parse(dateTimeStr, FACR_DATE_FMT, new Date());\n if (!isNaN(dt.getTime())) return dt.getTime() < Date.now();\n } catch {}\n // If only date is present: dd.MM.yyyy\n try {\n const dOnly = parse(dateTimeStr, 'dd.MM.yyyy', new Date());\n if (!isNaN(dOnly.getTime())) return dOnly.getTime() < Date.now();\n } catch {}\n // Fallback to Date constructor (RFC3339 etc.)\n const d2 = new Date(dateTimeStr);\n if (!isNaN(d2.getTime())) return d2.getTime() < Date.now();\n return false;\n };\n\n useEffect(() => {\n updateScrollShadow();\n const onResize = () => updateScrollShadow();\n window.addEventListener('resize', onResize);\n return () => {\n window.removeEventListener('resize', onResize);\n // Cleanup momentum animation on unmount\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n }\n };\n }, []);\n\n const headerBg = useColorModeValue('brand.primary', 'gray.700');\n const headerText = useColorModeValue('text.onPrimary', 'white');\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const edgeGradientLeft = useColorModeValue('linear(to-r, white, transparent)', 'linear(to-r, gray.800, transparent)');\n const edgeGradientRight = useColorModeValue('linear(to-l, white, transparent)', 'linear(to-l, gray.800, transparent)');\n const pastMatchBg = useColorModeValue('gray.100', 'gray.700');\n const futureMatchBg = useColorModeValue('white', 'gray.800');\n const pastMatchHoverBg = useColorModeValue('gray.200', 'gray.600');\n const futureMatchHoverBg = useColorModeValue('gray.50', 'gray.700');\n\n return (\n <AdminLayout requireAdmin={false}>\n <Box>\n <Box mb={6}>\n <Heading size=\"lg\" mb={2}>Správa zápasů</Heading>\n <Text color={useColorModeValue('gray.600', 'gray.400')}>\n Správa a úprava zápasů. Můžete upravovat informace o zápasech, včetně názvů týmů, termínů, log a dalších detailů.\n </Text>\n </Box>\n\n {isLoading ? (\n <HStack spacing={3} mb={4}>\n <Spinner />\n <Text>Načítám zápasy…</Text>\n </HStack>\n ) : error ? (\n <Alert status=\"error\" variant=\"left-accent\" mb={4}>\n <AlertIcon />\n Nepodařilo se načíst zápasy.\n </Alert>\n ) : (\n <Box>\n <Wrap mb={4} spacing={3} align=\"center\">\n <WrapItem minW=\"160px\">\n <Select size=\"sm\" value={sideFilter} onChange={(e) => setSideFilter((e.target.value as any) || '')}>\n <option value=\"\">Všechny strany</option>\n <option value=\"home\">Domácí</option>\n <option value=\"away\">Hosté</option>\n </Select>\n </WrapItem>\n <WrapItem flex={1} minW=\"220px\">\n <Input\n placeholder=\"Filtrovat podle týmu…\"\n value={teamFilter}\n onChange={(e) => setTeamFilter(e.target.value)}\n size=\"sm\"\n />\n </WrapItem>\n <WrapItem>\n <DateRangePicker\n from={dateFrom || undefined}\n to={dateTo || undefined}\n onChange={(fromValue, toValue) => {\n setDateFrom(fromValue);\n setDateTo(toValue);\n }}\n size=\"sm\"\n />\n </WrapItem>\n <WrapItem minW=\"220px\">\n <Select size=\"sm\" value={competitionFilter} onChange={(e) => setCompetitionFilter(e.target.value)}>\n <option value=\"\">Všechny soutěže</option>\n {competitionOptions.map((c) => (\n <option key={c.name} value={c.name}>\n {c.alias ? `${c.alias} - ${c.name}` : c.name}\n </option>\n ))}\n </Select>\n </WrapItem>\n {(teamFilter || dateFrom || dateTo || competitionFilter || sideFilter) && (\n <WrapItem>\n <Button size=\"sm\" variant=\"outline\" colorScheme=\"red\" onClick={() => { setTeamFilter(''); setDateFrom(''); setDateTo(''); setCompetitionFilter(''); setSideFilter(''); }} borderRadius=\"md\">\n Vymazat filtry\n </Button>\n </WrapItem>\n )}\n <WrapItem>\n <HStack>\n <Text fontSize=\"sm\">Na stránku:</Text>\n <Select size=\"sm\" value={pageSize} onChange={(e) => setPageSize(parseInt(e.target.value) || 25)} width=\"auto\">\n <option value={25}>25</option>\n <option value={50}>50</option>\n <option value={100}>100</option>\n <option value={200}>200</option>\n </Select>\n </HStack>\n </WrapItem>\n <WrapItem>\n <Button size=\"sm\" onClick={exportCsv} bg=\"brand.primary\" color=\"text.onPrimary\" _hover={{ filter: 'brightness(0.95)' }} borderRadius=\"md\">Export CSV</Button>\n </WrapItem>\n <WrapItem>\n <Text color=\"gray.500\" fontSize=\"sm\">\n Zobrazeno {visibleMatches.length} / {filteredMatches.length}\n </Text>\n </WrapItem>\n </Wrap>\n {showScrollHint && (\n <Text fontSize=\"xs\" color=\"blue.600\" fontWeight=\"600\" mb={2} display=\"flex\" alignItems=\"center\" gap={1}>\n 💡 Tip: Tabulku můžete plynule posouvat tažením myší nebo prstem →\n </Text>\n )}\n <Box\n ref={scrollRef}\n overflowX=\"auto\"\n borderWidth=\"2px\"\n borderRadius=\"xl\"\n borderColor={borderColor}\n w=\"full\"\n bg={cardBg}\n boxShadow=\"md\"\n maxW=\"100%\"\n position=\"relative\"\n cursor=\"grab\"\n onMouseDown={handleMouseDown}\n onMouseLeave={handleMouseLeave}\n onMouseUp={handleMouseUp}\n onMouseMove={handleMouseMove}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n onScroll={(e) => {\n if (scrollRaf.current == null) {\n scrollRaf.current = requestAnimationFrame(() => {\n const el = scrollRef.current;\n if (el) {\n updateScrollShadow();\n if (el.scrollLeft > 0 && showScrollHint) setShowScrollHint(false);\n }\n scrollRaf.current = null;\n });\n }\n }}\n sx={{\n WebkitOverflowScrolling: 'touch',\n scrollBehavior: 'smooth',\n transform: 'translateZ(0)',\n willChange: 'transform',\n overscrollBehaviorX: 'contain',\n touchAction: 'pan-x',\n 'th, td': { whiteSpace: 'nowrap' },\n '::-webkit-scrollbar': { height: '14px' },\n '::-webkit-scrollbar-thumb': { \n background: '#3182ce', \n borderRadius: '10px',\n border: '3px solid transparent',\n backgroundClip: 'content-box',\n transition: 'background 0.2s ease',\n '&:hover': { background: '#2c5aa0', backgroundClip: 'content-box' },\n '&:active': { background: '#2a4e8a', backgroundClip: 'content-box' }\n },\n '::-webkit-scrollbar-track': { \n background: useColorModeValue('#f7fafc', '#2d3748'),\n borderRadius: '10px',\n margin: '0 8px',\n border: '1px solid',\n borderColor: useColorModeValue('#e2e8f0', '#4a5568')\n },\n }}\n >\n {/* Gradient edges to indicate horizontal scroll */}\n {canScrollLeft && (\n <Box position=\"sticky\" left={0} top={0} bottom={0} w=\"24px\" pointerEvents=\"none\"\n bgGradient={edgeGradientLeft}\n zIndex={1}\n />\n )}\n {canScrollRight && (\n <Box position=\"sticky\" right={0} top={0} bottom={0} w=\"24px\" pointerEvents=\"none\"\n bgGradient={edgeGradientRight}\n zIndex={1}\n />\n )}\n <Table size=\"sm\" sx={{ width: 'max-content' }}>\n <Thead sx={{ position: 'sticky', top: 0, zIndex: 2, backgroundColor: headerBg, 'th': { bg: headerBg, color: headerText, fontWeight: 'bold', textTransform: 'uppercase', fontSize: 'xs', letterSpacing: '0.05em' } }}>\n <Tr>\n <Th minW=\"140px\">Datum</Th>\n <Th minW=\"200px\">Soutěž</Th>\n <Th minW=\"260px\">Domácí</Th>\n <Th minW=\"80px\" textAlign=\"center\">Skóre</Th>\n <Th minW=\"260px\">Hosté</Th>\n <Th minW=\"220px\">Místo</Th>\n <Th minW=\"180px\">Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {filteredMatches.length === 0 ? (\n <Tr>\n <Td colSpan={6}>\n <Text color=\"gray.500\">Žádné zápasy k zobrazení.</Text>\n </Td>\n </Tr>\n ) : (\n visibleMatches.map((m: any, idx: number) => {\n const isPast = isMatchPast(m.date_time || (m.date && m.time ? `${m.date} ${m.time}` : m.date) || '');\n const hasScore = m.score || (m.result_home != null && m.result_away != null);\n return (\n <Tr \n key={m.id ?? idx} \n bg={isPast ? pastMatchBg : futureMatchBg}\n _hover={{ bg: isPast ? pastMatchHoverBg : futureMatchHoverBg }}\n opacity={isPast ? 0.85 : 1}\n transition=\"all 0.2s\"\n >\n <Td>\n <HStack spacing={2}>\n <Text>{formatDisplayDate(String(m.date || m.date_time || ''), String(m.time || ''))}</Text>\n {isPast && <Badge colorScheme=\"gray\" fontSize=\"xs\">Odehráno</Badge>}\n {!isPast && <Badge colorScheme=\"green\" fontSize=\"xs\">Nadcházející</Badge>}\n </HStack>\n </Td>\n <Td>\n <HStack spacing={2}>\n <Badge bg=\"brand.primary\" color=\"text.onPrimary\" borderRadius=\"md\">{m.competitionName}</Badge>\n </HStack>\n </Td>\n <Td>\n <HStack spacing={2}>\n <TeamLogo\n teamId={m.home_id ? String(m.home_id) : undefined}\n teamName={m.home || m.home_team || ''}\n facrLogo={m.home_logo_url}\n size=\"small\"\n alt={m.home || m.home_team || ''}\n loading=\"lazy\"\n decoding=\"async\"\n draggable={false}\n />\n <Text fontWeight={isPast ? 'normal' : 'medium'}>{m.home || m.home_team || ''}</Text>\n <Button size=\"xs\" variant=\"outline\" onClick={() => openEdit(m)} borderRadius=\"md\" _hover={{ borderColor: 'brand.primary', color: 'brand.primary' }}>Tým</Button>\n </HStack>\n </Td>\n <Td textAlign=\"center\">\n <Text fontWeight={hasScore ? 'bold' : 'normal'} color={hasScore ? 'blue.600' : 'gray.500'}>\n {m.score || (m.result_home != null && m.result_away != null ? `${m.result_home}:${m.result_away}` : ':')}\n </Text>\n </Td>\n <Td>\n <HStack spacing={2}>\n <TeamLogo\n teamId={m.away_id ? String(m.away_id) : undefined}\n teamName={m.away || m.away_team || ''}\n facrLogo={m.away_logo_url}\n size=\"small\"\n alt={m.away || m.away_team || ''}\n loading=\"lazy\"\n decoding=\"async\"\n draggable={false}\n />\n <Text fontWeight={isPast ? 'normal' : 'medium'}>{m.away || m.away_team || ''}</Text>\n <Button size=\"xs\" variant=\"outline\" onClick={() => openEdit(m)} borderRadius=\"md\" _hover={{ borderColor: 'brand.primary', color: 'brand.primary' }}>Tým</Button>\n </HStack>\n </Td>\n <Td>{m.venue || ''}</Td>\n <Td>\n <HStack spacing={2}>\n <Button size=\"xs\" onClick={() => openEdit(m)} bg=\"brand.primary\" color=\"text.onPrimary\" _hover={{ filter: 'brightness(0.95)' }} borderRadius=\"md\">Upravit</Button>\n </HStack>\n </Td>\n </Tr>\n );\n })\n )}\n </Tbody>\n </Table>\n </Box>\n {filteredMatches.length > visibleMatches.length && (\n <HStack justify=\"center\" mt={6}>\n <Button onClick={() => setLimit((n) => n + pageSize)} size=\"lg\" bg=\"brand.primary\" color=\"text.onPrimary\" _hover={{ filter: 'brightness(0.95)' }} borderRadius=\"lg\" px={8}>\n Načíst další ({filteredMatches.length - visibleMatches.length} zápasů)\n </Button>\n </HStack>\n )}\n </Box>\n )}\n </Box>\n\n {/* Edit Drawer */}\n <Drawer isOpen={isOpen} placement=\"right\" onClose={() => setIsOpen(false)} size={drawerSize}>\n <DrawerOverlay />\n <DrawerContent>\n <DrawerHeader>Upravit zápas</DrawerHeader>\n <DrawerBody>\n {!selected ? (\n <Text color=\"gray.500\">Není vybrán žádný zápas.</Text>\n ) : (\n <Stack spacing={4}>\n <FormControl>\n <FormLabel>Datum a čas</FormLabel>\n <Input\n type=\"datetime-local\"\n value={form.date_time_edit}\n onChange={(e) => setForm((f) => ({ ...f, date_time_edit: e.target.value }))}\n />\n {isDateInvalid && (\n <FormErrorMessage>Neplatný formát data/času</FormErrorMessage>\n )}\n </FormControl>\n\n <FormControl>\n <FormLabel>Místo</FormLabel>\n <Input\n placeholder=\"Místo konání\"\n value={form.venue_override}\n onChange={(e) => setForm((f) => ({ ...f, venue_override: e.target.value }))}\n />\n </FormControl>\n\n <FormControl>\n <FormLabel>Skóre</FormLabel>\n <Input\n placeholder=\"např. 2:1\"\n value={form.score_override}\n onChange={(e) => setForm((f) => ({ ...f, score_override: e.target.value }))}\n />\n </FormControl>\n\n {/* Team name/logo editing removed */}\n\n \n </Stack>\n )}\n </DrawerBody>\n <DrawerFooter>\n <HStack spacing={3}>\n <Button variant=\"outline\" onClick={() => setIsOpen(false)}>Zavřít</Button>\n <Button colorScheme=\"blue\" isLoading={saveMutation.isPending} onClick={() => saveMutation.mutate()} isDisabled={isDateInvalid}>\n Uložit změny\n </Button>\n </HStack>\n </DrawerFooter>\n </DrawerContent>\n </Drawer>\n \n </AdminLayout>\n );\n};\n\nexport default MatchesAdminPage;\n","import api from '../../services/api';\n\nexport type PrefetchStatus = {\n lastUpdated?: string;\n intervalMinutes: number;\n fastMode: boolean;\n nextApproximate: string;\n};\n\nexport async function getPrefetchStatus(): Promise<PrefetchStatus> {\n const { data } = await api.get('/admin/prefetch/status');\n return data as PrefetchStatus;\n}\n\nexport async function triggerPrefetch(): Promise<{ message: string }>{\n // Send an explicit empty JSON body to set Content-Type: application/json\n const { data } = await api.post('/admin/prefetch/trigger', {});\n return data as { message: string };\n}\n","import { assetUrl } from './url';\n\n/**\n * Get the full URL for an image, handling both absolute and relative URLs\n */\nexport const getImageUrl = (imageUrl: string | undefined | null): string | undefined => {\n if (!imageUrl) return undefined;\n const url = assetUrl(imageUrl);\n return url || imageUrl || undefined;\n};\n","import api from './api';\n\nexport interface Sponsor {\n id: number;\n name: string;\n logo_url?: string;\n website_url?: string;\n is_active: boolean;\n created_at?: string;\n tier?: string; // 'general' for main partners, 'standard' for regular sponsors\n display_order?: number; // For custom ordering\n // Optional banner-specific metadata\n placement?: string; // e.g., homepage_top, homepage_sidebar\n width?: number;\n height?: number;\n}\n\nexport async function getSponsors(): Promise<Sponsor[]> {\n const res = await api.get<any>('/sponsors');\n const body = res.data;\n const list = Array.isArray(body) ? body : (Array.isArray(body?.data) ? body.data : []);\n return (list || []).map((s: any) => ({\n ...s,\n id: s.id ?? s.ID ?? s.Id ?? s.iD,\n }));\n}\n\nexport async function createSponsor(payload: { name: string; logo_url?: string; website_url?: string; is_active?: boolean; tier?: string; display_order?: number; placement?: string; width?: number; height?: number }) {\n const res = await api.post<Sponsor>('/sponsors', payload);\n return res.data;\n}\n\nexport async function updateSponsor(id: number | string, payload: Partial<{ name: string; logo_url?: string; website_url?: string; is_active?: boolean; tier?: string; display_order?: number; placement?: string; width?: number; height?: number }>) {\n const res = await api.put<Sponsor>(`/sponsors/${id}`, payload);\n return res.data;\n}\n\nexport async function deleteSponsor(id: number | string) {\n const res = await api.delete<{ zprava: string }>(`/sponsors/${id}`);\n return res.data;\n}\n","import React, { useEffect, useState } from 'react';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport { Box, Heading, Button, SimpleGrid, FormControl, FormLabel, Input, HStack, VStack, Text, IconButton, useToast, Divider, Textarea, Switch, NumberInput, NumberInputField, Image, Badge, useColorModeValue, Link } from '@chakra-ui/react';\nimport { getClothingAdmin, createClothing, updateClothing, deleteClothing, ClothingItem } from '../../services/clothing';\nimport { FiPlus, FiTrash2, FiSave, FiExternalLink } from 'react-icons/fi';\n\nconst emptyItem: Partial<ClothingItem> = { \n title: '', \n description: '', \n price: 0, \n currency: 'Kč', \n image_url: '', \n url: '', \n is_active: true,\n display_order: 0\n};\n\nconst PreviewCard: React.FC<{ item: Partial<ClothingItem> }> = ({ item }) => {\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n return (\n <Box\n role=\"group\"\n bg={cardBg}\n borderWidth=\"1px\"\n borderColor={borderColor}\n borderRadius=\"xl\"\n overflow=\"hidden\"\n transition=\"all 0.3s\"\n _hover={{ transform: 'translateY(-4px)', boxShadow: 'lg' }}\n >\n <Box position=\"relative\" paddingTop=\"100%\" overflow=\"hidden\">\n <Image\n src={item.image_url}\n alt={item.title || 'Náhled produktu'}\n position=\"absolute\"\n top={0}\n left={0}\n width=\"100%\"\n height=\"100%\"\n objectFit=\"cover\"\n fallbackSrc=\"/images/placeholder-clothing.jpg\"\n />\n {item.url && (\n <Box\n position=\"absolute\"\n top={2}\n right={2}\n bg=\"white\"\n borderRadius=\"full\"\n p={2}\n opacity={0}\n _groupHover={{ opacity: 1 }}\n transition=\"opacity 0.2s\"\n >\n <FiExternalLink size={16} />\n </Box>\n )}\n </Box>\n\n <VStack align=\"stretch\" p={4} spacing={2}>\n <Heading as=\"h3\" size=\"sm\" noOfLines={2}>\n {item.title || 'Název produktu'}\n </Heading>\n {item.description && (\n <Text fontSize=\"sm\" color=\"gray.600\" noOfLines={2}>\n {item.description}\n </Text>\n )}\n <HStack justify=\"space-between\" mt={2}>\n {item.price && item.price > 0 ? (\n <Badge colorScheme=\"blue\" fontSize=\"md\" px={2} py={1}>\n {item.price} {item.currency || 'Kč'}\n </Badge>\n ) : (\n <Box />\n )}\n {item.url && (\n <Text fontSize=\"xs\" color=\"blue.500\">\n Zobrazit →\n </Text>\n )}\n </HStack>\n </VStack>\n </Box>\n );\n};\n\nconst AdminMerchPage: React.FC = () => {\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [items, setItems] = useState<ClothingItem[]>([]);\n const toast = useToast();\n const eshopUrl = process.env.REACT_APP_ESHOP_URL;\n\n const fetchItems = async () => {\n try {\n const data = await getClothingAdmin();\n setItems(data);\n } catch (e) {\n toast({ status: 'error', title: 'Chyba', description: 'Nepodařilo se načíst oblečení.' });\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n fetchItems();\n }, []);\n\n const addItem = () => {\n const newItem: Partial<ClothingItem> = { ...emptyItem };\n setItems((prev) => [...prev, newItem as ClothingItem]);\n };\n\n const removeItem = async (idx: number) => {\n const item = items[idx];\n if (item.id) {\n try {\n await deleteClothing(item.id);\n toast({ status: 'success', title: 'Smazáno', description: 'Položka byla smazána.' });\n fetchItems();\n } catch (e) {\n toast({ status: 'error', title: 'Chyba', description: 'Nepodařilo se smazat položku.' });\n }\n } else {\n setItems((prev) => prev.filter((_, i) => i !== idx));\n }\n };\n\n const updateField = (idx: number, key: keyof ClothingItem, val: any) => {\n setItems((prev) => prev.map((it, i) => i === idx ? { ...it, [key]: val } : it));\n };\n\n const saveItem = async (idx: number) => {\n const item = items[idx];\n if (!item.title || !item.image_url) {\n toast({ status: 'warning', title: 'Upozornění', description: 'Vyplňte alespoň název a obrázek.' });\n return;\n }\n\n setSaving(true);\n try {\n if (item.id) {\n await updateClothing(item.id, item);\n toast({ status: 'success', title: 'Uloženo', description: 'Položka byla aktualizována.' });\n } else {\n await createClothing(item);\n toast({ status: 'success', title: 'Uloženo', description: 'Položka byla vytvořena.' });\n fetchItems();\n }\n } catch (e) {\n toast({ status: 'error', title: 'Chyba', description: 'Nepodařilo se uložit položku.' });\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <AdminLayout>\n <Box>\n <Heading size=\"md\" mb={2}>Oblečení a Fan Shop</Heading>\n <Text fontSize=\"sm\" color=\"gray.600\" mb={2}>\n Spravujte položky oblečení a merchandisingu. Na titulní stránce se zobrazí 5 nejnovějších položek, všechny položky jsou k dispozici na stránce /obleceni.\n </Text>\n <Box mb={4} p={3} bg=\"blue.50\" borderRadius=\"md\" borderLeft=\"4px solid\" borderColor=\"blue.500\">\n <Text fontSize=\"sm\" color=\"blue.800\">\n 💡 <strong>Tip:</strong> Přidejte cenu pro lepší přehlednost. Na veřejné stránce se zobrazí pouze aktivní položky.\n </Text>\n </Box>\n {eshopUrl && (\n <Box mb={4} p={3} bg=\"green.50\" borderRadius=\"md\" borderLeft=\"4px solid\" borderColor=\"green.500\">\n <Text fontSize=\"sm\" color=\"green.800\">\n E-shop je zapnutý. Tato sekce slouží jako výloha na hlavním webu.\n {' '}Pro plnou správu objednávek a produktů použijte samostatný e-shop na adrese{' '}\n <Link href={eshopUrl} isExternal color=\"green.900\" fontWeight=\"semibold\">\n {eshopUrl}\n </Link>\n .\n </Text>\n </Box>\n )}\n\n <HStack justify=\"space-between\" mb={3}>\n <Button leftIcon={<FiPlus />} onClick={addItem}>Přidat položku</Button>\n </HStack>\n\n <Divider my={3} />\n\n {loading ? (\n <Text>Načítání…</Text>\n ) : (\n <VStack align=\"stretch\" spacing={4}>\n {items.map((it, idx) => (\n <Box key={idx} borderWidth=\"1px\" borderRadius=\"md\" p={4} bg=\"white\">\n <HStack justify=\"space-between\" mb={3}>\n <Heading size=\"sm\">\n {it.title || `Položka #${idx + 1}`}\n {!it.is_active && <Text as=\"span\" ml={2} fontSize=\"xs\" color=\"gray.500\">(neaktivní)</Text>}\n </Heading>\n <HStack>\n <Button \n size=\"sm\" \n colorScheme=\"blue\" \n leftIcon={<FiSave />} \n onClick={() => saveItem(idx)} \n isLoading={saving}\n >\n Uložit\n </Button>\n <IconButton \n aria-label=\"Smazat\" \n icon={<FiTrash2 />} \n onClick={() => removeItem(idx)} \n variant=\"outline\" \n colorScheme=\"red\" \n size=\"sm\"\n />\n </HStack>\n </HStack>\n \n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={3}>\n <FormControl isRequired>\n <FormLabel>Název</FormLabel>\n <Input \n value={it.title || ''} \n onChange={(e) => updateField(idx, 'title', e.target.value)} \n placeholder=\"např. Dres domácí 2024/25\" \n />\n </FormControl>\n \n <FormControl isRequired>\n <FormLabel>Obrázek (URL)</FormLabel>\n <Input \n value={it.image_url || ''} \n onChange={(e) => updateField(idx, 'image_url', e.target.value)} \n placeholder=\"https://example.com/img.jpg\" \n />\n </FormControl>\n\n <FormControl>\n <FormLabel>Cena</FormLabel>\n <HStack>\n <NumberInput \n value={it.price || 0} \n onChange={(_, val) => updateField(idx, 'price', val)} \n min={0}\n precision={2}\n flex={1}\n >\n <NumberInputField placeholder=\"0.00\" />\n </NumberInput>\n <Input \n value={it.currency || 'Kč'} \n onChange={(e) => updateField(idx, 'currency', e.target.value)} \n placeholder=\"Kč\" \n width=\"80px\"\n />\n </HStack>\n </FormControl>\n\n <FormControl>\n <FormLabel>Odkaz (eshop)</FormLabel>\n <Input \n value={it.url || ''} \n onChange={(e) => updateField(idx, 'url', e.target.value)} \n placeholder=\"https://eshop.example.com/produkt\" \n />\n </FormControl>\n\n <FormControl>\n <FormLabel>Pořadí zobrazení</FormLabel>\n <NumberInput \n value={it.display_order || 0} \n onChange={(_, val) => updateField(idx, 'display_order', val)} \n min={0}\n >\n <NumberInputField />\n </NumberInput>\n </FormControl>\n\n <FormControl display=\"flex\" alignItems=\"center\">\n <FormLabel mb={0}>Aktivní</FormLabel>\n <Switch \n isChecked={it.is_active !== false} \n onChange={(e) => updateField(idx, 'is_active', e.target.checked)} \n />\n </FormControl>\n </SimpleGrid>\n\n <FormControl mt={3}>\n <FormLabel>Popis</FormLabel>\n <Textarea \n value={it.description || ''} \n onChange={(e) => updateField(idx, 'description', e.target.value)} \n placeholder=\"Volitelný popis položky\"\n rows={2}\n />\n </FormControl>\n\n <Box mt={4}>\n <Heading size=\"xs\" mb={2}>Náhled veřejné karty</Heading>\n <Box maxW=\"360px\">\n <PreviewCard item={it} />\n </Box>\n </Box>\n </Box>\n ))}\n {items.length === 0 && (\n <Text color=\"gray.600\">Zatím žádné položky. Použijte tlačítko „Přidat položku\".</Text>\n )}\n </VStack>\n )}\n </Box>\n </AdminLayout>\n );\n};\n\nexport default AdminMerchPage;\n","// Translation service using tdvorak.dev API and internal AI API\n\nimport { api } from './api';\n\nexport interface TranslationRequest {\n q: string;\n source: string;\n target: string;\n format?: 'text' | 'html';\n alternatives?: number;\n}\n\nexport interface TranslationResponse {\n translatedText: string;\n alternatives?: string[];\n}\n\n// Internal AI translation interface\nexport interface AITranslationRequest {\n text: string;\n from?: string; // default 'cs'\n to?: string; // default 'en'\n}\n\nexport interface AITranslationResponse {\n translated_text: string;\n from: string;\n to: string;\n}\n\nconst TRANSLATE_API_URL = 'https://translate.tdvorak.dev/translate';\n\n// Cache translations to avoid repeated API calls\nconst translationCache = new Map<string, string>();\n\n// Translate using internal AI API\nexport async function translateWithAI(\n text: string,\n sourceLang: string = 'cs',\n targetLang: string = 'en'\n): Promise<string> {\n const cacheKey = `ai-${sourceLang}-${targetLang}-${text}`;\n \n if (translationCache.has(cacheKey)) {\n return translationCache.get(cacheKey)!;\n }\n \n try {\n const response = await api.post<AITranslationResponse>('/ai/translate', {\n text,\n from: sourceLang,\n to: targetLang\n });\n \n const translatedText = response.data.translated_text;\n translationCache.set(cacheKey, translatedText);\n return translatedText;\n } catch (error) {\n console.error('AI translation failed:', error);\n return text; // Return original text if translation fails\n }\n}\n\nexport async function translateText(\n text: string,\n sourceLang: string,\n targetLang: string,\n options: {\n format?: 'text' | 'html';\n alternatives?: number;\n } = {}\n): Promise<TranslationResponse> {\n try {\n const response = await fetch(TRANSLATE_API_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n q: text,\n source: sourceLang,\n target: targetLang,\n format: options.format || 'text',\n alternatives: options.alternatives || 0,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Translation API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return data;\n } catch (error) {\n console.error('Translation error:', error);\n throw error;\n }\n}\n\n// Convenience function for blog translation\nexport async function translateBlogContent(\n title: string,\n content: string,\n sourceLang: string,\n targetLang: string\n): Promise<{ translatedTitle: string; translatedContent: string }> {\n try {\n const [titleResult, contentResult] = await Promise.all([\n translateText(title, sourceLang, targetLang, { format: 'text' }),\n translateText(content, sourceLang, targetLang, { format: 'html' }),\n ]);\n\n return {\n translatedTitle: titleResult.translatedText,\n translatedContent: contentResult.translatedText,\n };\n } catch (error) {\n console.error('Blog translation error:', error);\n throw error;\n }\n}\n\n// Function to detect language (simple heuristic)\nexport function detectLanguage(text: string): 'cs' | 'en' {\n // Simple Czech language detection based on common Czech characters and words\n const czechChars = /[áčďéěíňóřšťúůýž]/i;\n const czechWords = /\\b(a|je|v|na|z|do|od|po|pro|při|pod|před|s|se|si|k|ke|t|ti|tom|tomu|tím|těm|těmu|toho|tomu|jeho|jehož|její|jejich|svůj|svá|své|svých|být|být|jsem|jsi|je|jsme|jste|jsou|mít|mít|mám|máš|má|náš|vaše|který|která|které|kterým|kterými|kterých|aby|aby|jako|jako|kdy|když|kde|kam|kudy|co|proč|jak|jak|kolik|kdo|kdy|jestli|li|jestliže|pokud|ačkoli|i když|proto|protože|tudíž|tedy|však|ale|avšak|nebo|buď|anebo|ani|když|pokud|jestli|li|jestliže|aby|aby|by|bych|bys|bychom|byste|by|by|by|by|by)\\b/i;\n \n if (czechChars.test(text) || czechWords.test(text)) {\n return 'cs';\n }\n \n return 'en';\n}\n\n// Czech to English mappings for common UI text (fallback)\nexport const czechToEnglishMap: Record<string, string> = {\n 'Komentáře': 'Comments',\n 'Zatím žádné komentáře.': 'No comments yet.',\n 'Napište komentář…': 'Write a comment...',\n 'Respektujte prosím pravidla slušné diskuse.': 'Please respect the rules of decent discussion.',\n 'Odeslat': 'Send',\n 'Odpovědět': 'Reply',\n 'Nahlásit': 'Report',\n 'Upravit': 'Edit',\n 'Smazat': 'Delete',\n 'Uložit': 'Save',\n 'Zrušit': 'Cancel',\n 'Načítám…': 'Loading...',\n 'Načíst další': 'Load more',\n 'Označeno administrátorem': 'Marked by administrator',\n 'Čeká na schválení': 'Awaiting approval',\n 'Váš komentář čeká na schválení (automatická moderace).': 'Your comment is awaiting approval (automatic moderation).',\n 'Nepodařilo se odeslat komentář': 'Failed to post comment',\n 'Žádost o odblokování odeslána.': 'Unban request sent.',\n 'Děkujeme za nahlášení. Moderátor se na komentář podívá.': 'Thank you for reporting. A moderator will review the comment.',\n 'Pro přidání komentáře se prosím': 'To add a comment, please',\n 'přihlaste': 'log in',\n 'Odpověď na komentář': 'Reply to comment',\n 'Zrušit odpověď': 'Cancel reply',\n 'Váš účet je dočasně zablokován pro komentování. Můžete odeslat žádost o odblokování s krátkým vysvětlením.': 'Your account is temporarily blocked from commenting. You can send an unban request with a brief explanation.',\n 'Vaše zpráva pro administrátory…': 'Your message for administrators...',\n 'Odeslat žádost o odblokování': 'Send unban request',\n 'Prosím o odblokování komentářů. Děkuji.': 'Please unblock my comments. Thank you.',\n 'Palec nahoru': 'Thumbs up',\n 'Srdíčko': 'Heart',\n 'Úsměv': 'Smile',\n 'Překvapení': 'Surprised',\n 'Palec dolů': 'Thumbs down',\n '(upraveno)': '(edited)',\n 'Admin': 'Admin',\n 'Anonym': 'Anonymous',\n 'Uživatel': 'User'\n};\n\n// Quick translation for common UI text using mapping\nexport const translateQuick = (czechText: string): string => {\n return czechToEnglishMap[czechText] || czechText;\n};\n\n// Translate comment content using AI with fallback to mapping\nexport const translateComment = async (czechText: string): Promise<string> => {\n // First try quick mapping for common phrases\n const quickTranslation = translateQuick(czechText);\n if (quickTranslation !== czechText) {\n return quickTranslation;\n }\n \n // For longer content, use AI translation\n if (czechText.length > 10) {\n return await translateWithAI(czechText, 'cs', 'en');\n }\n \n return czechText;\n};\n","import React, { useEffect, useState } from 'react';\nimport {\n Box,\n Container,\n Heading,\n Text,\n Table,\n Thead,\n Tbody,\n Tr,\n Th,\n Td,\n Button,\n HStack,\n VStack,\n Badge,\n Spinner,\n useToast,\n Image,\n Link,\n Alert,\n AlertIcon,\n AlertTitle,\n AlertDescription,\n useColorModeValue,\n Input,\n FormControl,\n FormLabel,\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalCloseButton,\n ModalBody,\n ModalFooter,\n useDisclosure,\n} from '@chakra-ui/react';\nimport { RefreshCw, ExternalLink, Calendar, Image as ImageIcon, Eye, Plus } from 'lucide-react';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport api, { API_URL } from '../../services/api';\nimport { getZoneramaManifestWithFallbacks } from '../../services/zonerama';\n\ninterface Album {\n id: string;\n title: string;\n url: string;\n date: string;\n photos_count: number;\n views_count?: number;\n photos: Array<{\n id: string;\n page_url: string;\n image_1500: string;\n }>;\n}\n\nconst resolveBackendUrl = (path: string) => {\n try {\n if (/^https?:\\/\\//i.test(path)) return path;\n if (path.startsWith('/cache') || path.startsWith('/uploads') || path.startsWith('/api/')) {\n let origin = '';\n try {\n const assetBase = (process.env.REACT_APP_ASSET_BASE_URL || '').trim();\n if (assetBase) {\n origin = new URL(assetBase, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n }\n } catch {}\n if (!origin) {\n try {\n origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n } catch {}\n }\n const abs = new URL(path, origin || (typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000'));\n return abs.toString();\n }\n return path;\n } catch {\n return path;\n }\n};\n\nconst GalleryAdminPage: React.FC = () => {\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const textSecondary = useColorModeValue('gray.600', 'gray.400');\n const [albums, setAlbums] = useState<Album[]>([]);\n const [loading, setLoading] = useState(true);\n const [refreshing, setRefreshing] = useState(false);\n const [error, setError] = useState<string>('');\n const toast = useToast();\n const { isOpen: isAddOpen, onOpen: onAddOpen, onClose: onAddClose } = useDisclosure();\n const [albumUrl, setAlbumUrl] = useState<string>('');\n const [photoLimit, setPhotoLimit] = useState<number>(50);\n const [adding, setAdding] = useState<boolean>(false);\n\n const fetchAlbums = async (): Promise<Album[]> => {\n setLoading(true);\n setError('');\n \n try {\n // Try to load from both sources and combine them (similar to frontpage)\n const [profileRes, albumsRes] = await Promise.allSettled([\n fetch(resolveBackendUrl('/cache/prefetch/zonerama_profile.json'), { cache: 'no-cache' }),\n fetch(resolveBackendUrl('/cache/prefetch/zonerama_albums.json'), { cache: 'no-cache' })\n ]);\n \n let combinedAlbums: Album[] = [];\n \n // Get profile albums (main source)\n if (profileRes.status === 'fulfilled' && profileRes.value.ok) {\n const profileData = await profileRes.value.json();\n if (profileData.albums && Array.isArray(profileData.albums)) {\n combinedAlbums = [...profileData.albums];\n }\n }\n \n // Get additional albums (fallback source)\n if (albumsRes.status === 'fulfilled' && albumsRes.value.ok) {\n const albumsData = await albumsRes.value.json();\n const blogAlbums = Array.isArray(albumsData) ? albumsData : [];\n \n // Filter out empty albums and avoid duplicates\n const validBlogAlbums = blogAlbums.filter((album: any) => \n album.id && \n album.title && \n !combinedAlbums.some(existing => existing.id === album.id)\n );\n \n combinedAlbums = [...combinedAlbums, ...validBlogAlbums];\n }\n // Fallback: synthesize albums from flat manifest when both sources fail/empty\n if (!combinedAlbums || combinedAlbums.length === 0) {\n try {\n const items = await getZoneramaManifestWithFallbacks();\n if (Array.isArray(items) && items.length > 0) {\n const byAlbum: Record<string, any[]> = {} as any;\n items.forEach((it: any) => {\n const aid = String(it.album_id || 'unknown');\n (byAlbum[aid] = byAlbum[aid] || []).push(it);\n });\n const synthesized: Album[] = Object.entries(byAlbum).map(([aid, arr]) => ({\n id: aid,\n title: 'Album',\n url: (arr[0] as any).page_url || '#',\n date: '',\n photos_count: (arr as any[]).length,\n photos: (arr as any[]).slice(0, 12).map((p: any) => ({ id: String(p.id || ''), page_url: String(p.page_url || ''), image_1500: String(p.src || p.local || '') })),\n }));\n combinedAlbums = synthesized;\n }\n } catch {}\n }\n\n // Sort albums by date (desc). Support both ISO (yyyy-mm-dd) and Czech (dd.mm.yyyy) formats\n const parseDate = (s: string): number => {\n const str = String(s || '').trim();\n if (!str) return 0;\n // Try ISO\n const iso = Date.parse(str);\n if (!Number.isNaN(iso)) return iso;\n // Try dd.mm.yyyy\n const m = str.match(/^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})$/);\n if (m) {\n const d = parseInt(m[1], 10);\n const mo = parseInt(m[2], 10) - 1;\n const y = parseInt(m[3], 10);\n return new Date(y, mo, d).getTime();\n }\n return 0;\n };\n combinedAlbums = [...combinedAlbums].sort((a, b) => {\n const da = parseDate(a.date);\n const db = parseDate(b.date);\n if (db !== da) return db - da;\n // Stable-ish fallback: keep deterministic order by id if dates equal/missing\n return String(b.id || '').localeCompare(String(a.id || ''));\n });\n\n setAlbums(combinedAlbums);\n return combinedAlbums;\n } catch (err: any) {\n setError(err.message || 'Nepodařilo se načíst alba');\n return [];\n } finally {\n setLoading(false);\n }\n };\n\n const handleRefresh = async () => {\n setRefreshing(true);\n \n try {\n // Use the api service which automatically includes authentication\n await api.post('/admin/gallery/refresh', {});\n\n toast({\n title: 'Galerie obnovena',\n description: 'Data z Zonerama byla úspěšně načtena',\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n\n // Reload albums after refresh with short polling (refresh runs async on server)\n let loaded: Album[] = [];\n for (let i = 0; i < 5; i++) {\n // small delay before each attempt to allow backend to finish\n await new Promise((r) => setTimeout(r, 1200));\n loaded = await fetchAlbums();\n if (loaded && loaded.length > 0) break;\n }\n } catch (err: any) {\n const errorMessage = err.response?.data?.error || err.message || 'Nepodařilo se obnovit galerii';\n \n toast({\n title: 'Chyba při obnově galerie',\n description: errorMessage,\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n \n console.error('Gallery refresh error:', err);\n } finally {\n setRefreshing(false);\n }\n };\n\n const handleAddAlbum = async () => {\n const link = albumUrl.trim();\n if (!link || !link.includes('/Album/')) {\n toast({\n title: 'Neplatný odkaz',\n description: 'URL musí obsahovat \"/Album/\"',\n status: 'error',\n duration: 4000,\n isClosable: true,\n });\n return;\n }\n setAdding(true);\n try {\n const limit = Number.isFinite(photoLimit) && photoLimit > 0 ? photoLimit : 50;\n await api.post('/admin/gallery/albums/fetch', { link, photo_limit: limit });\n toast({\n title: 'Album přidáno',\n description: 'Album bylo načteno a uloženo.',\n status: 'success',\n duration: 3000,\n isClosable: true,\n });\n onAddClose();\n setAlbumUrl('');\n await fetchAlbums();\n } catch (err: any) {\n const errorMessage = err?.response?.data?.error || err?.message || 'Nepodařilo se přidat album';\n toast({\n title: 'Chyba při přidání alba',\n description: errorMessage,\n status: 'error',\n duration: 5000,\n isClosable: true,\n });\n } finally {\n setAdding(false);\n }\n };\n\n useEffect(() => {\n fetchAlbums();\n }, []);\n\n const totalPhotos = albums.reduce((sum, album) => sum + album.photos_count, 0);\n const totalViews = albums.reduce((sum, album) => sum + (album.views_count || 0), 0);\n\n return (\n <AdminLayout requireAdmin={false}>\n <Container maxW=\"7xl\" py={8}>\n <VStack align=\"stretch\" spacing={6}>\n {/* Header */}\n <HStack justify=\"space-between\" align=\"center\" flexWrap=\"wrap\">\n <VStack align=\"start\" spacing={1}>\n <Heading size=\"xl\">Správa galerie</Heading>\n <Text color=\"gray.600\">\n Správa alb a fotografií ze Zonerama\n </Text>\n </VStack>\n\n <HStack spacing={3}>\n <Button\n leftIcon={<Plus size={18} />}\n colorScheme=\"green\"\n onClick={onAddOpen}\n >\n Přidat album\n </Button>\n <Button\n leftIcon={<RefreshCw size={18} />}\n colorScheme=\"blue\"\n onClick={handleRefresh}\n isLoading={refreshing}\n loadingText=\"Obnova...\"\n >\n Obnovit z Zonerama\n </Button>\n </HStack>\n </HStack>\n\n {/* Zonerama Info */}\n <Alert status=\"info\" borderRadius=\"md\">\n <AlertIcon />\n <Box>\n <AlertTitle>Zonerama integrace</AlertTitle>\n <AlertDescription>\n Alba jsou automaticky načítána ze Zonerama profilu. Klikněte na \"Obnovit z Zonerama\" pro synchronizaci s nejnovějšími daty.\n </AlertDescription>\n </Box>\n </Alert>\n\n {/* Statistics */}\n {!loading && !error && albums.length > 0 && (\n <HStack spacing={4} flexWrap=\"wrap\">\n <Badge colorScheme=\"purple\" fontSize=\"md\" p={3} borderRadius=\"md\">\n {albums.length} alb\n </Badge>\n <Badge colorScheme=\"blue\" fontSize=\"md\" p={3} borderRadius=\"md\">\n {totalPhotos} fotografií\n </Badge>\n <Badge colorScheme=\"green\" fontSize=\"md\" p={3} borderRadius=\"md\">\n {totalViews} zhlédnutí\n </Badge>\n </HStack>\n )}\n\n {/* Loading State */}\n {loading && (\n <VStack spacing={4} py={12}>\n <Spinner size=\"xl\" color=\"brand.primary\" />\n <Text color=\"gray.600\">Načítám alba...</Text>\n </VStack>\n )}\n\n {/* Error State */}\n {error && !loading && (\n <Alert status=\"error\" borderRadius=\"md\">\n <AlertIcon />\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n {/* Empty State */}\n {!loading && !error && albums.length === 0 && (\n <Box\n bg={cardBg}\n borderWidth=\"1px\"\n borderRadius=\"lg\"\n p={12}\n textAlign=\"center\"\n >\n <VStack spacing={4}>\n <ImageIcon size={48} color=\"gray\" />\n <Heading size=\"md\" color=\"gray.600\">\n Zatím nejsou k dispozici žádná alba\n </Heading>\n <Text color=\"gray.500\">\n Klikněte na tlačítko \"Obnovit z Zonerama\" pro načtení alb.\n </Text>\n <Button\n leftIcon={<RefreshCw size={18} />}\n colorScheme=\"blue\"\n onClick={handleRefresh}\n isLoading={refreshing}\n >\n Obnovit z Zonerama\n </Button>\n </VStack>\n </Box>\n )}\n\n {/* Albums Table */}\n {!loading && !error && albums.length > 0 && (\n <Box\n bg={cardBg}\n borderWidth=\"1px\"\n borderRadius=\"lg\"\n overflow=\"hidden\"\n boxShadow=\"sm\"\n >\n <Table variant=\"simple\">\n <Thead bg={useColorModeValue('gray.50', 'gray.900')}>\n <Tr>\n <Th width=\"100px\">Náhled</Th>\n <Th>Název</Th>\n <Th width=\"120px\">Datum</Th>\n <Th width=\"100px\" isNumeric>Fotky</Th>\n <Th width=\"120px\" isNumeric>Zhlédnutí</Th>\n <Th width=\"180px\">Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {albums.map((album) => {\n const coverPhoto = album.photos && album.photos.length > 0 \n ? album.photos[0] \n : null;\n\n return (\n <Tr key={album.id} _hover={{ bg: 'gray.50' }}>\n <Td>\n {coverPhoto ? (\n <Image\n src={resolveBackendUrl(coverPhoto.image_1500)}\n alt={album.title}\n boxSize=\"60px\"\n objectFit=\"cover\"\n borderRadius=\"md\"\n />\n ) : (\n <Box\n boxSize=\"60px\"\n bg=\"gray.200\"\n borderRadius=\"md\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <ImageIcon size={24} color=\"gray\" />\n </Box>\n )}\n </Td>\n <Td>\n <Text fontWeight=\"600\" color=\"gray.800\" noOfLines={2}>\n {album.title}\n </Text>\n </Td>\n <Td>\n <HStack spacing={1} fontSize=\"sm\" color=\"gray.600\">\n <Calendar size={14} />\n <Text>{album.date}</Text>\n </HStack>\n </Td>\n <Td isNumeric>\n <Badge colorScheme=\"blue\">\n {album.photos_count}\n </Badge>\n </Td>\n <Td isNumeric>\n <HStack spacing={1} justify=\"flex-end\">\n <Eye size={14} />\n <Text fontSize=\"sm\">{album.views_count || 0}</Text>\n </HStack>\n </Td>\n <Td>\n <HStack spacing={2}>\n <Button\n as={Link}\n href={`/galerie/album/${album.id}`}\n target=\"_blank\"\n size=\"sm\"\n colorScheme=\"purple\"\n variant=\"outline\"\n >\n Náhled\n </Button>\n <Button\n as={Link}\n href={album.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n size=\"sm\"\n colorScheme=\"blue\"\n variant=\"ghost\"\n rightIcon={<ExternalLink size={14} />}\n >\n Zonerama\n </Button>\n </HStack>\n </Td>\n </Tr>\n );\n })}\n </Tbody>\n </Table>\n </Box>\n )}\n <Modal isOpen={isAddOpen} onClose={onAddClose} size=\"lg\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Přidat Zonerama album</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack align=\"stretch\" spacing={4}>\n <FormControl>\n <FormLabel>URL Zonerama alba</FormLabel>\n <Input\n placeholder=\"https://eu.zonerama.com/…/Album/12345\"\n value={albumUrl}\n onChange={(e) => setAlbumUrl(e.target.value)}\n />\n </FormControl>\n <FormControl>\n <FormLabel>Limit fotek</FormLabel>\n <Input\n type=\"number\"\n min={1}\n max={200}\n value={String(photoLimit)}\n onChange={(e) => {\n const v = parseInt(e.target.value || '0', 10);\n setPhotoLimit(Number.isFinite(v) ? v : 50);\n }}\n />\n </FormControl>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <HStack spacing={3}>\n <Button variant=\"ghost\" onClick={onAddClose}>Zrušit</Button>\n <Button colorScheme=\"blue\" onClick={handleAddAlbum} isLoading={adding}>Načíst album</Button>\n </HStack>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </VStack>\n </Container>\n </AdminLayout>\n );\n};\n\nexport default GalleryAdminPage;\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Box,\n Button,\n Center,\n Container,\n HStack,\n Heading,\n Select,\n Spinner,\n Text,\n VStack,\n useToast,\n} from '@chakra-ui/react';\nimport { useParams, Link as RouterLink } from 'react-router-dom';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport { adminGetVisualData, VisualData, adminUpdateWinner, adminListPrizes, adminSetWinnerPrize, SweepstakePrize } from '../../services/sweepstakes';\nimport { usePublicSettings } from '../../hooks/usePublicSettings';\n\nconst SweepstakeVisualPage: React.FC = () => {\n const { id } = useParams();\n const toast = useToast();\n const [data, setData] = useState<VisualData | null>(null);\n const [loading, setLoading] = useState(true);\n const [variant, setVariant] = useState<'roulette'>('roulette');\n const [theme, setTheme] = useState<'dark' | 'light'>('dark');\n const [confettiOn, setConfettiOn] = useState<boolean>(true);\n const [soundOn, setSoundOn] = useState<boolean>(true);\n const [revealIndex, setRevealIndex] = useState(0); // which winner we are revealing next\n const [playing, setPlaying] = useState(false);\n const [currentIdx, setCurrentIdx] = useState(0); // cycler index\n const timerRef = useRef<number | null>(null);\n const wheelRef = useRef<HTMLDivElement | null>(null);\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const wheelAngleRef = useRef<number>(0);\n const [wheelAngle, setWheelAngle] = useState<number>(0);\n const imgCacheRef = useRef<Record<number, HTMLImageElement>>({});\n const [prizes, setPrizes] = useState<SweepstakePrize[]>([]);\n\n // Roulette scroller state\n const railRef = useRef<HTMLDivElement | null>(null);\n const [stripItems, setStripItems] = useState<typeof entries>([]);\n const [scrollPx, setScrollPx] = useState<number>(0);\n const [rouletteKey, setRouletteKey] = useState<number>(0); // force re-render/reflow per run\n const [weightingOn, setWeightingOn] = useState<boolean>(true);\n const [speed, setSpeed] = useState<'slow'|'normal'|'fast'>('normal');\n const [drama, setDrama] = useState<number>(3);\n const [transitionMs, setTransitionMs] = useState<number>(4600);\n\n const entries = data?.entries || [];\n const winners = data?.winners || [];\n const { data: publicSettings } = usePublicSettings();\n const clubLogo = publicSettings?.club_logo_url || '';\n const primary = (publicSettings?.primary_color || '#1e3a8a').trim();\n\n const targetUserId = winners[revealIndex]?.user_id;\n const targetIndex = useMemo(() => entries.findIndex(e => e.user_id === targetUserId), [entries, targetUserId]);\n\n // Simple beep\n const beep = () => {\n if (!soundOn) return;\n try {\n const ctx = new (window.AudioContext || (window as any).webkitAudioContext)();\n const o = ctx.createOscillator();\n const g = ctx.createGain();\n o.connect(g); g.connect(ctx.destination);\n o.type = 'triangle'; o.frequency.value = 880;\n g.gain.value = 0.001; // soft\n o.start();\n g.gain.exponentialRampToValueAtTime(0.5, ctx.currentTime + 0.02);\n g.gain.exponentialRampToValueAtTime(0.0001, ctx.currentTime + 0.18);\n o.stop(ctx.currentTime + 0.2);\n } catch {}\n };\n\n const fireConfetti = () => {\n if (!confettiOn) return;\n const host = document.getElementById('visual-host');\n if (!host) return;\n const N = 80;\n for (let i = 0; i < N; i++) {\n const d = document.createElement('div');\n d.className = 'confetti';\n const size = 6 + Math.random() * 6;\n d.style.position = 'absolute';\n d.style.left = (10 + Math.random() * 80) + '%';\n d.style.top = '0%';\n d.style.width = `${size}px`;\n d.style.height = `${size * (0.5 + Math.random())}px`;\n d.style.background = `hsl(${Math.floor(Math.random() * 360)}, 80%, 60%)`;\n d.style.opacity = '0.9';\n d.style.transform = `translate(-50%,-50%) rotate(${Math.random() * 360}deg)`;\n d.style.borderRadius = '1px';\n d.style.pointerEvents = 'none';\n d.style.animation = `fall ${1.5 + Math.random() * 1.5}s ease-out forwards`;\n host.appendChild(d);\n setTimeout(() => { if (d.parentNode) d.parentNode.removeChild(d); }, 3500);\n }\n };\n\n const hexToRgb = (hex: string): {r:number; g:number; b:number} | null => {\n const h = hex.replace('#','').trim();\n if (![3,6].includes(h.length)) return null;\n const n = h.length === 3 ? h.split('').map(c=>c+c).join('') : h;\n const r = parseInt(n.slice(0,2),16), g = parseInt(n.slice(2,4),16), b = parseInt(n.slice(4,6),16);\n if ([r,g,b].some(x=>Number.isNaN(x))) return null; return { r,g,b };\n };\n const rgbToHsl = (r:number,g:number,b:number): [number,number,number] => {\n r/=255; g/=255; b/=255; const max=Math.max(r,g,b), min=Math.min(r,g,b); let h=0,s=0,l=(max+min)/2;\n if (max!==min){ const d=max-min; s=l>0.5? d/(2-max-min) : d/(max+min);\n switch(max){ case r: h=(g-b)/d+(g<b?6:0); break; case g: h=(b-r)/d+2; break; case b: h=(r-g)/d+4; break; }\n h/=6;\n }\n return [h,s,l];\n };\n const hslToCss = (h:number,s:number,l:number) => `hsl(${Math.round(h*360)}, ${Math.round(s*100)}%, ${Math.round(l*100)}%)`;\n\n const startCycler = () => {\n if (!entries.length || revealIndex >= winners.length) return;\n setPlaying(true);\n let speed = 50; // ms\n let steps = 0;\n const maxWarmup = 40;\n const decelStart = maxWarmup + 40;\n const slowMax = decelStart + 80;\n const loop = () => {\n setCurrentIdx((idx) => (idx + 1) % entries.length);\n steps++;\n // warmup constant speed, then decelerate\n if (steps < maxWarmup) {\n timerRef.current = window.setTimeout(loop, speed);\n } else if (steps < decelStart) {\n speed += 5; // slight slow\n timerRef.current = window.setTimeout(loop, speed);\n } else if (steps < slowMax) {\n speed += 15;\n timerRef.current = window.setTimeout(loop, speed);\n } else {\n // Try to land on target\n const idx = (currentIdx + 1) % entries.length;\n setCurrentIdx(idx);\n const landing = idx === targetIndex;\n if (!landing) {\n speed += 30;\n timerRef.current = window.setTimeout(loop, speed);\n } else {\n // reveal done\n setPlaying(false);\n setRevealIndex((i) => i + 1);\n beep(); fireConfetti();\n }\n }\n };\n loop();\n };\n\n // Draw segmented wheel\n const drawWheel = () => {\n const canvas = canvasRef.current; if (!canvas) return;\n const ctx = canvas.getContext('2d'); if (!ctx) return;\n const W = canvas.width = 440; const H = canvas.height = 440; // fixed size\n const cx = W/2, cy = H/2, r = Math.min(W, H)/2 - 8;\n ctx.clearRect(0,0,W,H);\n const n = Math.max(entries.length, 1);\n const angle = (Math.PI*2)/n;\n const base = hexToRgb(primary) || { r: 30, g: 58, b: 138 };\n const [bh, bs, bl] = rgbToHsl(base.r, base.g, base.b);\n for (let i=0;i<n;i++){\n const a0 = i*angle, a1 = a0 + angle;\n ctx.beginPath(); ctx.moveTo(cx,cy);\n ctx.arc(cx,cy,r,a0,a1,false); ctx.closePath();\n const l = theme==='dark' ? (0.30 + 0.15 * ((i%2)?1:0)) : (0.55 + 0.10 * ((i%2)?1:0));\n const s = Math.min(0.9, bs + 0.1);\n const h = (bh + (i/n)*0.08) % 1; // slight hue drift for variety\n ctx.fillStyle = hslToCss(h, s, l);\n ctx.fill();\n // border\n ctx.strokeStyle = theme==='dark' ? 'rgba(255,255,255,0.15)' : 'rgba(0,0,0,0.1)';\n ctx.lineWidth = 2; ctx.stroke();\n // label\n const label = (entries[i]?.display_name || '').trim();\n if (label){\n ctx.save();\n ctx.translate(cx,cy);\n ctx.rotate(a0 + angle/2);\n ctx.textAlign = 'right'; ctx.fillStyle = 'white'; ctx.font = '700 13px system-ui, sans-serif';\n const text = label.length>18? (label.slice(0,17)+'…') : label;\n ctx.fillText(text, r - 10, 5);\n ctx.restore();\n }\n // avatar (small circle near rim)\n const avatarUrl = entries[i]?.avatar_url;\n if (avatarUrl) {\n let img = imgCacheRef.current[i];\n const drawImg = (im: HTMLImageElement) => {\n ctx.save();\n const mid = a0 + angle/2;\n const ar = r - 36;\n const ax = cx + Math.cos(mid) * ar;\n const ay = cy + Math.sin(mid) * ar;\n const sz = 26;\n ctx.beginPath(); ctx.arc(ax, ay, sz/2, 0, Math.PI*2); ctx.closePath(); ctx.clip();\n ctx.drawImage(im, ax - sz/2, ay - sz/2, sz, sz);\n ctx.restore();\n };\n if (img && img.complete) drawImg(img);\n else {\n img = new Image(); img.crossOrigin = 'anonymous'; img.src = avatarUrl; img.onload = () => { drawImg(img!); };\n imgCacheRef.current[i] = img;\n }\n }\n }\n // center circle\n ctx.beginPath(); ctx.arc(cx,cy,20,0,Math.PI*2); ctx.fillStyle = theme==='dark'? '#111':'#eee'; ctx.fill();\n };\n\n const startWheel = () => {\n if (!entries.length || revealIndex >= winners.length) return;\n const n = entries.length; if (!n) return;\n const target = targetIndex;\n if (target < 0) { startCycler(); return; }\n setPlaying(true);\n // Compute final angle so pointer at top hits target center\n const per = 360 / n;\n const center = target * per + per/2;\n const spins = 4 + Math.floor(Math.random()*3); // 4-6 spins\n const final = spins*360 + (360 - center);\n wheelAngleRef.current = final;\n setWheelAngle(final);\n // After transition ends (~4s), reveal winner\n const duration = 4200;\n window.setTimeout(() => {\n setPlaying(false);\n setRevealIndex(i=>i+1);\n beep(); fireConfetti();\n }, duration);\n };\n\n const startRoulette = () => {\n if (!entries.length || revealIndex >= winners.length) return;\n const target = targetIndex;\n if (target < 0) { startCycler(); return; }\n setPlaying(true);\n // Build a long strip of avatars.\n // Pool selection: when weighting is ON, keep duplicates from entries; when OFF, use unique users (flat odds).\n const uniqueMap = new Map<number, typeof entries[0]>();\n for (const e of entries) { if (!uniqueMap.has(e.user_id)) uniqueMap.set(e.user_id, e); }\n const pool = weightingOn ? entries : Array.from(uniqueMap.values());\n const total = Math.max(80, Math.min(240, pool.length * 4));\n const rnd = (n: number) => Math.floor(Math.random() * n);\n const list: typeof entries = [] as any;\n for (let i = 0; i < total - 10; i++) {\n list.push(pool[rnd(pool.length)]);\n }\n // Ensure target appears near the end, centered under pointer at stop\n const targetEntry = entries[target];\n const tailPad = 6;\n for (let i = 0; i < tailPad - 1; i++) list.push(pool[rnd(pool.length)]);\n list.push(targetEntry);\n setStripItems(list);\n\n // Next tick measure viewport + compute scroll distance\n window.requestAnimationFrame(() => {\n try {\n const host = document.getElementById('visual-host');\n const rail = railRef.current;\n if (!host || !rail) { setPlaying(false); return; }\n const viewport = host.getBoundingClientRect();\n const cardW = 72; // width incl. margin approx\n const gap = 8;\n const itemSize = cardW + gap;\n const landingIndex = list.length - 1; // last item is target\n const centerOffset = Math.max(0, (viewport.width - cardW) / 2);\n const distance = landingIndex * itemSize - centerOffset;\n // Prime initial position\n setScrollPx(0);\n setRouletteKey((k) => k + 1);\n // Start animation in next frame\n setTimeout(() => {\n // Add extra laps based on drama level (1..5)\n const dramaFactor = Math.max(0, Math.min(5, Number(drama) || 3));\n const extra = viewport.width * dramaFactor + rnd(viewport.width);\n setScrollPx(distance + extra);\n // Duration based on speed\n const mul = speed === 'slow' ? 1.25 : (speed === 'fast' ? 0.75 : 1.0);\n const duration = Math.round(4600 * mul);\n setTransitionMs(duration);\n window.setTimeout(() => {\n setPlaying(false);\n setRevealIndex((i) => i + 1);\n beep(); fireConfetti();\n }, duration + 50);\n }, 40);\n } catch {\n setPlaying(false);\n }\n });\n };\n\n const onStart = () => { startRoulette(); };\n\n // Reveal All logic\n const [revealAll, setRevealAll] = useState(false);\n useEffect(() => {\n if (!revealAll) return;\n if (!playing && revealIndex < winners.length) {\n const t = window.setTimeout(() => onStart(), 400);\n return () => window.clearTimeout(t);\n }\n if (revealIndex >= winners.length) {\n setRevealAll(false);\n }\n }, [revealAll, playing, revealIndex, winners.length, variant]);\n\n const onFullscreen = () => {\n const el = document.getElementById('visual-host');\n if (el && el.requestFullscreen) el.requestFullscreen().catch(()=>{});\n };\n\n useEffect(() => {\n let active = true;\n (async () => {\n try {\n setLoading(true);\n const res = await adminGetVisualData(Number(id));\n if (!active) return;\n setData(res);\n setVariant('roulette');\n try { const list = await adminListPrizes(Number(id)); if (active) setPrizes(list); } catch {}\n } catch (e: any) {\n toast({ status: 'error', title: 'Nelze načíst data vizualizace' });\n } finally {\n if (active) setLoading(false);\n }\n })();\n return () => { active = false; if (timerRef.current) window.clearTimeout(timerRef.current); };\n }, [id]);\n\n // Wheel variant removed no canvas redraw needed\n\n if (loading) {\n return (\n <AdminLayout>\n <Container maxW=\"6xl\" py={8}><Spinner /></Container>\n </AdminLayout>\n );\n }\n if (!data) {\n return (\n <AdminLayout>\n <Container maxW=\"6xl\" py={8}><Text>Žádná data</Text></Container>\n </AdminLayout>\n );\n }\n\n const shownWinners = winners.slice(0, revealIndex);\n\n return (\n <AdminLayout>\n <Container maxW=\"6xl\" py={6}>\n <HStack justify=\"space-between\" mb={3}>\n <Heading size=\"lg\">Vizualizace {data.sweepstake.title}</Heading>\n <HStack>\n <Button as={RouterLink} to=\"/admin/sweepstakes\" variant=\"outline\">Zpět</Button>\n <Button onClick={onFullscreen} variant=\"outline\">Fullscreen</Button>\n </HStack>\n </HStack>\n <HStack mb={4} spacing={4}>\n <Select value={theme} onChange={(e)=>setTheme(e.target.value as any)} maxW=\"200px\">\n <option value=\"dark\">Tmavé pozadí</option>\n <option value=\"light\">Světlé pozadí</option>\n </Select>\n <Select value={speed} onChange={(e)=>setSpeed(e.target.value as any)} maxW=\"200px\">\n <option value=\"slow\">Rychlost: Pomalá</option>\n <option value=\"normal\">Rychlost: Normální</option>\n <option value=\"fast\">Rychlost: Rychlá</option>\n </Select>\n <Select value={String(drama)} onChange={(e)=>setDrama(Number(e.target.value)||3)} maxW=\"200px\">\n <option value=\"1\">Drama: 1</option>\n <option value=\"2\">Drama: 2</option>\n <option value=\"3\">Drama: 3</option>\n <option value=\"4\">Drama: 4</option>\n <option value=\"5\">Drama: 5</option>\n </Select>\n <HStack>\n <Button size=\"sm\" variant={confettiOn? 'solid':'outline'} onClick={()=>setConfettiOn(v=>!v)}>{confettiOn? 'Konfety: Zap' : 'Konfety: Vyp'}</Button>\n <Button size=\"sm\" variant={soundOn? 'solid':'outline'} onClick={()=>setSoundOn(v=>!v)}>{soundOn? 'Zvuk: Zap' : 'Zvuk: Vyp'}</Button>\n <Button size=\"sm\" variant={weightingOn? 'solid':'outline'} onClick={()=>setWeightingOn(v=>!v)}>{weightingOn? 'Vážit účastí: Zap' : 'Vážit účastí: Vyp'}</Button>\n </HStack>\n <Button colorScheme=\"blue\" onClick={onStart} isDisabled={playing || revealIndex >= winners.length}>\n {revealIndex >= winners.length ? 'Všichni výherci odhaleni' : (playing ? 'Probíhá…' : 'Start')}\n </Button>\n <Button variant=\"outline\" onClick={()=>setRevealAll(true)} isDisabled={playing || revealIndex >= winners.length}>Odhalit všechny</Button>\n <Button variant=\"outline\" onClick={()=>{\n // CSV export: user_id, name, prize_name\n const rows = winners.map((w:any)=>{\n const e = entries.find(x=>x.user_id===w.user_id);\n return [w.user_id, (e?.display_name||'').replaceAll('\"','\"\"'), (w.prize_name||'').replaceAll('\"','\"\"')];\n });\n const csv = ['user_id,name,prize'].concat(rows.map(r=>`${r[0]},\"${r[1]}\",\"${r[2]}\"`)).join('\\n');\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a'); a.href=url; a.download=`soutez_${id}_vitezove.csv`; a.click(); URL.revokeObjectURL(url);\n }}>Export CSV</Button>\n <Text color=\"gray.500\">Výherci: {revealIndex}/{winners.length}</Text>\n </HStack>\n\n <Box id=\"visual-host\" borderWidth=\"1px\" borderRadius=\"md\" p={4} minH=\"400px\" position=\"relative\" overflow=\"hidden\" bg={theme==='dark' ? 'black' : 'white'} color={theme==='dark' ? 'white' : 'black'}>\n <Center h=\"380px\" flexDir=\"column\">\n <Box position=\"relative\" w=\"100%\" maxW=\"960px\" h=\"220px\">\n {/* pointer */}\n <Box position=\"absolute\" left=\"50%\" top=\"10px\" transform=\"translateX(-50%)\" zIndex={3}\n borderLeft=\"10px solid transparent\" borderRight=\"10px solid transparent\" borderBottom={`16px solid ${theme==='dark'?'#e2e8f0':'#1a202c'}`} />\n {/* center divider */}\n <Box pointerEvents=\"none\" position=\"absolute\" left=\"50%\" top={42} bottom={22} width=\"2px\" transform=\"translateX(-1px)\" zIndex={2}\n style={{ background: theme==='dark' ? 'rgba(255,255,255,0.25)' : 'rgba(0,0,0,0.2)' }} />\n {/* scrolling rail */}\n <Box key={rouletteKey} position=\"absolute\" left={0} right={0} top={40} bottom={20} overflow=\"hidden\" borderRadius=\"md\" borderWidth=\"1px\" bg={theme==='dark'?'#0b0b0b':'#f9fafb'}>\n <div ref={railRef} style={{ display:'flex', alignItems:'center', gap:8, padding:'8px', transform:`translateX(-${scrollPx}px)`, transition: playing? `transform ${transitionMs/1000}s cubic-bezier(.2,.8,.2,1)` : undefined }}>\n {stripItems.map((it, idx) => (\n <div key={idx} style={{ width:72, height:72, borderRadius:12, background: theme==='dark'?'#111':'#fff', boxShadow: theme==='dark'?'0 1px 2px rgba(255,255,255,0.08)':'0 1px 2px rgba(0,0,0,0.08)', display:'flex', alignItems:'center', justifyContent:'center', overflow:'hidden', border:'1px solid rgba(0,0,0,0.08)' }}>\n {it?.avatar_url ? (\n // eslint-disable-next-line jsx-a11y/alt-text\n <img src={it.avatar_url} style={{ width:'100%', height:'100%', objectFit:'cover' }} />\n ) : (\n <span style={{ fontSize:24, fontWeight:800 }}>{(it?.display_name||'?').slice(0,1)}</span>\n )}\n </div>\n ))}\n </div>\n {/* fade edges */}\n <Box pointerEvents=\"none\" position=\"absolute\" left={0} top={0} bottom={0} width=\"120px\" zIndex={1}\n style={{ background: theme==='dark' ? 'linear-gradient(to right, rgba(0,0,0,0.85), rgba(0,0,0,0))' : 'linear-gradient(to right, rgba(255,255,255,0.95), rgba(255,255,255,0))' }} />\n <Box pointerEvents=\"none\" position=\"absolute\" right={0} top={0} bottom={0} width=\"120px\" zIndex={1}\n style={{ background: theme==='dark' ? 'linear-gradient(to left, rgba(0,0,0,0.85), rgba(0,0,0,0))' : 'linear-gradient(to left, rgba(255,255,255,0.95), rgba(255,255,255,0))' }} />\n </Box>\n <Text mt={4} opacity={0.8} textAlign=\"center\">Ruleta</Text>\n </Box>\n </Center>\n </Box>\n\n <VStack align=\"stretch\" mt={6} spacing={2}>\n <Heading size=\"md\">Odhalení</Heading>\n {shownWinners.length === 0 && <Text color=\"gray.500\">Zatím žádný výherce</Text>}\n {shownWinners.map((w, idx) => {\n const e = entries.find(x => x.user_id === w.user_id);\n const [status, setStatus] = [w.claim_status || 'pending', undefined];\n return (\n <HStack key={`${w.user_id}-${idx}`} spacing={8} borderWidth=\"1px\" borderRadius=\"md\" p={3} align=\"center\">\n <HStack spacing={3} flex={1}>\n {e?.avatar_url && (<img src={e.avatar_url} alt=\"avatar\" style={{ width: 36, height: 36, borderRadius: '50%' }} />)}\n <Text fontWeight=\"700\">{e?.display_name || `Uživatel #${w.user_id}`}</Text>\n {w.prize_name && <Text color=\"gray.500\">— {w.prize_name}</Text>}\n </HStack>\n <HStack>\n <Select size=\"sm\" value={w.claim_status || 'pending'} onChange={async (ev)=>{\n const val = ev.target.value as 'pending'|'claimed'|'delivered';\n try {\n if (w.id) await adminUpdateWinner(Number(id), w.id, { claim_status: val });\n // update local state without refetch\n setData((prev)=> prev ? ({ ...prev, winners: prev.winners.map((x,i)=> i===idx ? { ...x, claim_status: val } : x) }) : prev);\n } catch { toast({ status: 'error', title: 'Nelze uložit stav' }); }\n }} maxW=\"160px\">\n <option value=\"pending\">čeká</option>\n <option value=\"claimed\">vyzvednuto</option>\n <option value=\"delivered\">předáno</option>\n </Select>\n </HStack>\n </HStack>\n );\n })}\n </VStack>\n </Container>\n <style>{`\n @keyframes fall { \n 0% { transform: translate(-50%,-50%) rotate(0deg); top: 0%; opacity: 1 }\n 100% { transform: translate(-50%, 520px) rotate(360deg); top: 100%; opacity: 0.2 }\n }\n `}</style>\n </AdminLayout>\n );\n};\n\nexport default SweepstakeVisualPage;\n","import { Box, Container, Heading, Image, Spinner, Stack, Text, HStack, Badge, Link, SimpleGrid, Button, AspectRatio, useColorModeValue, Flex, VStack, Tag, Breadcrumb, BreadcrumbItem, BreadcrumbLink, Modal, ModalOverlay, ModalContent, ModalBody, ModalCloseButton, IconButton, useToast } from '@chakra-ui/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useParams, Link as RouterLink, useNavigate } from 'react-router-dom';\nimport { getArticle, getArticleBySlug, getArticleMatchLink, trackArticleView, getArticles } from '../services/articles';\nimport { articleRead } from '../services/engagement';\nimport MainLayout from '../components/layout/MainLayout';\nimport DOMPurify from 'dompurify';\nimport { Helmet } from 'react-helmet-async';\nimport NewsletterCTA from '../components/common/NewsletterCTA';\nimport EmbeddedPoll from '../components/polls/EmbeddedPoll';\nimport { ArrowRight, Eye, Clock, SearchX, ChevronLeft, ChevronRight, ExternalLink, Copy, Play } from 'lucide-react';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { trackEvent as umamiTrackEvent, trackMatchView as umamiTrackMatchView, trackVideoPlay as umamiTrackVideoPlay, trackArticleView as umamiTrackArticleView } from '../utils/umami';\nimport { assetUrl } from '../utils/url';\nimport { API_URL } from '../services/api';\nimport TeamLogo from '../components/common/TeamLogo';\nimport MatchModal from '../components/home/MatchModal';\nimport { extractPalette } from '../utils/colors';\nimport { getTeamLogo } from '../utils/sportLogosAPI';\nimport { getBanners, Banner as UIBanner } from '../services/banners';\nimport FilePreview from '../components/common/FilePreview';\nimport { usePublicSettings } from '../hooks/usePublicSettings';\nimport InstagramGeneratorButton from '../components/admin/InstagramGeneratorButton';\nimport { MatchSnapshot } from '../services/instagram';\nimport { Widget } from '../components/widgets/Widget';\nimport { MatchesWidget } from '../components/widgets/MatchesWidget';\nimport { getCompetitionAliasesPublic, CompetitionAlias } from '../services/competitionAliases';\nimport { getUpcomingEvents } from '../services/eventService';\nimport CommentsSection from '../components/comments/CommentsSection';\nimport { startOfMonth, startOfWeek, addDays, isSameMonth, format, addMonths } from 'date-fns';\nimport { cs } from 'date-fns/locale';\n\nconst toText = (html?: string) => {\n if (!html) return '';\n const div = document.createElement('div');\n div.innerHTML = html;\n return (div.textContent || div.innerText || '').replace(/\\s+/g, ' ').trim();\n};\n\nconst ArticleDetailPage: React.FC = () => {\n const { t } = useTranslation();\n const { id, slug } = useParams<{ id?: string; slug?: string }>();\n const navigate = useNavigate();\n const { data, isLoading, isError } = useQuery({\n queryKey: ['article', slug ? `slug:${slug}` : `id:${id}`],\n queryFn: () => (slug ? getArticleBySlug(slug!) : getArticle(id!)),\n enabled: Boolean(slug || id),\n });\n\n \n\n \n \n // Load competition aliases to resolve category → alias mapping for MatchesWidget filtering\n const aliasesQ = useQuery<{ list: CompetitionAlias[] }>({\n queryKey: ['competition-aliases-public'],\n queryFn: async () => {\n try {\n const list = await getCompetitionAliasesPublic();\n return { list };\n } catch {\n return { list: [] as CompetitionAlias[] };\n }\n },\n staleTime: 5 * 60 * 1000,\n });\n\n const normalize = (s?: string) => String(s || '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase();\n\n const resolveAliasName = React.useCallback((compName?: string): string => {\n const name = String(compName || '');\n const normComp = normalize(name);\n const list = aliasesQ.data?.list || [];\n for (const a of list) {\n const aAlias = normalize(a.alias);\n const aOrig = normalize(a.original_name || '');\n if (aOrig && (normComp.includes(aOrig) || aOrig.includes(normComp))) return a.alias;\n if (aAlias && (normComp.includes(aAlias) || aAlias.includes(normComp))) return a.alias;\n }\n return name;\n }, [aliasesQ.data?.list]);\n\n // Determine which category name to use for MatchesWidget (prefer backend-provided competition_alias)\n const categoryNameForMatches = React.useMemo(() => {\n const fromBackend = (data as any)?.competition_alias;\n if (fromBackend) return fromBackend as string;\n const cat = (data as any)?.category?.name as string | undefined;\n if (!cat) return undefined;\n return resolveAliasName(cat);\n }, [(data as any)?.competition_alias, (data as any)?.category?.name, resolveAliasName]);\n\n \n // UI colors and public settings\n const { data: publicSettings } = usePublicSettings();\n const cardBg = useColorModeValue('white','gray.900');\n const videoBg = useColorModeValue('gray.50','gray.800');\n const textMuted = useColorModeValue('gray.600','gray.400');\n // Hoist all color mode values to top-level to avoid conditional hook calls\n const videoTitleColor = useColorModeValue('gray.700','gray.300');\n const galleryBg = useColorModeValue('gray.50','gray.800');\n const galleryBorder = useColorModeValue('gray.200','gray.700');\n const attachmentsBg = useColorModeValue('gray.50','gray.800');\n // Mini calendar colors\n const miniTodayBg = useColorModeValue('blue.50','blue.900');\n const miniHoverBg = useColorModeValue('gray.50','gray.700');\n const youtubeCommentsBg = useColorModeValue('white','gray.900');\n\n // Lightbox state\n const [isLightboxOpen, setIsLightboxOpen] = React.useState(false);\n const [lightboxImages, setLightboxImages] = React.useState<string[]>([]);\n const [lightboxIndex, setLightboxIndex] = React.useState(0);\n const toast = useToast();\n const [shuffleTick, setShuffleTick] = React.useState(0);\n\n // Derive opponent colors (for right edge fade) from team logo\n const [opponentColors, setOpponentColors] = React.useState<string[] | null>(null);\n const [isMatchModalOpen, setIsMatchModalOpen] = React.useState(false);\n const [selectedMatch, setSelectedMatch] = React.useState<any>(null);\n const [isYoutubeOpen, setIsYoutubeOpen] = React.useState(false);\n\n // Placeholders; moved tracking effects below to avoid using variables before declaration\n\n // Track article view when data is loaded\n React.useEffect(() => {\n if (data && (data as any).id) {\n trackArticleView((data as any).id);\n // Umami + backend generic event\n umamiTrackArticleView((data as any).id, (data as any).title);\n }\n }, [data]);\n\n // Ensure unified link: if opened by numeric ID and slug exists, redirect to /news/:slug\n React.useEffect(() => {\n if (!id) return;\n try {\n const s = (data as any)?.slug;\n if (s && typeof s === 'string') {\n const target = `/news/${s}`;\n const cur = (typeof window !== 'undefined') ? (window.location.pathname + (window.location.search || '')) : '';\n if (cur && !cur.startsWith(target)) {\n navigate(target, { replace: true });\n }\n }\n } catch {}\n }, [id, (data as any)?.slug, navigate]);\n\n // Award engagement for article read after 15s dwell (once per article)\n React.useEffect(() => {\n const aid = (data as any)?.id;\n if (!aid) return;\n let timer: any;\n const key = `fc_ar_read_${aid}`;\n const already = (() => { try { return localStorage.getItem(key) === '1'; } catch { return false; } })();\n if (!already) {\n timer = setTimeout(async () => {\n try {\n await articleRead(Number(aid));\n try { localStorage.setItem(key, '1'); } catch {}\n } catch {}\n }, 15000);\n }\n return () => { if (timer) clearTimeout(timer); };\n }, [(data as any)?.id]);\n\n // Delegated click tracking for normal links inside content\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n\n // Transform content to ensure /uploads URLs resolve against API origin and allow iframes\n // Memoize the transformation function to prevent infinite loops\n const toAbsoluteUploads = React.useCallback((html?: string) => {\n if (!html) return '';\n try {\n const origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n // Replace src=\"/uploads... and href=\"/uploads...\n return html\n .replace(/src=(\"|')\\s*(\\/uploads\\/[^\"']+)(\"')/g, (_m, q1, p2, q3) => `src=${q1}${origin}${p2}${q3}`)\n .replace(/href=(\"|')\\s*(\\/uploads\\/[^\"']+)(\"')/g, (_m, q1, p2, q3) => `href=${q1}${origin}${p2}${q3}`)\n // Also rewrite absolute localhost/127.0.0.1 uploads links to backend origin\n .replace(/src=(\"|')\\s*https?:\\/\\/(?:localhost|127\\.0\\.0\\.1)(?::\\d+)?(\\/uploads\\/[^\"']+)(\"')/g, (_m, q1, p2, q3) => `src=${q1}${origin}${p2}${q3}`)\n .replace(/href=(\"|')\\s*https?:\\/\\/(?:localhost|127\\.0\\.0\\.1)(?::\\d+)?(\\/uploads\\/[^\"']+)(\"')/g, (_m, q1, p2, q3) => `href=${q1}${origin}${p2}${q3}`);\n } catch {\n return html;\n }\n }, []);\n\n const safeContentHTML = React.useMemo(() => {\n const transformed = toAbsoluteUploads((data as any)?.content);\n return DOMPurify.sanitize(transformed || '', {\n USE_PROFILES: { html: true },\n ADD_TAGS: ['iframe'],\n ADD_ATTR: ['class', 'target', 'rel', 'allow', 'allowfullscreen', 'style', 'data-filters', 'data-img-id', 'data-bullets', 'data-list'],\n });\n }, [(data as any)?.content, toAbsoluteUploads]);\n\n // Fetch gallery album if article has one (fallback to URL when ID is missing)\n const galleryAlbumQuery = useQuery({\n queryKey: ['article-gallery-album', (data as any)?.gallery_album_id || (data as any)?.gallery_album_url],\n enabled: Boolean((data as any)?.gallery_album_id || (data as any)?.gallery_album_url),\n queryFn: async () => {\n const albumId = (data as any)?.gallery_album_id;\n let photoIds: string[] = [];\n const raw = (data as any)?.gallery_photo_ids;\n if (Array.isArray(raw)) {\n photoIds = raw as string[];\n } else if (typeof raw === 'string') {\n // Try JSON parse, otherwise split by comma\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) {\n photoIds = parsed.map(String);\n } else {\n photoIds = raw.split(',').map(s => s.trim()).filter(Boolean);\n }\n } catch {\n photoIds = raw.split(',').map(s => s.trim()).filter(Boolean);\n }\n }\n \n // Resolve backend origin for cached files regardless of frontend origin\n let origin = '';\n try {\n const assetBase = (process.env.REACT_APP_ASSET_BASE_URL || '').trim();\n if (assetBase) {\n origin = new URL(assetBase, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n }\n } catch {}\n if (!origin) {\n try {\n origin = new URL(API_URL, typeof window !== 'undefined' ? window.location.origin : 'http://localhost:3000').origin;\n } catch {}\n }\n \n // Try to find album in both sources\n const [profileRes, albumsRes] = await Promise.allSettled([\n fetch(`${origin}/cache/prefetch/zonerama_profile.json`, { cache: 'no-cache' }),\n fetch(`${origin}/cache/prefetch/zonerama_albums.json`, { cache: 'no-cache' })\n ]);\n \n // Check profile albums first\n if (profileRes.status === 'fulfilled' && profileRes.value.ok) {\n const profileData = await profileRes.value.json();\n const album = (profileData.albums || []).find((a: any) => a.id === albumId);\n if (album) {\n // Use full album photos for the article preview (ignore selected IDs)\n const photos = album.photos;\n return { ...album, photos };\n }\n }\n \n // Check blog albums\n if (albumsRes.status === 'fulfilled' && albumsRes.value.ok) {\n const albumsData = await albumsRes.value.json();\n const blogAlbums = Array.isArray(albumsData) ? albumsData : [];\n const album = blogAlbums.find((a: any) => a.id === albumId);\n if (album) {\n const photos = album.photos;\n return { ...album, photos };\n }\n }\n \n // Fallback: load by URL via proxy endpoint\n const albumUrl = (data as any)?.gallery_album_url;\n if (albumUrl) {\n const params = new URLSearchParams({ link: albumUrl, photo_limit: '12', rendered: 'true' });\n const resp = await fetch(`${API_URL}/zonerama-album?${params.toString()}`);\n if (resp.ok) {\n const payload = await resp.json();\n let photos: any[] = [];\n if (Array.isArray(payload?.albums) && payload.albums.length > 0) {\n photos = payload.albums[0]?.photos || [];\n } else if (Array.isArray(payload?.photos)) {\n photos = payload.photos;\n }\n return { id: albumUrl, title: 'Album', date: '', photos } as any;\n }\n }\n\n return null;\n },\n staleTime: 60_000,\n });\n\n // Extract image sources from content HTML\n const contentImageSources: string[] = React.useMemo(() => {\n try {\n const div = document.createElement('div');\n div.innerHTML = safeContentHTML || '';\n const imgs = Array.from(div.querySelectorAll('img')) as HTMLImageElement[];\n const srcs = imgs.map((img) => img.getAttribute('src') || '').filter(Boolean);\n // Deduplicate while preserving order\n const seen = new Set<string>();\n const uniq: string[] = [];\n for (const s of srcs) { if (!seen.has(s)) { seen.add(s); uniq.push(s); } }\n return uniq;\n } catch { return []; }\n }, [safeContentHTML]);\n\n // Compute gallery selected and extra images to match visible thumbnails\n const gallerySelectedAndExtra = React.useMemo(() => {\n const albumPhotos = Array.isArray(galleryAlbumQuery.data?.photos) ? (galleryAlbumQuery.data?.photos as any[]) : [];\n const rawSel: any = (data as any)?.gallery_photo_ids;\n let selectedIds: string[] = [];\n if (Array.isArray(rawSel)) selectedIds = rawSel.map(String);\n else if (typeof rawSel === 'string' && rawSel.trim() !== '') {\n try { const parsed = JSON.parse(rawSel); if (Array.isArray(parsed)) selectedIds = parsed.map(String); else selectedIds = rawSel.split(',').map((s: string) => s.trim()).filter(Boolean); } catch { selectedIds = rawSel.split(',').map((s: string) => s.trim()).filter(Boolean); }\n }\n const selected = albumPhotos.filter((p: any) => selectedIds.includes(String(p.id)));\n const rest = albumPhotos.filter((p: any) => !selectedIds.includes(String(p.id)));\n // Shuffle only when user opens the lightbox (keeps UI stable otherwise)\n const extra = [...rest]\n .sort(() => Math.random() - 0.5)\n .slice(0, Math.min(5, rest.length));\n return { selected, extra } as { selected: any[]; extra: any[] };\n }, [galleryAlbumQuery.data?.photos, (data as any)?.gallery_photo_ids, shuffleTick]);\n\n // Build combined image sources used for lightbox navigation (hero + content + gallery thumbs)\n const combinedImageSources: string[] = React.useMemo(() => {\n const hero = (data as any)?.image_url ? (assetUrl((data as any).image_url) || (data as any).image_url) : null;\n const gallerySrcs = [\n ...gallerySelectedAndExtra.selected.map((p: any) => String(p.image_1500 || '')),\n ...gallerySelectedAndExtra.extra.map((p: any) => String(p.image_1500 || '')),\n ].filter(Boolean);\n const all = [\n ...(hero ? [hero] : []),\n ...contentImageSources,\n ...gallerySrcs,\n ];\n const seen = new Set<string>();\n const uniq: string[] = [];\n for (const s of all) { if (s && !seen.has(s)) { seen.add(s); uniq.push(s); } }\n return uniq;\n }, [(data as any)?.image_url, contentImageSources, gallerySelectedAndExtra.selected, gallerySelectedAndExtra.extra]);\n\n const openLightboxAtSrc = React.useCallback((src: string) => {\n const idx = combinedImageSources.findIndex((s) => s === src);\n const start = idx >= 0 ? idx : 0;\n setLightboxImages(combinedImageSources);\n setLightboxIndex(start);\n setIsLightboxOpen(true);\n // Trigger a gentle shuffle of extra gallery tiles after opening (\"accidental feature\")\n setShuffleTick((t) => t + 1);\n }, [combinedImageSources]);\n\n const onPrev = React.useCallback(() => {\n setLightboxIndex((i) => (i - 1 + lightboxImages.length) % lightboxImages.length);\n }, [lightboxImages.length]);\n const onNext = React.useCallback(() => {\n setLightboxIndex((i) => (i + 1) % lightboxImages.length);\n }, [lightboxImages.length]);\n\n // Handle clicks on images inside the rich content to open lightbox\n React.useEffect(() => {\n const el = contentRef.current;\n if (!el) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n const img = (target.closest ? target.closest('img') : null) as HTMLImageElement | null;\n if (img && img.getAttribute('src')) {\n e.preventDefault();\n const src = img.getAttribute('src') as string;\n openLightboxAtSrc(src);\n return;\n }\n const anchor = (target.closest ? target.closest('a') : null) as HTMLAnchorElement | null;\n if (anchor && anchor.href) {\n try {\n const href = anchor.getAttribute('href') || anchor.href;\n umamiTrackEvent('Link Click', { href, page: window.location.pathname, context: 'article_content' });\n } catch {}\n }\n };\n el.addEventListener('click', handler);\n return () => { el.removeEventListener('click', handler); };\n }, [contentRef.current, openLightboxAtSrc]);\n\n // Keyboard navigation in lightbox\n React.useEffect(() => {\n if (!isLightboxOpen) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setIsLightboxOpen(false);\n else if (e.key === 'ArrowLeft') onPrev();\n else if (e.key === 'ArrowRight') onNext();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [isLightboxOpen, onPrev, onNext]);\n\n // Fetch linked match (public)\n const matchLinkQuery = useQuery({\n queryKey: ['article-match-link', (data as any)?.id],\n queryFn: () => getArticleMatchLink((data as any)?.id),\n enabled: Boolean((data as any)?.id),\n staleTime: 60_000,\n });\n\n // From cached FACR club info, resolve the match details\n const facrMatchQuery = useQuery({\n queryKey: ['facr-cached-match', (matchLinkQuery.data as any)?.external_match_id],\n enabled: Boolean((matchLinkQuery.data as any)?.external_match_id),\n queryFn: async () => {\n const origin = new URL(API_URL, window.location.origin).origin;\n const url = `${origin}/cache/prefetch/facr_club_info.json`;\n const res = await fetch(url, { cache: 'no-cache' });\n if (!res.ok) return null as any;\n const json = await res.json();\n const comps = Array.isArray(json?.competitions) ? json.competitions : [];\n for (const c of comps) {\n const matches = Array.isArray(c.matches) ? c.matches : [];\n for (const m of matches) {\n const mid = String(m.match_id || m.id);\n if (mid === String((matchLinkQuery.data as any)?.external_match_id)) {\n return { ...m, competitionName: c.name };\n }\n }\n }\n return null as any;\n },\n staleTime: 60_000,\n });\n\n // Derive opponent color (away team) for right-side accent based on logo palette\n React.useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const m: any = facrMatchQuery?.data as any;\n if (!m) { if (!cancelled) setOpponentColors(null); return; }\n const awayId = String(m?.away_team_id || m?.away_id || '') || undefined;\n const awayName = String(m?.away || m?.away_team || '') || undefined;\n const facrLogo = (m as any)?.away_logo_url as string | undefined;\n const url = await getTeamLogo(awayId, awayName, facrLogo);\n const palette = await extractPalette(url);\n const colors = Array.isArray(palette) && palette.length ? palette.slice(0, 2) : [];\n if (!cancelled) setOpponentColors(colors);\n } catch {\n if (!cancelled) setOpponentColors(null);\n }\n })();\n return () => { cancelled = true; };\n }, [facrMatchQuery?.data]);\n\n // Track match view when resolved\n React.useEffect(() => {\n const mid = (matchLinkQuery.data as any)?.external_match_id;\n if (mid) {\n umamiTrackMatchView(mid);\n }\n }, [(matchLinkQuery.data as any)?.external_match_id]);\n\n // Build a snapshot usable for sharing if available (FACR data or article fallback)\n const matchSnapshot: MatchSnapshot | null = React.useMemo(() => {\n const m: any = facrMatchQuery?.data as any;\n if (m) {\n let score = '';\n if (m?.score && m.score !== 'vs') score = String(m.score);\n else if (m?.result_home != null && m?.result_away != null) score = `${m.result_home}:${m.result_away}`;\n return {\n external_match_id: String((matchLinkQuery.data as any)?.external_match_id || ''),\n competition: String(m.competitionName || ''),\n date_time: String(m.date_time || m.date || ''),\n venue: m.venue ? String(m.venue) : undefined,\n home: String(m.home || m.home_team || ''),\n away: String(m.away || m.away_team || ''),\n score,\n };\n }\n const snap: any = (data as any)?.match_snapshot;\n if (snap) {\n return {\n external_match_id: snap.external_match_id,\n competition: snap.competition || snap.competitionName,\n date_time: snap.date_time || snap.date,\n venue: snap.venue,\n home: snap.home,\n away: snap.away,\n score: snap.score,\n } as MatchSnapshot;\n }\n return null;\n }, [facrMatchQuery?.data, (matchLinkQuery.data as any)?.external_match_id, (data as any)?.match_snapshot]);\n\n // Track gallery section when loaded\n React.useEffect(() => {\n const albumId = (data as any)?.gallery_album_id;\n if (albumId && galleryAlbumQuery.data) {\n umamiTrackEvent('Gallery Section Shown', { album_id: albumId, photos: galleryAlbumQuery.data?.photos?.length || 0 });\n }\n }, [(data as any)?.gallery_album_id, galleryAlbumQuery.data]);\n\n const articleBannersQ = useQuery<UIBanner[]>({\n queryKey: ['banners', { placement: 'article_inline' }],\n queryFn: () => getBanners({ active: true, placement: 'article_inline' }),\n staleTime: 60 * 1000,\n });\n const articleBanners = (articleBannersQ.data || []) as UIBanner[];\n const sidebarBannersQ = useQuery<UIBanner[]>({\n queryKey: ['banners', { placement: 'article_sidebar' }],\n queryFn: () => getBanners({ active: true, placement: 'article_sidebar' }),\n staleTime: 60 * 1000,\n });\n const sidebarBanners = (sidebarBannersQ.data || []) as UIBanner[];\n\n const relatedArticlesQuery = useQuery({\n queryKey: ['related-articles', (data as any)?.category?.id || 'none', (data as any)?.id],\n enabled: Boolean((data as any)?.id),\n queryFn: () => getArticles({\n page: 1,\n page_size: 6,\n published: true,\n ...(((data as any)?.category?.id) ? { category_id: (data as any).category.id } : {}),\n }),\n staleTime: 60_000,\n });\n\n const upcomingEventsQuery = useQuery({\n queryKey: ['upcoming-events-sidebar'],\n queryFn: getUpcomingEvents,\n staleTime: 60_000,\n });\n\n const latestArticlesQuery = useQuery({\n queryKey: ['latest-articles'],\n queryFn: () => getArticles({ page: 1, page_size: 6, published: true }),\n enabled: Boolean((isError || !data) && (slug || id)),\n staleTime: 60_000,\n });\n\n // Mini calendar data source (cached FACR club info)\n const allMatchesQ = useQuery({\n queryKey: ['facr-all-matches-mini'],\n queryFn: async () => {\n const origin = new URL(API_URL, window.location.origin).origin;\n const url = `${origin}/cache/prefetch/facr_club_info.json`;\n const res = await fetch(url, { cache: 'no-cache' });\n if (!res.ok) return [] as any[];\n const json = await res.json();\n const comps = Array.isArray(json?.competitions) ? json.competitions : [];\n const items: any[] = [];\n for (const c of comps) {\n const matches = Array.isArray(c.matches) ? c.matches : [];\n for (const m of matches) {\n items.push({ ...m, competitionName: c.name });\n }\n }\n return items;\n },\n staleTime: 60_000,\n });\n\n const catUpcomingMatches = React.useMemo(() => {\n try {\n const list = Array.isArray(allMatchesQ.data) ? (allMatchesQ.data as any[]) : [];\n const now = Date.now();\n const needle = categoryNameForMatches ? normalize(categoryNameForMatches) : '';\n const filtered = list.filter((m: any) => {\n const comp = String(m.competitionName || '');\n const resolved = resolveAliasName(comp);\n const nComp = normalize(comp);\n const nResolved = normalize(resolved);\n const dt: string = String(m.date_time || '');\n const parts = dt.split(' ');\n const [d, t] = [parts[0] || '', parts[1] || ''];\n const [dd, MM, yyyy] = (d || '').split('.');\n const iso = (dd && MM && yyyy) ? `${yyyy}-${String(MM).padStart(2,'0')}-${String(dd).padStart(2,'0')}T${(t || '00:00')}:00` : '';\n const ts = iso ? new Date(iso).getTime() : 0;\n const isFuture = ts > now;\n if (!isFuture) return false;\n if (!needle) return true;\n if (nResolved && nResolved === needle) return true;\n if (nComp === needle) return true;\n return (nResolved && nResolved.includes(needle)) || nComp.includes(needle);\n });\n return filtered;\n } catch { return [] as any[]; }\n }, [allMatchesQ.data, categoryNameForMatches, resolveAliasName]);\n\n // Mini calendar helpers\n const [miniMonthRef, setMiniMonthRef] = React.useState<Date>(startOfMonth(new Date()));\n const miniWeeks = React.useMemo(() => {\n const start = startOfWeek(startOfMonth(miniMonthRef), { weekStartsOn: 1 });\n const days: Date[] = [];\n for (let i = 0; i < 42; i++) days.push(addDays(start, i));\n return days;\n }, [miniMonthRef]);\n const [miniExpandedKey, setMiniExpandedKey] = React.useState<string | null>(null);\n const facrToDateKey = (dt: string): string => {\n try {\n const [dPart, tPart = '00:00'] = String(dt || '').split(' ');\n const [dd, MM, yyyy] = String(dPart || '').split('.');\n if (dd && MM && yyyy) return `${yyyy}-${String(MM).padStart(2,'0')}-${String(dd).padStart(2,'0')}`;\n } catch {}\n return '';\n };\n const miniByDate = React.useMemo(() => {\n const map = new Map<string, any[]>();\n // When no upcoming matches for the article's category, show all matches (like on /kalendar)\n const useAll = !categoryNameForMatches || (catUpcomingMatches || []).length === 0;\n const sourceList: any[] = useAll\n ? (Array.isArray(allMatchesQ.data) ? (allMatchesQ.data as any[]) : [])\n : (catUpcomingMatches || []);\n sourceList.forEach((m: any) => {\n const key = facrToDateKey(String(m.date_time || ''));\n if (!key) return;\n const arr = map.get(key) || [];\n arr.push(m);\n map.set(key, arr);\n });\n Array.from(map.keys()).forEach((k) => {\n const arr = map.get(k) || [];\n arr.sort((a: any, b: any) => {\n const ta = String(a.date_time || '').split(' ')[1] || '00:00';\n const tb = String(b.date_time || '').split(' ')[1] || '00:00';\n return ta.localeCompare(tb);\n });\n map.set(k, arr);\n });\n return map;\n }, [allMatchesQ.data, catUpcomingMatches, categoryNameForMatches]);\n\n if (isLoading) return <Spinner />;\n if (isError || !data) return (\n <MainLayout>\n <Helmet>\n <title>Článek nenalezen</title>\n <meta name=\"robots\" content=\"noindex\" />\n </Helmet>\n <Container maxW=\"4xl\" py={{ base: 12, md: 16 }}>\n <Stack spacing={6} align=\"center\" textAlign=\"center\">\n <Box color=\"blue.500\">\n <SearchX size={64} />\n </Box>\n <Heading size=\"xl\">Článek nenalezen</Heading>\n <Text color={textMuted} maxW=\"2xl\">\n Je nám líto, ale hledaný článek neexistuje, byl smazán nebo byl přesunut.\n </Text>\n <HStack spacing={3}>\n <Button as={RouterLink} to=\"/news\" colorScheme=\"blue\">Zpět na novinky</Button>\n <Button as={RouterLink} to=\"/\" variant=\"ghost\">Domů</Button>\n </HStack>\n </Stack>\n\n {Array.isArray((latestArticlesQuery.data as any)?.data) && ((latestArticlesQuery.data as any)?.data?.length || 0) > 0 && (\n <Box mt={12}>\n <Heading as=\"h2\" size=\"md\" mb={4}>Nejnovější články</Heading>\n <SimpleGrid columns={{ base: 1, sm: 2, md: 3 }} spacing={4}>\n {((latestArticlesQuery.data as any).data || []).slice(0, 6).map((a: any) => {\n const link = a.slug ? `/news/${a.slug}` : `/articles/${a.id}`;\n return (\n <Box\n key={a.id}\n as={RouterLink}\n to={link}\n borderWidth=\"1px\"\n borderRadius=\"lg\"\n p={3}\n bg={cardBg}\n _hover={{ textDecoration: 'none', boxShadow: 'md' }}\n >\n <Image\n src={assetUrl(a.image_url) || '/stadium-placeholder.jpg'}\n alt={a.title}\n w=\"100%\"\n h=\"140px\"\n objectFit=\"cover\"\n borderRadius=\"md\"\n mb={2}\n />\n <Text fontWeight=\"600\" noOfLines={2}>{a.title}</Text>\n {a.published_at && (\n <Text fontSize=\"sm\" color={textMuted}>{new Date(a.published_at).toLocaleDateString('cs-CZ')}</Text>\n )}\n </Box>\n );\n })}\n </SimpleGrid>\n </Box>\n )}\n </Container>\n </MainLayout>\n );\n\n const title = (data as any).seo_title || data.title;\n const description = (data as any).seo_description || toText(data.content).slice(0, 160);\n const ogImageRaw = (data as any).og_image_url || data.image_url || '/logo512.png';\n const ogImage = assetUrl(ogImageRaw) || ogImageRaw;\n const canonical = typeof window !== 'undefined' ? window.location.href : undefined;\n const publishedAt = (data as any).published_at || (data as any).created_at;\n const monthParam = (() => {\n if (!publishedAt) return '';\n try { const d = new Date(publishedAt); return `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}`; } catch { return ''; }\n })();\n\n return (\n <MainLayout>\n <Box>\n <InstagramGeneratorButton\n article={data as any}\n match={matchSnapshot}\n targetUrl={typeof window !== 'undefined' ? window.location.href : undefined}\n placement=\"fixed\"\n size=\"md\"\n align=\"left\"\n />\n <Helmet>\n <title>{title}</title>\n <meta name=\"description\" content={description} />\n <meta property=\"og:type\" content=\"article\" />\n <meta property=\"og:title\" content={title} />\n <meta property=\"og:description\" content={description} />\n <meta property=\"og:image\" content={ogImage} />\n <meta name=\"twitter:card\" content=\"summary_large_image\" />\n <meta name=\"twitter:title\" content={title} />\n <meta name=\"twitter:description\" content={description} />\n <meta name=\"twitter:image\" content={ogImage} />\n {canonical && <link rel=\"canonical\" href={canonical} />}\n <script type=\"application/ld+json\">\n {JSON.stringify({\n '@context': 'https://schema.org',\n '@type': 'NewsArticle',\n headline: title,\n image: [ogImage],\n datePublished: (data as any).published_at || data.created_at,\n dateModified: (data as any).updated_at || (data as any).published_at || data.created_at,\n author: data.author ? {\n '@type': 'Person',\n name: `${data.author.first_name || ''} ${data.author.last_name || ''}`.trim() || data.author.email\n } : undefined,\n description,\n mainEntityOfPage: canonical || undefined,\n })}\n </script>\n <script type=\"application/ld+json\">\n {JSON.stringify((() => {\n const items: any[] = [\n { '@type': 'ListItem', position: 1, name: 'Domů', item: (typeof window !== 'undefined' ? window.location.origin : '') + '/' },\n { '@type': 'ListItem', position: 2, name: 'Blog', item: (typeof window !== 'undefined' ? window.location.origin : '') + '/blog' },\n ];\n const catId = (data as any)?.category?.id || (data as any)?.category_id;\n const catName = (data as any)?.category?.name || (data as any)?.category_name;\n if (catName) {\n items.push({\n '@type': 'ListItem',\n position: 3,\n name: String(catName),\n item: (typeof window !== 'undefined' ? window.location.origin : '') + (catId ? `/blog?category_id=${catId}` : `/blog?category=${encodeURIComponent(String(catName))}`)\n });\n }\n items.push({ '@type': 'ListItem', position: items.length + 1, name: title, item: canonical || undefined });\n return { '@context': 'https://schema.org', '@type': 'BreadcrumbList', itemListElement: items };\n })())}\n </script>\n </Helmet>\n <Box bg=\"transparent\" color=\"inherit\" py={{ base: 6, md: 8 }} mb={2}>\n <Container maxW=\"7xl\">\n <Heading as=\"h1\" size={{ base: 'xl', md: '2xl' }} mb={2}>{data.title}</Heading>\n <HStack spacing={2} rowGap={2} wrap=\"wrap\" fontSize=\"sm\" color={textMuted}>\n {((data as any).read_time || (data as any).estimated_read_minutes) ? (\n <HStack spacing={1}>\n <Clock size={16} />\n <Text>{(data as any).read_time || (data as any).estimated_read_minutes} min čtení</Text>\n </HStack>\n ) : null}\n {publishedAt && (\n <Tag as={RouterLink} to={`/blog?month=${monthParam}`} size=\"sm\" variant=\"subtle\">{new Date(publishedAt).toLocaleDateString('cs-CZ')}</Tag>\n )}\n {(data as any)?.category?.id && (\n <Tag as={RouterLink} to={`/blog?category_id=${(data as any).category.id}`} size=\"sm\" variant=\"subtle\">{(data as any).category.name || 'Kategorie'}</Tag>\n )}\n {(matchLinkQuery.data as any)?.external_match_id && (\n <Tag as={RouterLink} to={`/blog?match_id=${(matchLinkQuery.data as any).external_match_id}`} size=\"sm\" variant=\"subtle\">Zápas</Tag>\n )}\n {(data as any).view_count ? (\n <HStack spacing={1} ml={{ base: 0, md: 2 }}>\n <Eye size={16} />\n <Text>{(data as any).view_count} zobrazení</Text>\n </HStack>\n ) : null}\n </HStack>\n <Breadcrumb fontSize=\"sm\" mt={2} color={textMuted} separator=\"/\">\n <BreadcrumbItem>\n <BreadcrumbLink as={RouterLink} to=\"/\">Domů</BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbItem>\n <BreadcrumbLink as={RouterLink} to=\"/blog\">Blog</BreadcrumbLink>\n </BreadcrumbItem>\n {(() => {\n const catId = (data as any)?.category?.id || (data as any)?.category_id;\n const catName = (data as any)?.category?.name || (data as any)?.category_name;\n if (!catName) return null;\n const to = catId ? `/blog?category_id=${catId}` : `/blog?category=${encodeURIComponent(String(catName))}`;\n return (\n <BreadcrumbItem>\n <BreadcrumbLink as={RouterLink} to={to}>{String(catName)}</BreadcrumbLink>\n </BreadcrumbItem>\n );\n })()}\n <BreadcrumbItem isCurrentPage>\n <BreadcrumbLink>{data.title}</BreadcrumbLink>\n </BreadcrumbItem>\n </Breadcrumb>\n </Container>\n </Box>\n <Container maxW=\"7xl\">\n <SimpleGrid columns={{ base: 1, lg: 12 }} spacing={6}>\n <Box gridColumn={{ base: '1 / -1', lg: 'span 8' }}>\n <Stack spacing={6}>\n {/* Featured Image - smaller with subtle overlay */}\n {data.image_url && (\n <Box borderRadius=\"xl\" overflow=\"hidden\" cursor=\"pointer\" onClick={() => openLightboxAtSrc(assetUrl(data.image_url) || (data.image_url as any))}>\n <Image src={assetUrl(data.image_url) || data.image_url} alt={data.title} w=\"100%\" h=\"auto\" objectFit=\"contain\" />\n </Box>\n )}\n {/* Match Section - Card with logos, score/countdown, venue/date */}\n {(matchLinkQuery.data as any)?.external_match_id && (\n <Box position=\"relative\" borderWidth=\"1px\" borderRadius=\"lg\" p={{ base: 4, md: 5 }} bg={cardBg} overflow=\"hidden\" cursor=\"pointer\"\n onClick={() => {\n const fm: any = facrMatchQuery?.data as any;\n if (fm) {\n setSelectedMatch({ ...fm, competition: fm.competitionName });\n setIsMatchModalOpen(true);\n return;\n }\n if (matchSnapshot) {\n setSelectedMatch({\n date_time: matchSnapshot.date_time,\n venue: matchSnapshot.venue,\n home: matchSnapshot.home,\n away: matchSnapshot.away,\n competition: matchSnapshot.competition,\n score: (matchSnapshot.score || '')\n } as any);\n setIsMatchModalOpen(true);\n }\n }}>\n {/* Edge gradients removed per design feedback; keep simple bordered card */}\n <Heading as=\"h3\" size=\"md\" mb={3}>Zápas k článku</Heading>\n {facrMatchQuery.isLoading ? (\n <Text color={textMuted}>Načítám údaje o zápasu…</Text>\n ) : facrMatchQuery.data ? (\n <>\n <HStack spacing={2} wrap=\"wrap\" mb={3}>\n {facrMatchQuery.data.competitionName && (\n <Badge colorScheme=\"blue\">{String(facrMatchQuery.data.competitionName)}</Badge>\n )}\n <Badge>{String((facrMatchQuery.data as any).date_time || (facrMatchQuery.data as any).date || '')}</Badge>\n </HStack>\n <Flex align=\"center\" justify=\"space-between\" gap={4}>\n <VStack flex={1} spacing={2} minW=\"0\">\n <TeamLogo size=\"custom\" style={{ width: 64, height: 64 }} teamId={String((facrMatchQuery.data as any).home_team_id || (facrMatchQuery.data as any).home_id || '')} teamName={String((facrMatchQuery.data as any).home || (facrMatchQuery.data as any).home_team || '')} facrLogo={(facrMatchQuery.data as any).home_logo_url} />\n <Text fontWeight=\"600\" noOfLines={2} textAlign=\"center\">{String((facrMatchQuery.data as any).home || (facrMatchQuery.data as any).home_team || '')}</Text>\n </VStack>\n <VStack minW={{ base: '100px', md: '140px' }}>\n {(() => {\n const raw = String((facrMatchQuery.data as any).date_time || (facrMatchQuery.data as any).date || '');\n const hasScore = ((facrMatchQuery.data as any).result_home != null && (facrMatchQuery.data as any).result_away != null) || Boolean((facrMatchQuery.data as any).score && (facrMatchQuery.data as any).score !== 'vs');\n if (hasScore) {\n const score = String((facrMatchQuery.data as any).score || `${(facrMatchQuery.data as any).result_home}:${(facrMatchQuery.data as any).result_away}`);\n return (<Heading size=\"2xl\">{score}</Heading>);\n }\n const parseFacr = (s: string): Date => {\n const m = s.match(/^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})(?:\\s+(\\d{1,2}):(\\d{2}))?/);\n if (m) {\n const d = parseInt(m[1],10);\n const mo = parseInt(m[2],10)-1;\n const y = parseInt(m[3],10);\n const hh = m[4] ? parseInt(m[4],10) : 0;\n const mm = m[5] ? parseInt(m[5],10) : 0;\n return new Date(y, mo, d, hh, mm);\n }\n const t = Date.parse(s);\n return isNaN(t) ? new Date() : new Date(t);\n };\n const d = parseFacr(raw);\n const now = Date.now();\n const ms = d.getTime() - now;\n const days = Math.max(0, Math.floor(ms / (1000*60*60*24)));\n const hours = Math.max(0, Math.floor((ms % (1000*60*60*24))/(1000*60*60)));\n const mins = Math.max(0, Math.floor((ms % (1000*60*60))/(1000*60)));\n return (<Text fontSize=\"lg\" fontWeight=\"700\">Za {days} d {hours} h {mins} min</Text>);\n })()}\n {(() => {\n const dRaw = String((facrMatchQuery.data as any).date_time || (facrMatchQuery.data as any).date || '');\n const m = dRaw.match(/^(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})(?:\\s+(\\d{1,2}):(\\d{2}))?/);\n let d: Date;\n if (m) {\n const dd = parseInt(m[1], 10);\n const MM = parseInt(m[2], 10) - 1;\n const yyyy = parseInt(m[3], 10);\n const hh = m[4] ? parseInt(m[4], 10) : 0;\n const mm = m[5] ? parseInt(m[5], 10) : 0;\n d = new Date(yyyy, MM, dd, hh, mm);\n } else {\n const t = Date.parse(dRaw);\n d = isNaN(t) ? new Date() : new Date(t);\n }\n return <Text fontSize=\"sm\" color={textMuted}>{d.toLocaleDateString('cs-CZ')} {d.toLocaleTimeString('cs-CZ', { hour: '2-digit', minute: '2-digit' })}</Text>;\n })()}\n {(facrMatchQuery.data as any).venue && <Text fontSize=\"sm\" color={textMuted}>{String((facrMatchQuery.data as any).venue)}</Text>}\n </VStack>\n <VStack flex={1} spacing={2} minW=\"0\">\n <TeamLogo size=\"custom\" style={{ width: 64, height: 64 }} teamId={String((facrMatchQuery.data as any).away_team_id || (facrMatchQuery.data as any).away_id || '')} teamName={String((facrMatchQuery.data as any).away || (facrMatchQuery.data as any).away_team || '')} facrLogo={(facrMatchQuery.data as any).away_logo_url} />\n <Text fontWeight=\"600\" noOfLines={2} textAlign=\"center\">{String((facrMatchQuery.data as any).away || (facrMatchQuery.data as any).away_team || '')}</Text>\n </VStack>\n </Flex>\n {(((facrMatchQuery.data as any).facr_link || (facrMatchQuery.data as any).report_url)) && (\n <Box mt={5} pt={2} textAlign=\"center\">\n {(() => {\n const raw = String(((facrMatchQuery.data as any).facr_link || (facrMatchQuery.data as any).report_url || ''));\n const safe = raw.replace('is.fotbal.cz', 'www.fotbal.cz');\n return (\n <Button\n as={Link}\n href={safe}\n isExternal\n rightIcon={<ExternalLink size={16} />}\n size=\"sm\"\n variant=\"link\"\n colorScheme=\"blue\"\n >\n Zobrazit více informací na fotbal.cz\n </Button>\n );\n })()}\n </Box>\n )}\n <Text mt={2} fontSize=\"xs\" color={textMuted} position=\"absolute\" right={3} bottom={2}>\n Data pocházejí z{' '}\n <Link href=\"https://www.fotbal.cz\" isExternal color=\"blue.600\" textDecoration=\"underline\">FAČR</Link>\n </Text>\n </>\n ) : (\n <Text color={textMuted}>Propojeno s FACR ID: {(matchLinkQuery.data as any)?.external_match_id}</Text>\n )}\n </Box>\n )}\n\n {/* Article Content - Main Section with editor-like lists */}\n <Box\n className=\"article-content\"\n bg={useColorModeValue('white','gray.900')}\n borderRadius=\"lg\"\n p={{ base: 4, md: 6 }}\n ref={contentRef}\n sx={{\n 'ul, ol': { pl: 6, listStylePosition: 'outside' },\n 'ul': { listStyleType: 'disc' },\n 'ul[data-bullets=\"disc\"]': { listStyleType: 'disc' },\n 'ul[data-bullets=\"circle\"]': { listStyleType: 'circle' },\n 'ul[data-bullets=\"square\"]': { listStyleType: 'square' },\n 'ul[data-bullets=\"none\"]': { listStyleType: 'none' },\n 'ol': { listStyleType: 'decimal' },\n 'li': { mb: 2 },\n 'a': { color: 'blue.600', textDecoration: 'underline', _hover: { color: 'blue.700' } },\n 'blockquote': {\n borderLeft: '4px solid #3182ce',\n paddingLeft: '16px',\n margin: '1em 0',\n color: useColorModeValue('#4a5568','#cbd5e0'),\n fontStyle: 'italic',\n backgroundColor: useColorModeValue('#f7fafc','#1a202c'),\n padding: '12px 16px',\n borderRadius: '4px',\n },\n 'img': {\n display: 'block',\n maxWidth: '100%',\n height: 'auto',\n mt: 2,\n border: 'none !important',\n outline: 'none !important',\n boxShadow: 'none !important',\n cursor: 'pointer',\n },\n }}\n dangerouslySetInnerHTML={{ __html: safeContentHTML }}\n />\n {articleBanners.length > 0 && (\n <Box textAlign=\"center\" mt={{ base: 4, md: 6 }}>\n <a\n href={articleBanners[0].click_url || '#'}\n target={articleBanners[0].click_url ? '_blank' : undefined}\n rel={articleBanners[0].click_url ? 'noopener noreferrer' : undefined}\n style={{ display: 'inline-block' }}\n >\n <Image\n src={assetUrl((articleBanners[0] as any).image_url) || '/images/sponsors/placeholder.png'}\n alt={articleBanners[0].name}\n maxW=\"100%\"\n w={articleBanners[0].width ? `${articleBanners[0].width}px` : '100%'}\n h={articleBanners[0].height ? `${articleBanners[0].height}px` : 'auto'}\n borderRadius=\"md\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n </a>\n </Box>\n )}\n {/* YouTube Video Section - card with modal */}\n {(data as any)?.youtube_video_id && (\n <Box borderWidth=\"1px\" borderRadius=\"lg\" overflow=\"hidden\" bg={videoBg}>\n <Box\n role=\"group\"\n cursor=\"pointer\"\n tabIndex={0}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setIsYoutubeOpen(true); umamiTrackEvent('Video Widget Shown', { id: (data as any).youtube_video_id, title: (data as any).youtube_video_title }); } }}\n onClick={() => { setIsYoutubeOpen(true); umamiTrackEvent('Video Widget Shown', { id: (data as any).youtube_video_id, title: (data as any).youtube_video_title }); }}\n >\n <AspectRatio ratio={16/9}>\n <Box position=\"relative\">\n <Image src={(data as any).youtube_video_thumbnail || `https://i.ytimg.com/vi/${(data as any).youtube_video_id}/hqdefault.jpg`} alt={(data as any).youtube_video_title || 'YouTube video'} objectFit=\"cover\" />\n <Box\n position=\"absolute\"\n inset={0}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n bg=\"blackAlpha.500\"\n pointerEvents=\"none\"\n transition=\"background-color 0.2s ease\"\n _groupHover={{ bg: 'blackAlpha.600' }}\n >\n <Box\n bg=\"brand.primary\"\n color=\"white\"\n borderRadius=\"full\"\n px={5}\n py={3}\n display=\"flex\"\n alignItems=\"center\"\n gap={2}\n transform=\"scale(1)\"\n transition=\"transform 0.2s ease, box-shadow 0.2s ease\"\n boxShadow=\"0 8px 24px rgba(0,0,0,0.3)\"\n _groupHover={{ transform: 'scale(1.06)', boxShadow: '0 12px 32px rgba(0,0,0,0.35)' }}\n >\n <Play size={18} />\n <Text fontWeight=\"bold\">Přehrát</Text>\n </Box>\n </Box>\n </Box>\n </AspectRatio>\n <Box p={3}>\n <Text fontWeight=\"700\" color={videoTitleColor} noOfLines={2}>{(data as any).youtube_video_title || 'Video'}</Text>\n {(data as any).published_at && (\n <Text fontSize=\"sm\" color={textMuted}>{new Date((data as any).published_at).toLocaleDateString('cs-CZ')}</Text>\n )}\n {(data as any).youtube_video_url && (\n <Link href={(data as any).youtube_video_url} isExternal color=\"blue.600\" onClick={(e) => { e.stopPropagation(); }}>\n Otevřít na YouTube\n </Link>\n )}\n </Box>\n </Box>\n </Box>\n )}\n {/* Gallery Section - Mosaic of 5 color images (random) */}\n {((data as any)?.gallery_album_id || (data as any)?.gallery_album_url) && (\n <Box borderWidth=\"1px\" borderRadius=\"lg\" p={{ base: 3, md: 4 }} bg={galleryBg} borderColor={galleryBorder}>\n <Box mb={3}>\n <Heading as=\"h3\" size=\"md\" textAlign=\"center\">{t('gallery.page_title')}</Heading>\n {(() => {\n const albumPhotos = Array.isArray(galleryAlbumQuery.data?.photos) ? (galleryAlbumQuery.data?.photos as any[]) : [];\n if (albumPhotos.length === 0) return null;\n const selected = gallerySelectedAndExtra.selected;\n const extra = gallerySelectedAndExtra.extra;\n const pool = (extra.length ? extra : selected).slice(0, 5);\n if (pool.length === 0) return null;\n return (\n <Box>\n {pool.length < 5 ? (\n <SimpleGrid columns={{ base: 2, sm: 3 }} spacing={2} role=\"group\">\n {pool.map((p: any) => (\n <Image key={`extra-${p.id}`} src={p.image_1500} alt={String(p.id)} w=\"100%\" h=\"140px\" objectFit=\"cover\" borderRadius=\"md\" cursor=\"pointer\" onClick={() => openLightboxAtSrc(String(p.image_1500))} />\n ))}\n </SimpleGrid>\n ) : (\n <Box position=\"relative\" role=\"group\" sx={{\n display: 'grid',\n gridTemplateColumns: '1fr 1.2fr 1fr',\n gridTemplateRows: 'repeat(2, 140px)',\n gap: '8px'\n }}>\n <Image src={pool[0].image_1500} alt={String(pool[0].id)} sx={{ gridColumn: 1, gridRow: 1 }} objectFit=\"cover\" w=\"100%\" h=\"100%\" borderRadius=\"md\" cursor=\"pointer\" onClick={() => openLightboxAtSrc(String(pool[0].image_1500))} />\n <Image src={pool[1].image_1500} alt={String(pool[1].id)} sx={{ gridColumn: 1, gridRow: 2 }} objectFit=\"cover\" w=\"100%\" h=\"100%\" borderRadius=\"md\" cursor=\"pointer\" onClick={() => openLightboxAtSrc(String(pool[1].image_1500))} />\n <Image src={pool[2].image_1500} alt={String(pool[2].id)} sx={{ gridColumn: 2, gridRow: '1 / span 2' }} objectFit=\"cover\" w=\"100%\" h=\"100%\" borderRadius=\"md\" cursor=\"pointer\" onClick={() => openLightboxAtSrc(String(pool[2].image_1500))} />\n <Image src={pool[3].image_1500} alt={String(pool[3].id)} sx={{ gridColumn: 3, gridRow: 1 }} objectFit=\"cover\" w=\"100%\" h=\"100%\" borderRadius=\"md\" cursor=\"pointer\" onClick={() => openLightboxAtSrc(String(pool[3].image_1500))} />\n <Image src={pool[4].image_1500} alt={String(pool[4].id)} sx={{ gridColumn: 3, gridRow: 2 }} objectFit=\"cover\" w=\"100%\" h=\"100%\" borderRadius=\"md\" cursor=\"pointer\" onClick={() => openLightboxAtSrc(String(pool[4].image_1500))} />\n <Button\n as={RouterLink}\n to={(data as any).gallery_album_id ? `/galerie/album/${(data as any).gallery_album_id}` : '#'}\n size=\"sm\"\n colorScheme=\"blue\"\n position=\"absolute\"\n top=\"50%\"\n left=\"50%\"\n transform=\"translate(-50%, -50%)\"\n cursor=\"pointer\"\n transition=\"all 0.2s ease\"\n boxShadow=\"sm\"\n _hover={{ transform: 'translate(-50%, -50%) scale(1.06)', boxShadow: 'md' }}\n _active={{ transform: 'translate(-50%, -50%) scale(0.98)' }}\n _focusVisible={{ boxShadow: '0 0 0 3px var(--chakra-colors-blue-300)' }}\n onClick={() => umamiTrackEvent('Gallery Link Click', { album_id: (data as any).gallery_album_id })}\n >\n Zobrazit celou galerii\n </Button>\n </Box>\n )}\n </Box>\n );\n })()}\n </Box>\n </Box>\n )}\n {/* Polls moved to sidebar */}\n </Stack>\n </Box>\n <VStack align=\"stretch\" spacing={6} gridColumn={{ base: '1 / -1', lg: 'span 4' }}>\n\n {relatedArticlesQuery.isLoading ? null : (() => {\n const list = ((relatedArticlesQuery.data as any)?.data || [])\n .filter((a: any) => a?.id !== (data as any)?.id)\n .slice(0, 4);\n if (!list.length) return null;\n return (\n <Widget title=\"Podobné články\">\n <VStack spacing={3} align=\"stretch\">\n {list.map((a: any) => {\n const link = a.slug ? `/news/${a.slug}` : `/articles/${a.id}`;\n return (\n <HStack key={a.id} align=\"flex-start\" spacing={3} as={RouterLink} to={link} _hover={{ textDecoration: 'none' }}>\n <Image src={assetUrl(a.image_url) || '/stadium-placeholder.jpg'} alt={a.title} boxSize=\"64px\" objectFit=\"cover\" borderRadius=\"md\" />\n <VStack align=\"start\" spacing={1} flex={1} minW={0}>\n <Text fontWeight=\"600\" noOfLines={2}>{a.title}</Text>\n {a.published_at && (\n <Text fontSize=\"sm\" color={textMuted}>{new Date(a.published_at).toLocaleDateString('cs-CZ')}</Text>\n )}\n </VStack>\n </HStack>\n );\n })}\n </VStack>\n </Widget>\n );\n })()}\n\n <MatchesWidget\n categoryName={categoryNameForMatches}\n hideEmpty\n onMatchClick={(m: any) => {\n setSelectedMatch({ ...m, competition: (m as any).competitionName, competitionName: (m as any).competitionName });\n setIsMatchModalOpen(true);\n }}\n />\n\n {(() => {\n const shouldShowMini = !categoryNameForMatches || (catUpcomingMatches || []).length === 0;\n if (!shouldShowMini) return null;\n const WEEKDAYS = ['Po','Út','St','Čt','Pá','So','Ne'];\n const todayKey = (() => { try { const d = new Date(); return `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}`; } catch { return ''; } })();\n return (\n <Widget title=\"Kalendář zápasů\">\n <VStack align=\"stretch\" spacing={2}>\n <HStack justify=\"space-between\">\n <HStack spacing={2}>\n <Button size=\"xs\" variant=\"outline\" onClick={() => setMiniMonthRef(addMonths(miniMonthRef, -1))}>{''}</Button>\n <Text fontWeight=\"600\">{format(miniMonthRef, 'LLLL yyyy', { locale: cs })}</Text>\n <Button size=\"xs\" variant=\"outline\" onClick={() => setMiniMonthRef(new Date())}>Dnes</Button>\n <Button size=\"xs\" variant=\"outline\" onClick={() => setMiniMonthRef(addMonths(miniMonthRef, 1))}>{''}</Button>\n </HStack>\n </HStack>\n <SimpleGrid columns={7} spacing={1}>\n {WEEKDAYS.map((w) => (\n <Box key={w} textAlign=\"center\" fontSize=\"xs\" color={textMuted}>{w}</Box>\n ))}\n {miniWeeks.map((d, idx) => {\n const key = format(d, 'yyyy-MM-dd');\n const list = miniByDate.get(key) || [];\n const faded = !isSameMonth(d, miniMonthRef);\n const isToday = key === todayKey;\n return (\n <Box\n key={idx}\n p={1}\n borderWidth=\"2px\"\n borderColor={miniExpandedKey === key ? 'blue.500' : (isToday ? 'blue.400' : 'gray.200')}\n borderRadius=\"md\"\n bg={miniExpandedKey === key ? miniTodayBg : (isToday ? miniTodayBg : undefined)}\n cursor={list.length ? 'pointer' : 'default'}\n opacity={faded ? 0.6 : 1}\n onClick={() => {\n if (!list.length) return;\n setMiniExpandedKey((prev) => prev === key ? null : key);\n }}\n >\n <HStack justify=\"space-between\">\n <Text fontSize=\"xs\" fontWeight=\"600\">{format(d, 'd', { locale: cs })}</Text>\n {!!list.length && (\n <Badge colorScheme=\"blue\" borderRadius=\"full\" fontSize=\"9px\">{list.length}</Badge>\n )}\n </HStack>\n </Box>\n );\n })}\n </SimpleGrid>\n {miniExpandedKey && (miniByDate.get(miniExpandedKey) || []).length > 0 && (\n <VStack align=\"stretch\" spacing={1}>\n {(miniByDate.get(miniExpandedKey) || []).slice(0, 5).map((m: any, i: number) => (\n <HStack key={`${miniExpandedKey}-${i}`} spacing={2} align=\"center\" onClick={() => {\n const snapshot = {\n date_time: m.date_time,\n venue: m.venue,\n home: m.home,\n away: m.away,\n competition: m.competitionName,\n score: (m.score || ''),\n facr_link: (m as any).facr_link,\n report_url: (m as any).report_url,\n home_logo_url: (m as any).home_logo_url,\n away_logo_url: (m as any).away_logo_url,\n } as any;\n setSelectedMatch(snapshot);\n setIsMatchModalOpen(true);\n }} cursor=\"pointer\" _hover={{ bg: miniHoverBg }} p={1} borderRadius=\"md\">\n <Text fontSize=\"xs\" color={textMuted} minW=\"42px\">{String(m.date_time || '').split(' ')[1] || '—'}</Text>\n <TeamLogo\n size=\"small\"\n teamId={String((m as any).home_id || '')}\n teamName={String((m as any).home || '')}\n facrLogo={(m as any).home_logo_url}\n />\n <Text fontSize=\"sm\" noOfLines={1} flex={1} minW={0}>{m.home} vs {m.away}</Text>\n <TeamLogo\n size=\"small\"\n teamId={String((m as any).away_id || '')}\n teamName={String((m as any).away || '')}\n facrLogo={(m as any).away_logo_url}\n />\n </HStack>\n ))}\n </VStack>\n )}\n </VStack>\n </Widget>\n );\n })()}\n\n {(() => {\n const all = Array.isArray(upcomingEventsQuery.data) ? (upcomingEventsQuery.data as any[]) : [];\n const cat = (data as any)?.category?.name;\n const items = cat\n ? all.filter((ev: any) => !ev?.category_name || String(ev.category_name) === String(cat)).slice(0, 3)\n : all.slice(0, 3);\n if (!items.length) return null;\n return (\n <Widget title=\"Nejbližší aktivity\">\n <VStack spacing={3} align=\"stretch\">\n {items.map((ev: any) => (\n <HStack\n key={ev.id}\n as={RouterLink}\n to={`/aktivita/${ev.id}`}\n align=\"flex-start\"\n spacing={3}\n px={3}\n py={2}\n borderWidth=\"1px\"\n borderRadius=\"md\"\n borderColor={galleryBorder}\n bg={attachmentsBg}\n style={{ borderLeftWidth: 4, borderLeftColor: '#3182ce' }}\n _hover={{ textDecoration: 'none', bg: miniHoverBg, borderColor: 'blue.300', boxShadow: 'sm', transform: 'translateX(2px)' }}\n >\n <Box flex={1} minW={0}>\n <Text fontWeight=\"700\" noOfLines={2}>{ev.title}</Text>\n <Text fontSize=\"sm\" color={textMuted}>\n {(() => { try { const d = new Date(ev.start_time); return d.toLocaleDateString('cs-CZ') + (ev.location ? ` • ${ev.location}` : ''); } catch { return ev.start_time; } })()}\n </Text>\n </Box>\n </HStack>\n ))}\n </VStack>\n </Widget>\n );\n })()}\n\n {/* Polls in sidebar (render only when polls exist; internal wrapper handles layout) */}\n {(data as any)?.id && (\n <EmbeddedPoll articleId={(data as any).id} maxPolls={2} showTitle={false} />\n )}\n\n {/* Attachments in sidebar */}\n {Array.isArray((data as any)?.attachments) && (data as any).attachments.length > 0 && (\n <Widget title=\"Přílohy\">\n <VStack align=\"stretch\" spacing={2}>\n {(data as any).attachments.map((f: any, idx: number) => (\n <FilePreview\n key={idx}\n url={assetUrl(f.url) || f.url}\n name={f.name || ''}\n mimeType={f.mime_type || ''}\n size={f.size}\n />\n ))}\n </VStack>\n </Widget>\n )}\n\n {/* Sidebar banner placement */}\n {sidebarBanners.length > 0 && (\n <Box>\n <a\n href={sidebarBanners[0].click_url || '#'}\n target={sidebarBanners[0].click_url ? '_blank' : undefined}\n rel={sidebarBanners[0].click_url ? 'noopener noreferrer' : undefined}\n style={{ display: 'block' }}\n >\n {/* eslint-disable-next-line jsx-a11y/alt-text */}\n <img\n src={assetUrl((sidebarBanners[0] as any).image_url) || '/images/sponsors/placeholder.png'}\n alt={sidebarBanners[0].name}\n style={{ width: '100%', height: 'auto', display: 'block', borderRadius: 8 }}\n loading=\"lazy\"\n decoding=\"async\"\n />\n </a>\n </Box>\n )}\n </VStack>\n </SimpleGrid>\n </Container>\n </Box>\n {/* Comments at the end */}\n {(data as any)?.id ? (\n <Container maxW=\"7xl\" mt={6} pb={{ base: 8, md: 12 }}>\n <CommentsSection targetType=\"article\" targetId={String((data as any).id)} />\n </Container>\n ) : null}\n {/* Newsletter CTA */}\n <NewsletterCTA />\n <MatchModal isOpen={isMatchModalOpen} onClose={() => setIsMatchModalOpen(false)} match={selectedMatch} />\n {/* Image Lightbox */\n }\n <Modal isOpen={isLightboxOpen} onClose={() => setIsLightboxOpen(false)} size=\"6xl\" isCentered>\n <ModalOverlay bg=\"blackAlpha.800\" />\n <ModalContent bg=\"transparent\" boxShadow=\"none\" maxW=\"90vw\">\n <ModalCloseButton color=\"white\" bg=\"blackAlpha.600\" _hover={{ bg: 'blackAlpha.700' }} borderRadius=\"full\" zIndex={2} />\n <ModalBody p={0} position=\"relative\">\n <Box position=\"relative\" maxH=\"85vh\" display=\"flex\" alignItems=\"center\" justifyContent=\"center\">\n {lightboxImages[lightboxIndex] && (\n <Image src={lightboxImages[lightboxIndex]} alt={`Obrázek ${lightboxIndex+1}/${lightboxImages.length}`} maxH=\"85vh\" maxW=\"100%\" objectFit=\"contain\" />\n )}\n {lightboxImages.length > 1 && (\n <>\n <IconButton aria-label=\"Předchozí\" icon={<ChevronLeft />} onClick={onPrev} position=\"absolute\" left={{ base: '4%', md: '5%' }} top=\"50%\" transform=\"translateY(-50%)\" colorScheme=\"blackAlpha\" variant=\"solid\" zIndex={3} _hover={{ bg: 'blackAlpha.700', transform: 'translateY(-50%)' }} _active={{ bg: 'blackAlpha.800', transform: 'translateY(-50%)' }} />\n <IconButton aria-label=\"Další\" icon={<ChevronRight />} onClick={onNext} position=\"absolute\" right={{ base: '4%', md: '5%' }} top=\"50%\" transform=\"translateY(-50%)\" colorScheme=\"blackAlpha\" variant=\"solid\" zIndex={3} _hover={{ bg: 'blackAlpha.700', transform: 'translateY(-50%)' }} _active={{ bg: 'blackAlpha.800', transform: 'translateY(-50%)' }} />\n </>\n )}\n {/* Clickable side areas to close */}\n <Box position=\"absolute\" left={0} top={0} bottom={0} w={{ base: '6%', md: '8%' }} onClick={() => setIsLightboxOpen(false)} zIndex={1} />\n <Box position=\"absolute\" right={0} top={0} bottom={0} w={{ base: '6%', md: '8%' }} onClick={() => setIsLightboxOpen(false)} zIndex={1} />\n </Box>\n {/* Controls under image - centered with subtle bg */}\n <VStack align=\"stretch\" spacing={2} mt={3} px={2}>\n <Box display=\"flex\" justifyContent=\"center\">\n <HStack spacing={2} bg=\"blackAlpha.600\" px={3} py={2} borderRadius=\"full\">\n <Button\n size=\"sm\"\n leftIcon={<Copy size={16} />}\n onClick={async () => {\n try {\n await navigator.clipboard.writeText(lightboxImages[lightboxIndex] || '');\n toast({ title: 'Zkopírováno', status: 'success', duration: 1500 });\n } catch {\n toast({ title: 'Nepodařilo se zkopírovat', status: 'error', duration: 1500 });\n }\n }}\n >\n Kopírovat odkaz\n </Button>\n <Button\n as={Link}\n href={lightboxImages[lightboxIndex] || '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n size=\"sm\"\n leftIcon={<ExternalLink size={16} />}\n >\n Otevřít originál\n </Button>\n </HStack>\n </Box>\n \n </VStack>\n </ModalBody>\n </ModalContent>\n </Modal>\n {/* YouTube modal */}\n <Modal isOpen={isYoutubeOpen} onClose={() => setIsYoutubeOpen(false)} size=\"6xl\" isCentered>\n <ModalOverlay bg=\"blackAlpha.800\" />\n <ModalContent bg=\"black\" maxW=\"90vw\">\n <ModalCloseButton color=\"white\" _hover={{ bg: 'whiteAlpha.200' }} />\n <ModalBody p={0}>\n {(data as any)?.youtube_video_id && (\n <AspectRatio ratio={16/9}>\n <Box\n as=\"iframe\"\n src={`https://www.youtube-nocookie.com/embed/${(data as any).youtube_video_id}?autoplay=1`}\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n allowFullScreen\n title={(data as any).youtube_video_title || 'YouTube video'}\n onLoad={() => umamiTrackVideoPlay((data as any).youtube_video_id, (data as any).youtube_video_title)}\n />\n </AspectRatio>\n )}\n {(data as any)?.youtube_video_id && (\n <Box bg={youtubeCommentsBg} p={4}>\n <CommentsSection targetType=\"youtube_video\" targetId={(data as any).youtube_video_id} />\n </Box>\n )}\n </ModalBody>\n </ModalContent>\n </Modal>\n </MainLayout>\n);\n};\n\nexport default ArticleDetailPage;\n","import { Container, Heading, Text, List, ListItem, Link, Box, VStack, Divider, Button, useColorModeValue } from '@chakra-ui/react';\nimport MainLayout from '../../components/layout/MainLayout';\n\nconst CookiePolicyPage: React.FC = () => {\n const textColor = useColorModeValue('gray.700', 'gray.300');\n const headingColor = useColorModeValue('gray.900', 'gray.100');\n const boxBg = useColorModeValue('blue.50', 'blue.900');\n const boxText = useColorModeValue('blue.900', 'blue.100');\n\n const openCookieSettings = () => {\n window.dispatchEvent(new Event('cookie-consent-open'));\n };\n\n return (\n <MainLayout>\n <Container maxW=\"3xl\" py={8}>\n <VStack align=\"stretch\" spacing={6}>\n <Heading as=\"h1\" size=\"xl\" mb={2} color={headingColor}>Pravidla používání souborů cookies</Heading>\n <Text fontSize=\"sm\" color={textColor}>\n Poslední aktualizace: {new Date().toLocaleDateString('cs-CZ')}\n </Text>\n\n <Box bg={boxBg} p={4} borderRadius=\"md\">\n <Text fontWeight=\"bold\" mb={2} color={boxText}>Shrnutí</Text>\n <Text fontSize=\"sm\" color={boxText}>\n Cookies používáme pro zajištění nezbytných funkcí webu, zlepšení uživatelského zážitku a měření návštěvnosti. Nepovinné cookies ukládáme pouze na základě vašeho souhlasu.\n </Text>\n </Box>\n\n <Divider />\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>1. Co jsou cookies?</Heading>\n <Text color={textColor} mb={4}>\n Cookies jsou malé textové soubory ukládané do vašeho zařízení při návštěvě webu. Umožňují rozpoznat prohlížeč, pamatovat si vaše volby a zajistit fungování webu.\n </Text>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>2. Jaké cookies používáme</Heading>\n <List spacing={2} mb={4} styleType=\"disc\" pl={6} color={textColor}>\n <ListItem><strong>Nezbytné:</strong> zajišťují bezpečnost a základní funkce webu. Vždy aktivní.</ListItem>\n <ListItem><strong>Preferenční:</strong> pamatují si vaše volby (např. jazyk, zobrazení).</ListItem>\n <ListItem><strong>Analytické:</strong> anonymní měření návštěvnosti a výkonu stránek.</ListItem>\n <ListItem><strong>Marketingové:</strong> přizpůsobení obsahu a případného marketingu.</ListItem>\n </List>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>3. Právní základy a účely</Heading>\n <List spacing={2} mb={4} styleType=\"disc\" pl={6} color={textColor}>\n <ListItem><strong>Nezbytné cookies:</strong> oprávněný zájem na provozu a zabezpečení webu (GDPR čl. 6 odst. 1 písm. f).</ListItem>\n <ListItem><strong>Preferenční, analytické, marketingové:</strong> pouze na základě vašeho souhlasu (GDPR čl. 6 odst. 1 písm. a), který můžete kdykoli odvolat.</ListItem>\n </List>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>4. Správa souhlasu</Heading>\n <Text color={textColor} mb={3}>\n Nastavení cookies můžete kdykoli změnit pomocí tlačítka níže nebo v nastavení prohlížeče. Odvolání souhlasu nemá vliv na zákonnost předchozího zpracování.\n </Text>\n <Button onClick={openCookieSettings} colorScheme=\"blue\" size=\"sm\">Otevřít nastavení cookies</Button>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>5. Doba uchovávání</Heading>\n <List spacing={2} mb={4} styleType=\"disc\" pl={6} color={textColor}>\n <ListItem><strong>Nezbytné cookies:</strong> po dobu nezbytnou pro fungování relace či bezpečnost.</ListItem>\n <ListItem><strong>Preferenční a analytické:</strong> typicky 626 měsíců, nebo do odvolání souhlasu.</ListItem>\n <ListItem><strong>Marketingové:</strong> dle konkrétní kategorie, nejdéle do odvolání souhlasu.</ListItem>\n </List>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>6. Třetí strany</Heading>\n <Text color={textColor} mb={4}>\n Pro analytiku nebo měření můžeme využívat nástroje třetích stran. Tyto služby zpracovávají údaje pouze v rozsahu nezbytném pro poskytování měření a jsou vázány smluvními závazky ochrany údajů.\n </Text>\n </Box>\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mt={4} mb={3} color={headingColor}>7. Další informace</Heading>\n <Text color={textColor} mb={2}>\n Podrobnosti o zpracování osobních údajů najdete v <Link href=\"/zasady-ochrany-osobnich-udaju\" color=\"brand.primary\">Zásadách ochrany osobních údajů</Link>.\n </Text>\n <Text color={textColor}>\n V případě dotazů nás kontaktujte prostřednictvím stránky <Link href=\"/kontakt\" color=\"brand.primary\">Kontakt</Link>.\n </Text>\n </Box>\n </VStack>\n </Container>\n </MainLayout>\n );\n};\n\nexport default CookiePolicyPage;\n","import React, { useState, useRef, useEffect, useMemo } from 'react';\nimport {\n Box,\n Button,\n FormControl,\n FormLabel,\n FormErrorMessage,\n Heading,\n HStack,\n IconButton,\n Image,\n Input,\n Modal,\n ModalBody,\n ModalCloseButton,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalOverlay,\n Select,\n Spinner,\n Switch,\n Table,\n Tbody,\n Td,\n Textarea,\n Th,\n Thead,\n Tr,\n useColorModeValue,\n useDisclosure,\n useToast,\n VStack,\n SimpleGrid,\n NumberInput,\n NumberInputField,\n} from '@chakra-ui/react';\nimport { FiEdit2, FiTrash2, FiPlus } from 'react-icons/fi';\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport { Player, getPlayers, createPlayer, updatePlayer, deletePlayer } from '../../services/players';\nimport { uploadFile } from '../../services/articles';\nimport { translateNationality, getCountryFlag } from '../../utils/nationality';\nimport ThumbnailPreview from '../../components/common/ThumbnailPreview';\nimport { assetUrl } from '../../utils/url';\nimport UploadPanel, { UploadPanelFile } from '../../components/common/UploadPanel';\n\ntype Editing = Partial<Player> & { id?: number };\n\nconst PlayersAdminPage: React.FC = () => {\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const inputBg = useColorModeValue('white', 'gray.700');\n const toast = useToast();\n \n\n // Hoisted helper: convert country code to flag emoji\n function countryCodeToEmoji(cc: string) {\n if (!cc) return '';\n return cc.toUpperCase().replace(/./g, (char) => String.fromCodePoint(127397 + char.charCodeAt(0)));\n }\n\n const uploadPlayerPhoto = async (file: File): Promise<UploadPanelFile> => {\n const res = file.type === 'image/svg+xml' ? await uploadFile(file) : await compressAndUpload(file);\n return {\n url: res.url,\n name: file.name,\n type: file.type || (res as any).type || 'image/*',\n size: file.size || (res as any).size || 0,\n };\n };\n\n // Countries for nationality dropdown\n const [countries, setCountries] = useState<Array<{ name: string; cca2: string; emoji: string }>>([]);\n // Search query for filtering nationality dropdown\n const [countryQuery, setCountryQuery] = useState<string>(\"\");\n const countrySearchRef = useRef<HTMLInputElement | null>(null);\n const countrySelectRef = useRef<HTMLSelectElement | null>(null);\n // Simple fuzzy match scoring: higher is better\n function fuzzyScore(text: string, query: string): number {\n if (!query) return 0;\n const t = (text || '').toLowerCase();\n const q = (query || '').toLowerCase();\n // Exact and prefix bonuses\n if (t === q) return 1000;\n if (t.startsWith(q)) return 800 - (t.length - q.length);\n // Subsequence score\n let ti = 0, qi = 0, score = 0, streak = 0;\n while (ti < t.length && qi < q.length) {\n if (t[ti] === q[qi]) {\n streak += 1;\n score += 10 + streak; // reward consecutive matches\n qi++;\n } else {\n streak = 0;\n }\n ti++;\n }\n // Small penalty for distance\n if (qi === q.length) {\n return score - Math.abs(t.length - q.length);\n }\n return -Infinity; // not all chars matched in order\n }\n\n const filteredCountries = useMemo(() => {\n const q = countryQuery.trim();\n if (!q) return countries;\n // Score by name and cca2 and take the better score\n const scored = countries\n .map((c) => ({\n c,\n s: Math.max(\n fuzzyScore(c.name, q),\n fuzzyScore(c.cca2, q)\n ),\n }))\n .filter((x) => x.s > -Infinity)\n .sort((a, b) => b.s - a.s || a.c.name.localeCompare(b.c.name, 'cs', { sensitivity: 'base' }))\n .map((x) => x.c);\n return scored;\n }, [countries, countryQuery]);\n useEffect(() => {\n let mounted = true;\n (async () => {\n try {\n // Try v3.1 API first\n let json: any[] | null = null;\n const tryUrls = [\n 'https://restcountries.com/v3.1/all?fields=name,cca2',\n // fallback: v2 API\n 'https://restcountries.com/v2/all?fields=name,alpha2Code',\n // minimal fallback without fields (may be heavier, but used only if above fail)\n 'https://restcountries.com/v3.1/all',\n ];\n let lastErr: any = null;\n for (const url of tryUrls) {\n try {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`countries ${res.status}`);\n const data = await res.json();\n if (Array.isArray(data)) { json = data; break; }\n } catch (e) {\n lastErr = e;\n }\n }\n if (!mounted) return;\n if (!json) throw lastErr || new Error('countries fetch failed');\n const list = (json || []).map((c: any) => {\n const name = c?.name?.common || c?.name || '';\n const cca2 = c?.cca2 || c?.alpha2Code || '';\n return {\n name,\n cca2,\n emoji: countryCodeToEmoji(cca2),\n };\n }).filter((c: any) => c.name && c.cca2).sort((a: any, b: any) => a.name.localeCompare(b.name, 'cs', { sensitivity: 'base' }));\n setCountries(list);\n } catch (err) {\n // Hard fallback list for most common nationalities used locally\n const fallback = [\n { name: 'Czechia', cca2: 'CZ', emoji: countryCodeToEmoji('CZ') },\n { name: 'Slovakia', cca2: 'SK', emoji: countryCodeToEmoji('SK') },\n { name: 'Poland', cca2: 'PL', emoji: countryCodeToEmoji('PL') },\n { name: 'Germany', cca2: 'DE', emoji: countryCodeToEmoji('DE') },\n { name: 'Austria', cca2: 'AT', emoji: countryCodeToEmoji('AT') },\n { name: 'Ukraine', cca2: 'UA', emoji: countryCodeToEmoji('UA') },\n { name: 'France', cca2: 'FR', emoji: countryCodeToEmoji('FR') },\n { name: 'Spain', cca2: 'ES', emoji: countryCodeToEmoji('ES') },\n { name: 'Italy', cca2: 'IT', emoji: countryCodeToEmoji('IT') },\n { name: 'England', cca2: 'GB', emoji: countryCodeToEmoji('GB') },\n ];\n setCountries(fallback);\n }\n })();\n return () => { mounted = false; };\n }, []);\n\n // Persist countryQuery across sessions\n useEffect(() => {\n try {\n const saved = localStorage.getItem('playersAdmin.countryQuery');\n if (saved) setCountryQuery(saved);\n } catch {}\n }, []);\n useEffect(() => {\n try {\n localStorage.setItem('playersAdmin.countryQuery', countryQuery);\n } catch {}\n }, [countryQuery]);\n\n // Helper: compress image client-side, resize to max dimension and convert to JPEG to reduce size\n const compressAndUpload = async (file: File) => {\n const img = await readFileAsImage(file);\n const maxDim = 1400;\n let { width, height } = img;\n if (width > maxDim || height > maxDim) {\n const ratio = Math.min(maxDim / width, maxDim / height);\n width = Math.round(width * ratio);\n height = Math.round(height * ratio);\n }\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0, width, height);\n // Use JPEG for good compression; backend can accept jpeg (serving as png not mandatory)\n const blob: Blob | null = await new Promise((resolve) => canvas.toBlob(resolve as any, 'image/jpeg', 0.78));\n if (!blob) throw new Error('compression failed');\n const f = new File([blob], file.name.replace(/\\.[^/.]+$/, '') + '.jpg', { type: 'image/jpeg' });\n return await uploadFile(f);\n };\n\n // Hoisted helper: read file into HTMLImageElement\n function readFileAsImage(file: File) {\n return new Promise<HTMLImageElement>((resolve, reject) => {\n const fr = new FileReader();\n fr.onload = () => {\n const img = new window.Image();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = fr.result as string;\n };\n fr.onerror = reject;\n fr.readAsDataURL(file);\n });\n }\n\n const qc = useQueryClient();\n const { data, isLoading } = useQuery({ queryKey: ['admin-players', { active: false }], queryFn: () => getPlayers({ active: false }) });\n\n const [editing, setEditing] = useState<Editing | null>(null);\n const { isOpen, onOpen, onClose } = useDisclosure();\n\n const JERSEY_MIN = 0;\n const HEIGHT_MIN = 0;\n const HEIGHT_MAX = 250;\n const WEIGHT_MIN = 0;\n const WEIGHT_MAX = 400;\n\n // Local state to persist partial DOB selections so the user sees what they picked\n const [dobParts, setDobParts] = useState<{ day: string; month: string; year: string }>({ day: '', month: '', year: '' });\n\n const openCreate = () => { setEditing({ first_name: '', last_name: '', is_active: true, email: '', phone: '', gender: '' } as any); setDobFromDateStr(''); onOpen(); };\n const openEdit = (p: Player) => { setEditing({ ...p }); setDobFromDateStr(p.date_of_birth || ''); onOpen(); };\n const closeModal = () => { setEditing(null); onClose(); };\n\n const createMut = useMutation({\n mutationFn: (payload: any) => createPlayer(payload),\n onSuccess: (created: any) => {\n try {\n qc.setQueryData(['admin-players', { active: false }], (old: any) => {\n const list = Array.isArray(old) ? old : (old?.data || []);\n const newList = [created, ...list];\n if (old && old.data) return { ...old, data: newList };\n return newList;\n });\n } catch (e) {}\n toast({ title: 'Hráč vytvořen', status: 'success' });\n qc.invalidateQueries({ queryKey: ['admin-players', { active: false }] });\n closeModal();\n },\n onError: (e: any) => {\n const status = e?.response?.status;\n const msg = e?.response?.data?.chyba || e?.response?.data?.error || e?.message || 'Chyba';\n toast({ title: 'Vytvoření selhalo', description: status ? `HTTP ${status}: ${msg}` : msg, status: 'error' });\n },\n });\n const updateMut = useMutation({\n mutationFn: ({ id, payload }: { id: number | string; payload: any }) => updatePlayer(id, payload),\n onSuccess: () => { toast({ title: 'Hráč upraven', status: 'success' }); qc.invalidateQueries({ queryKey: ['admin-players', { active: false }] }); closeModal(); },\n onError: (e: any) => {\n const status = e?.response?.status;\n const msg = e?.response?.data?.chyba || e?.response?.data?.error || e?.message || 'Chyba';\n toast({ title: 'Aktualizace selhala', description: status ? `HTTP ${status}: ${msg}` : msg, status: 'error' });\n },\n });\n const deleteMut = useMutation({\n mutationFn: (id: number) => deletePlayer(id),\n onSuccess: () => { toast({ title: 'Hráč smazán', status: 'success' }); qc.invalidateQueries({ queryKey: ['admin-players', { active: false }] }); },\n onError: (e: any) => {\n const status = e?.response?.status;\n const msg = e?.response?.data?.chyba || e?.response?.data?.error || e?.message || 'Chyba';\n toast({ title: 'Smazání selhalo', description: status ? `HTTP ${status}: ${msg}` : msg, status: 'error' });\n },\n });\n\n const maybeSplitName = () => {\n setEditing((p) => {\n if (!p) return p;\n const fn = (p.first_name || '').trim();\n const ln = (p.last_name || '').trim();\n if (!ln && fn.includes(' ')) {\n const parts = fn.split(/\\s+/).filter(Boolean);\n if (parts.length >= 2) {\n return { ...(p as any), first_name: parts[0], last_name: parts[parts.length - 1] } as any;\n }\n }\n return p as any;\n });\n };\n\n const onSubmit = async () => {\n if (!editing) return;\n let fn = (editing.first_name || '').trim();\n let ln = (editing.last_name || '').trim();\n if (!ln && fn.includes(' ')) {\n const parts = fn.split(/\\s+/).filter(Boolean);\n if (parts.length >= 2) {\n fn = parts[0];\n ln = parts[parts.length - 1];\n }\n }\n if (!fn || !ln) {\n toast({ title: 'Jméno a příjmení jsou povinné', status: 'warning' });\n return;\n }\n const tooBig = (\n typeof editing.height === 'number' && Number.isFinite(editing.height) && editing.height > HEIGHT_MAX\n ) || (\n typeof editing.weight === 'number' && Number.isFinite(editing.weight) && editing.weight > WEIGHT_MAX\n );\n if (tooBig) {\n toast({ title: 'Neplatná čísla', description: `Maxima: výška ${HEIGHT_MAX} cm, váha ${WEIGHT_MAX} kg`, status: 'warning' });\n return;\n }\n // Require date of birth: all three values must be selected\n if (!dobParts.day || !dobParts.month || !dobParts.year) {\n toast({ title: 'Datum narození je povinné', description: 'Vyberte den, měsíc i rok.', status: 'warning' });\n return;\n }\n // Build payload by including only present values to satisfy backend validation\n const payload: any = {\n first_name: fn,\n last_name: ln,\n };\n if (editing.date_of_birth) payload.date_of_birth = editing.date_of_birth;\n if (editing.position) payload.position = editing.position;\n if (typeof editing.jersey_number === 'number' && Number.isFinite(editing.jersey_number) && editing.jersey_number >= 0) {\n payload.jersey_number = editing.jersey_number;\n }\n if (editing.nationality) payload.nationality = editing.nationality;\n if (typeof editing.height === 'number' && Number.isFinite(editing.height) && editing.height > 0) {\n payload.height = editing.height;\n }\n if (typeof editing.weight === 'number' && Number.isFinite(editing.weight) && editing.weight > 0) {\n payload.weight = editing.weight;\n }\n if (editing.image_url) payload.image_url = editing.image_url;\n if ((editing as any).gender) payload.gender = (editing as any).gender;\n if (typeof editing.is_active === 'boolean') payload.is_active = editing.is_active;\n const email = ((editing as any).email || '').trim();\n const phone = ((editing as any).phone || '').trim();\n if (email) payload.email = email;\n if (phone) payload.phone = phone;\n try {\n if ((editing as any).id != null) {\n await updateMut.mutateAsync({ id: (editing as any).id, payload });\n } else {\n await createMut.mutateAsync(payload);\n }\n } catch (err) {\n // handled by mutation\n }\n };\n\n return (\n <AdminLayout requireAdmin={false}>\n <Heading size=\"lg\" mb={4}>Hráči</Heading>\n\n <HStack mb={4}>\n <Button leftIcon={<FiPlus />} colorScheme=\"blue\" onClick={openCreate}>Nový hráč</Button>\n </HStack>\n\n <Box bg={cardBg} borderWidth=\"1px\" borderRadius=\"md\" overflowX=\"auto\">\n <Table size=\"sm\">\n <Thead>\n <Tr>\n <Th w=\"80px\">Fotka</Th>\n <Th>Jméno</Th>\n <Th>Pozice</Th>\n <Th>Pohlaví</Th>\n <Th>Národnost</Th>\n <Th w=\"120px\">Číslo</Th>\n <Th w=\"120px\">Aktivní</Th>\n <Th w=\"160px\">Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {isLoading && (<Tr><Td colSpan={7}>Načítám...</Td></Tr>)}\n {!isLoading && (data || []).map((p) => (\n <Tr key={p.id} opacity={p.is_active ? 1 : 0.6}>\n <Td>\n <ThumbnailPreview \n src={assetUrl(p.image_url) || '/dist/img/player-placeholder.svg'} \n alt={`${p.first_name} ${p.last_name}`} \n size=\"48px\"\n previewSize=\"300px\"\n borderRadius=\"md\"\n />\n </Td>\n <Td>{p.first_name} {p.last_name}</Td>\n <Td>{p.position || '-'}</Td>\n <Td>{p.gender ? (String(p.gender).toLowerCase() === 'women' ? 'Žena' : 'Muž') : '-'}</Td>\n <Td>\n {p.nationality ? (\n <HStack spacing={2}>\n <span>{getCountryFlag(p.nationality)}</span>\n <span>{translateNationality(p.nationality)}</span>\n </HStack>\n ) : '-'}\n </Td>\n <Td>{p.jersey_number ?? '-'}</Td>\n <Td><Switch isChecked={!!p.is_active} onChange={() => { if (p.id != null) updateMut.mutate({ id: p.id, payload: { is_active: !p.is_active } }); }} /></Td>\n <Td>\n <HStack>\n <IconButton aria-label=\"Upravit\" size=\"sm\" icon={<FiEdit2 />} onClick={() => openEdit(p)} />\n <IconButton aria-label=\"Smazat\" size=\"sm\" colorScheme=\"red\" icon={<FiTrash2 />} onClick={async () => { if (!confirm('Opravdu smazat záznam?')) return; if (p.id != null) await deleteMut.mutateAsync(p.id); }} />\n </HStack>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n\n <Modal isOpen={isOpen} onClose={closeModal} size=\"lg\">\n <ModalOverlay />\n <ModalContent maxW=\"90vw\" maxH=\"90vh\" overflowY=\"auto\">\n <ModalHeader>{(editing as any)?.id ? 'Upravit hráče' : 'Nový hráč'}</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack align=\"stretch\" spacing={4}>\n <SimpleGrid columns={[1, 2]} spacing={4}>\n <FormControl isRequired>\n <FormLabel>Jméno</FormLabel>\n <Input value={editing?.first_name || ''} onChange={(e) => setEditing((p) => ({ ...(p as any), first_name: e.target.value }))} onBlur={maybeSplitName} />\n </FormControl>\n <FormControl isRequired>\n <FormLabel>Příjmení</FormLabel>\n <Input value={editing?.last_name || ''} onChange={(e) => setEditing((p) => ({ ...(p as any), last_name: e.target.value }))} />\n </FormControl>\n\n {/* Custom DOB picker: day / month / year (timezone-safe) */}\n <FormControl isRequired>\n <FormLabel>Datum narození</FormLabel>\n <HStack>\n <Select value={dobParts.day} onChange={(e) => updateDobPart('day', e.target.value)}>\n <option value=\"\" disabled>Den</option>\n {Array.from({ length: 31 }).map((_, i) => <option key={i+1} value={(i+1).toString()}>{i+1}</option>)}\n </Select>\n <Select value={dobParts.month} onChange={(e) => updateDobPart('month', e.target.value)}>\n <option value=\"\" disabled>Měsíc</option>\n {Array.from({ length: 12 }).map((_, i) => <option key={i+1} value={(i+1).toString()}>{i+1}</option>)}\n </Select>\n <Select value={dobParts.year} onChange={(e) => updateDobPart('year', e.target.value)}>\n <option value=\"\" disabled>Rok</option>\n {Array.from({ length: 80 }).map((_, i) => { const y = new Date().getFullYear() - i; return <option key={y} value={String(y)}>{y}</option>; })}\n </Select>\n </HStack>\n <Box mt={2} fontSize=\"sm\" color=\"gray.500\">\n {formatDobPreview(dobParts)}{(() => { const a = calculateAgeFromParts(dobParts); return a != null ? ` — ${a} ${czYears(a)}` : ''; })()}\n </Box>\n </FormControl>\n\n <FormControl>\n <FormLabel>Pozice</FormLabel>\n <Select value={editing?.position || ''} onChange={(e) => setEditing((p) => ({ ...(p as any), position: e.target.value }))}>\n <option value=\"\">— vyberte pozici —</option>\n <option value=\"Brankář\">Brankář</option>\n <option value=\"Obránce\">Obránce</option>\n <option value=\"Záložník\">Záložník</option>\n <option value=\"Útočník\">Útočník</option>\n <option value=\"Univerzál\">Univerzál</option>\n </Select>\n </FormControl>\n\n <FormControl>\n <FormLabel>Pohlaví</FormLabel>\n <Select value={(editing as any)?.gender || ''} onChange={(e) => setEditing((p) => ({ ...(p as any), gender: e.target.value }))}>\n <option value=\"\">— nevybráno —</option>\n <option value=\"men\">Muž</option>\n <option value=\"women\">Žena</option>\n </Select>\n </FormControl>\n\n <FormControl>\n <FormLabel>Číslo dresu</FormLabel>\n <NumberInput min={JERSEY_MIN} keepWithinRange={false} clampValueOnBlur={false} value={typeof editing?.jersey_number === 'number' ? editing?.jersey_number : ''} onChange={(_, v) => setEditing((p) => ({ ...(p as any), jersey_number: Number.isFinite(v) && v >= 0 ? v : undefined }))}>\n <NumberInputField inputMode=\"numeric\" />\n </NumberInput>\n </FormControl>\n\n <FormControl>\n <FormLabel>Národnost</FormLabel>\n <VStack align=\"stretch\" spacing={2}>\n <Input\n placeholder=\"Hledat zemi (např. cz, czechia)…\"\n value={countryQuery}\n onChange={(e) => setCountryQuery(e.target.value)}\n ref={countrySearchRef}\n onKeyDown={(e) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n countrySelectRef.current?.focus();\n } else if (e.key === 'Escape') {\n setCountryQuery('');\n } else if (e.key === 'Enter') {\n if (filteredCountries.length === 1) {\n const only = filteredCountries[0];\n setEditing((p) => ({ ...(p as any), nationality: only.name }));\n countrySelectRef.current?.focus();\n }\n }\n }}\n />\n <Select\n placeholder=\"— vyberte zemi —\"\n value={editing?.nationality || ''}\n onChange={(e) => setEditing((p) => ({ ...(p as any), nationality: e.target.value }))}\n ref={countrySelectRef}\n onKeyDown={(e) => {\n if (e.key === 'ArrowUp' && (e.target as HTMLSelectElement).selectedIndex === 0) {\n // Move back to search\n e.preventDefault();\n countrySearchRef.current?.focus();\n }\n }}\n >\n {filteredCountries.map((c) => (\n <option key={c.cca2} value={c.name}>\n {c.emoji} {translateNationality(c.name)} ({c.name})\n </option>\n ))}\n </Select>\n </VStack>\n </FormControl>\n\n <FormControl isInvalid={typeof editing?.height === 'number' && (editing?.height as number) > HEIGHT_MAX}>\n <FormLabel>Výška (cm)</FormLabel>\n <NumberInput min={HEIGHT_MIN} max={HEIGHT_MAX} keepWithinRange={false} clampValueOnBlur={false} value={typeof editing?.height === 'number' ? editing?.height : ''} onChange={(_, v) => setEditing((p) => ({ ...(p as any), height: Number.isFinite(v) ? v : undefined }))}>\n <NumberInputField inputMode=\"numeric\" />\n </NumberInput>\n <FormErrorMessage>Maximální výška je {HEIGHT_MAX} cm.</FormErrorMessage>\n </FormControl>\n <FormControl isInvalid={typeof editing?.weight === 'number' && (editing?.weight as number) > WEIGHT_MAX}>\n <FormLabel>Váha (kg)</FormLabel>\n <NumberInput min={WEIGHT_MIN} max={WEIGHT_MAX} keepWithinRange={false} clampValueOnBlur={false} value={typeof editing?.weight === 'number' ? editing?.weight : ''} onChange={(_, v) => setEditing((p) => ({ ...(p as any), weight: Number.isFinite(v) ? v : undefined }))}>\n <NumberInputField inputMode=\"numeric\" />\n </NumberInput>\n <FormErrorMessage>Maximální váha je {WEIGHT_MAX} kg.</FormErrorMessage>\n </FormControl>\n {/* Optional contact info (not shown publicly) */}\n <FormControl>\n <FormLabel>Email (nepovinné)</FormLabel>\n <Input type=\"email\" value={(editing as any)?.email || ''} onChange={(e) => setEditing((p) => ({ ...(p as any), email: e.target.value }))} />\n </FormControl>\n <FormControl>\n <FormLabel>Telefon (nepovinné)</FormLabel>\n <Input\n type=\"tel\"\n inputMode=\"tel\"\n value={(editing as any)?.phone || ''}\n onChange={(e) => {\n const v = e.target.value.replace(/[^0-9+\\s()-]/g, '');\n setEditing((p) => ({ ...(p as any), phone: v }));\n }}\n onKeyDown={(e) => {\n if (\n e.key.length === 1 &&\n /[^0-9+\\s()-]/.test(e.key) &&\n !e.ctrlKey && !e.metaKey && !e.altKey\n ) {\n e.preventDefault();\n }\n }}\n onPaste={(e) => {\n const pasted = e.clipboardData.getData('text');\n const sanitized = pasted.replace(/[^0-9+\\s()-]/g, '');\n if (pasted !== sanitized) {\n e.preventDefault();\n const input = e.currentTarget;\n const start = input.selectionStart || 0;\n const end = input.selectionEnd || 0;\n const current = input.value;\n const next = current.slice(0, start) + sanitized + current.slice(end);\n setEditing((p) => ({ ...(p as any), phone: next }));\n requestAnimationFrame(() => {\n try { input.setSelectionRange(start + sanitized.length, start + sanitized.length); } catch {}\n });\n }\n }}\n />\n </FormControl>\n <Box gridColumn=\"1 / -1\" fontSize=\"sm\" color=\"gray.600\">\n Upozornění: telefonní číslo a email budou viditelné na hlavní stránce. Údaje nejsou povinné — pokud je nechcete zadávat, ponechte je prázdné.\n </Box>\n </SimpleGrid>\n\n <FormControl>\n <FormLabel>Fotka</FormLabel>\n <HStack align=\"flex-start\" spacing={3}>\n <Image src={assetUrl(editing?.image_url) || '/player-placeholder.svg'} alt=\"photo\" boxSize=\"56px\" objectFit=\"cover\" borderRadius=\"md\" fallbackSrc=\"/dist/img/logo-club-empty.svg\" />\n <Box flex=\"1\">\n <UploadPanel\n label=\"Nahrát fotku hráče\"\n description=\"Nahrajte fotku hráče (portrét).\"\n accept=\"image/*,image/svg+xml\"\n multiple={false}\n maxFiles={1}\n uploadFn={uploadPlayerPhoto}\n allowUrlImport={false}\n onUploadFinished={(uploaded) => {\n const last = uploaded[uploaded.length - 1];\n if (!last) return;\n setEditing((p) => ({ ...(p as any), image_url: last.url }));\n }}\n />\n </Box>\n </HStack>\n </FormControl>\n\n <FormControl display=\"flex\" alignItems=\"center\">\n <FormLabel mb=\"0\">Aktivní</FormLabel>\n <Switch isChecked={!!editing?.is_active} onChange={(e) => setEditing((p) => ({ ...(p as any), is_active: e.target.checked }))} />\n </FormControl>\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"ghost\" mr={3} onClick={closeModal}>Zrušit</Button>\n <Button colorScheme=\"blue\" onClick={onSubmit} isLoading={createMut.isLoading || updateMut.isLoading}>Uložit</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </AdminLayout>\n );\n\n // Helpers for DOB to avoid timezone shifts\n function parseYmd(s?: string | null): { y: number; m: number; d: number } | null {\n if (!s) return null;\n // Accept plain date 'YYYY-MM-DD' or ISO datetime starting with that date\n const m = String(s).match(/^(\\d{4})-(\\d{2})-(\\d{2})(?:$|T)/);\n if (!m) return null;\n const y = Number(m[1]);\n const mm = Number(m[2]);\n const dd = Number(m[3]);\n if (!y || !mm || !dd) return null;\n return { y, m: mm, d: dd };\n }\n\n function setDobFromDateStr(s?: string) {\n const p = parseYmd(s || null);\n if (!p) { setDobParts({ day: '', month: '', year: '' }); return; }\n setDobParts({ day: String(p.d), month: String(p.m), year: String(p.y) });\n }\n\n function formatDobPreview(parts: { day: string; month: string; year: string }): string {\n const dd = parts.day ? parts.day.toString().padStart(2, '0') : '__';\n const mm = parts.month ? parts.month.toString().padStart(2, '0') : '__';\n const yyyy = parts.year || '____';\n return `${dd}.${mm}.${yyyy}`;\n }\n\n function calculateAgeFromParts(parts: { day: string; month: string; year: string }): number | null {\n if (!parts.day || !parts.month || !parts.year) return null;\n const y = Number(parts.year);\n const m = Number(parts.month);\n const d = Number(parts.day);\n if (!Number.isFinite(y) || !Number.isFinite(m) || !Number.isFinite(d)) return null;\n const today = new Date();\n let age = today.getFullYear() - y;\n const month = today.getMonth() + 1;\n const day = today.getDate();\n if (month < m || (month === m && day < d)) age--;\n return age;\n }\n\n // Czech pluralization for years: 1 rok, 24 roky, 5+ let (1114 let)\n function czYears(n: number): string {\n if (n === 1) return 'rok';\n if (n >= 2 && n <= 4) return 'roky';\n return 'let';\n }\n\n // Update DOB parts and, when complete, compose YYYY-MM-DD. Clamp day to month length.\n function updateDobPart(part: 'day'|'month'|'year', value: string) {\n setDobParts((prev) => {\n let next = { ...prev, [part]: value } as { day: string; month: string; year: string };\n // Clamp day if month/year present\n const y = Number(next.year || '0');\n const m = Number(next.month || '0');\n const d = Number(next.day || '0');\n if (y && m && d) {\n const maxDay = new Date(y, m, 0).getDate();\n if (d > maxDay) {\n next.day = String(maxDay);\n }\n }\n // Apply to editing only when all three are set\n const yy = Number(next.year || '0');\n const mm = Number(next.month || '0');\n const dd = Number(next.day || '0');\n if (yy && mm && dd) {\n const ymd = `${yy}-${String(mm).padStart(2, '0')}-${String(dd).padStart(2, '0')}`;\n setEditing((p) => ({ ...(p as any), date_of_birth: ymd }));\n } else {\n setEditing((p) => ({ ...(p as any), date_of_birth: '' }));\n }\n return next;\n });\n }\n\n};\n\nexport default PlayersAdminPage;\n","import React from 'react';\nimport { Box, Container, Heading, VStack, Image, Text, Skeleton, LinkBox, HStack, Select, Badge, useColorModeValue, Input, InputGroup, InputLeftElement, InputRightElement, IconButton, Grid, GridItem, useMediaQuery, Tooltip } from '@chakra-ui/react';\nimport { useInfiniteQuery, useQuery } from '@tanstack/react-query';\nimport { getArticles, Article, Paginated } from '../services/articles';\nimport { getBanners, Banner as UIBanner } from '../services/banners';\nimport { Link as RouterLink, useSearchParams } from 'react-router-dom';\nimport { assetUrl } from '../utils/url';\nimport MainLayout from '../components/layout/MainLayout';\nimport { getCategories, CategoryItem } from '../services/categories';\nimport NewsletterCTA from '../components/common/NewsletterCTA';\nimport { Eye, Clock, Search, X } from 'lucide-react';\nimport InstagramGeneratorButton from '../components/admin/InstagramGeneratorButton';\nimport { Helmet } from 'react-helmet-async';\nimport { useTranslation } from 'react-i18next';\n\nconst BlogTile: React.FC<{ article: Article; variant?: 'large' | 'small' }> = ({ article, variant }) => {\n const { t } = useTranslation();\n const link = article.slug ? `/news/${article.slug}` : `/articles/${article.id}`;\n const readTime = article.read_time || article.estimated_read_minutes;\n const viewCount = article.view_count;\n const bgColor = useColorModeValue('white', 'gray.800');\n const categoryName = (article as any)?.category?.name || (article as any)?.category_name;\n const imageH = variant === 'large'\n ? ({ base: '280px', md: '360px' } as const)\n : variant === 'small'\n ? ({ base: '160px', md: '180px' } as const)\n : ({ base: '200px', md: '220px' } as const);\n\n const publishedAt = (article as any).published_at || (article as any).created_at;\n const publishedDateStr = publishedAt ? (()=>{ try { return new Date(publishedAt).toLocaleDateString('cs-CZ'); } catch { return ''; } })() : '';\n\n return (\n <LinkBox\n as={RouterLink}\n to={link}\n borderRadius=\"md\"\n overflow=\"hidden\"\n bg={bgColor}\n borderWidth=\"0\"\n _hover={{ boxShadow: 'xl', transform: 'translateY(-3px)' }}\n transition=\"all 0.25s ease\"\n position=\"relative\"\n >\n <Box position=\"relative\">\n <Image\n src={assetUrl(article.image_url) || '/stadium-placeholder.jpg'}\n alt={article.title}\n w=\"100%\"\n h={imageH}\n objectFit=\"cover\"\n loading={variant === 'large' ? 'eager' : 'lazy'}\n decoding=\"async\"\n sizes={variant === 'large' ? '(min-width: 768px) 60vw, 100vw' : '100vw'}\n fetchPriority={variant === 'large' ? 'high' as any : 'auto' as any}\n />\n <Box position=\"absolute\" inset={0} bgGradient=\"linear(to-t, rgba(0,0,0,0.55), rgba(0,0,0,0.15))\" />\n {/* Top info row: category (left), date (center), read time (right) */}\n <HStack position=\"absolute\" top={2} left={2} right={2} justify=\"space-between\" align=\"center\">\n {categoryName ? (\n <Tooltip label={t('blog.category')} hasArrow>\n <Badge bg=\"rgba(0,0,0,0.7)\" color=\"white\" fontSize=\"xs\" px={2} py={1} borderRadius=\"md\">\n {categoryName}\n </Badge>\n </Tooltip>\n ) : <Box />}\n {publishedDateStr ? (\n <Tooltip label={t('blog.publish_date')} hasArrow>\n <Badge bg=\"rgba(0,0,0,0.7)\" color=\"white\" fontSize=\"xs\" px={2} py={1} borderRadius=\"md\">\n {publishedDateStr}\n </Badge>\n </Tooltip>\n ) : <Box />}\n {readTime ? (\n <Tooltip label={t('blog.read_time')} hasArrow>\n <Badge display=\"flex\" alignItems=\"center\" gap={1} bg=\"rgba(0,0,0,0.7)\" color=\"white\" fontSize=\"xs\" px={2} py={1} borderRadius=\"md\">\n <Clock size={12} />\n {readTime} min\n </Badge>\n </Tooltip>\n ) : <Box />}\n </HStack>\n\n <Heading\n as=\"h3\"\n fontSize={variant === 'large' ? { base: 'xl', md: '2xl' } : { base: 'lg', md: 'xl' }}\n fontWeight=\"800\"\n letterSpacing=\"0.3px\"\n textTransform=\"uppercase\"\n position=\"absolute\"\n bottom={3}\n left={4}\n right={4}\n color=\"white\"\n noOfLines={2}\n >\n {article.title}\n </Heading>\n </Box>\n <InstagramGeneratorButton\n article={article as any}\n targetUrl={typeof window !== 'undefined' ? new URL(link, window.location.origin).toString() : undefined}\n placement=\"inline\"\n position=\"bottom-right\"\n size=\"sm\"\n />\n </LinkBox>\n );\n};\n\nconst BlogPage: React.FC = () => {\n const { t } = useTranslation();\n const pageSize = 18;\n const [categories, setCategories] = React.useState<CategoryItem[]>([]);\n const [searchParams, setSearchParams] = useSearchParams();\n const initialCategory = React.useMemo(() => {\n const cid = searchParams.get('category_id');\n return cid ? Number(cid) : '';\n }, []);\n const [categoryId, setCategoryId] = React.useState<number | ''>(initialCategory);\n const month = searchParams.get('month') || '';\n const matchId = searchParams.get('match_id') || '';\n const qParam = searchParams.get('q') || '';\n const [qInput, setQInput] = React.useState<string>(qParam);\n const [matchInput, setMatchInput] = React.useState<string>('');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const textColor = useColorModeValue('gray.500', 'gray.400');\n const suggestBg = useColorModeValue('white','gray.800');\n const suggestBorder = useColorModeValue('gray.200','gray.700');\n const suggestHoverBg = useColorModeValue('gray.50','gray.700');\n\n React.useEffect(() => {\n (async () => {\n try {\n const list = await getCategories();\n setCategories(list || []);\n } catch {}\n })();\n }, []);\n\n // Keep categoryId in sync with URL params (category_id preferred; fallback to category slug)\n React.useEffect(() => {\n const cid = searchParams.get('category_id');\n const slug = searchParams.get('category');\n if (cid !== null) {\n setCategoryId(cid ? Number(cid) : '');\n return;\n }\n if (slug) {\n // Try to resolve slug to id once categories are loaded\n const norm = decodeURIComponent(slug).toLowerCase();\n const found = categories.find((c) => (c as any)?.slug === slug || String(c.name).toLowerCase() === norm);\n setCategoryId(found?.id || '');\n return;\n }\n // No category param present → clear filter\n setCategoryId('');\n }, [searchParams, categories]);\n React.useEffect(() => {\n setQInput(qParam);\n }, [qParam]);\n\n // Match suggestions: only show matches that already have a blog (articles with match_snapshot)\n const matchSuggestQ = useQuery<Paginated<Article>>(\n ['blog-match-suggest', { q: matchInput }],\n () => getArticles({ page: 1, page_size: 50, published: true, q: matchInput }),\n { enabled: matchInput.trim().length >= 2 }\n );\n const matchSuggestions = React.useMemo(() => {\n const items = matchSuggestQ.data?.data || [];\n const uniq = new Map<string, any>();\n items.forEach((a: any) => {\n const ms = (a as any)?.match_snapshot;\n const id = String(ms?.external_match_id || '') || '';\n if (!id) return;\n if (!uniq.has(id)) uniq.set(id, { id, title: a.title, date: ms?.date_time || ms?.date, home: ms?.home, away: ms?.away, comp: ms?.competition || ms?.competitionName });\n });\n return Array.from(uniq.values()).slice(0, 10);\n }, [matchSuggestQ.data]);\n const {\n data,\n isLoading,\n isFetchingNextPage,\n hasNextPage,\n fetchNextPage,\n } = useInfiniteQuery<Paginated<Article>>(\n ['articles-public', { page_size: pageSize, published: true, category_id: categoryId || undefined, month: month || undefined, match_id: matchId || undefined, q: qParam || undefined }],\n ({ pageParam = 1 }) =>\n getArticles({\n page: pageParam,\n page_size: pageSize,\n published: true,\n ...(categoryId ? { category_id: Number(categoryId) } : {}),\n ...(month ? { month } : {}),\n ...(matchId ? { match_id: matchId } : {}),\n ...(qParam ? { q: qParam } : {}),\n }),\n {\n getNextPageParam: (lastPage, allPages) => {\n const loaded = allPages.reduce((sum, p) => sum + (p?.data?.length || 0), 0);\n if (!lastPage) return undefined;\n if (loaded < (lastPage.total || 0)) return allPages.length + 1;\n return undefined;\n },\n }\n );\n\n const articles = data?.pages?.flatMap((p) => p?.data || []) || [];\n const heroArticles = React.useMemo(() => articles.slice(0, 3), [articles]);\n const listArticles = React.useMemo(() => articles.slice(3), [articles]);\n\n // Fetch inline article banners (active, placement=article_inline)\n const articleBannersQ = useQuery<UIBanner[]>(\n ['banners', { placement: 'article_inline' }],\n () => getBanners({ active: true, placement: 'article_inline' }),\n { staleTime: 60 * 1000 }\n );\n const articleBanners = (articleBannersQ.data || []) as UIBanner[];\n // Decide insertion index depending on layout (1 column vs multi-column)\n const [isSmUp] = useMediaQuery('(min-width: 30em)'); // Chakra sm breakpoint (~480px)\n const insertionIndex = isSmUp ? 5 : 2;\n\n // Infinite scroll via intersection observer\n const sentinelRef = React.useRef<HTMLDivElement | null>(null);\n React.useEffect(() => {\n if (!hasNextPage || !sentinelRef.current) return;\n const el = sentinelRef.current;\n const io = new IntersectionObserver((entries) => {\n const first = entries[0];\n if (first.isIntersecting && hasNextPage && !isFetchingNextPage) {\n fetchNextPage();\n }\n }, { rootMargin: '400px' });\n io.observe(el);\n return () => io.disconnect();\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n // Derive page SEO title/description\n const parts: string[] = [t('blog.title')];\n if (categoryId) {\n const cat = categories.find((c) => c.id === Number(categoryId));\n if (cat?.name) parts.push(cat.name);\n }\n if (month) parts.push(month);\n if (matchId) parts.push(t('blog.match'));\n if (qParam) parts.push(`Hledání: ${qParam}`);\n const pageTitle = parts.join(' · ');\n const pageDesc = qParam\n ? t('blog.search_results', { query: qParam })\n : categoryId\n ? t('blog.category_articles', { category: (categories.find((c) => c.id === Number(categoryId))?.name) || '' })\n : t('blog.latest_articles');\n const canonical = typeof window !== 'undefined' ? window.location.href : undefined;\n\n // Debounced search param update when typing\n React.useEffect(() => {\n const next: Record<string, string> = {};\n if (categoryId) next.category_id = String(categoryId);\n if (month) next.month = month;\n if (matchId) next.match_id = matchId;\n if (qInput) next.q = qInput;\n const id = window.setTimeout(() => setSearchParams(next), 400);\n return () => window.clearTimeout(id);\n }, [qInput, categoryId, month, matchId]);\n\n return (\n <MainLayout>\n <Helmet>\n <title>{pageTitle}</title>\n <meta name=\"description\" content={pageDesc} />\n {canonical && <link rel=\"canonical\" href={canonical} />}\n <script type=\"application/ld+json\">\n {JSON.stringify({\n '@context': 'https://schema.org',\n '@type': 'ItemList',\n itemListElement: (articles || []).slice(0, 12).map((a, idx) => ({\n '@type': 'ListItem',\n position: idx + 1,\n url: (typeof window !== 'undefined' ? window.location.origin : '') + (a.slug ? `/news/${a.slug}` : `/articles/${a.id}`),\n name: a.title,\n })),\n })}\n </script>\n </Helmet>\n <Box>\n {/* Header like blog.html */}\n <Box bg=\"transparent\" color=\"inherit\" py={{ base: 8, md: 10 }} mb={4} borderBottom=\"1px\" borderColor={borderColor}>\n <Container maxW=\"7xl\">\n <HStack justify=\"space-between\" align=\"center\" spacing={4} wrap=\"wrap\">\n <Heading as=\"h1\" size={{ base: 'xl', md: '2xl' }}>{t('blog.title')}</Heading>\n <HStack spacing={3} w={{ base: '100%', md: '620px' }}>\n <Box flex=\"1\">\n <InputGroup>\n <InputLeftElement pointerEvents=\"none\">\n <Search size={16} />\n </InputLeftElement>\n <Input\n placeholder={t('blog.search_articles')}\n value={qInput}\n onChange={(e) => setQInput(e.target.value)}\n />\n {qInput && (\n <InputRightElement>\n <IconButton\n aria-label=\"Clear search\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setQInput('');\n const next: Record<string, string> = {};\n if (categoryId) next.category_id = String(categoryId);\n if (month) next.month = month;\n if (matchId) next.match_id = matchId;\n setSearchParams(next);\n }}\n icon={<X size={14} />}\n />\n </InputRightElement>\n )}\n </InputGroup>\n </Box>\n {!!categories.length && (\n <Select\n maxW={{ base: '48%', md: '220px' }}\n placeholder={t('blog.all_categories')}\n value={categoryId}\n onChange={(e) => {\n const val = e.target.value ? Number(e.target.value) : '';\n setCategoryId(val);\n const next: Record<string, string> = {};\n if (val) next.category_id = String(val);\n if (qParam) next.q = qParam;\n if (month) next.month = month;\n if (matchId) next.match_id = matchId;\n setSearchParams(next);\n }}\n >\n {categories.map((c) => (\n <option key={c.id} value={c.id}>{c.name}</option>\n ))}\n </Select>\n )}\n <Box flex={{ base: '1', md: '0 0 220px' }} position=\"relative\">\n <InputGroup>\n <Input\n placeholder={t('blog.search_match')}\n value={matchInput}\n onChange={(e) => setMatchInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n const s = matchInput.trim();\n if (/^\\d+$/.test(s)) {\n const next: Record<string, string> = {};\n next.match_id = s;\n if (categoryId) next.category_id = String(categoryId);\n if (month) next.month = month;\n if (qParam) next.q = qParam;\n setSearchParams(next);\n }\n }\n }}\n />\n </InputGroup>\n {(matchInput.trim().length >= 2 && matchSuggestions.length > 0) && (\n <Box position=\"absolute\" top=\"100%\" left={0} right={0} bg={suggestBg} borderWidth=\"1px\" borderColor={suggestBorder} borderRadius=\"md\" mt={1} zIndex={10} maxH=\"260px\" overflowY=\"auto\" boxShadow=\"lg\">\n {matchSuggestions.map((m: any) => (\n <Box key={m.id} px={3} py={2} _hover={{ bg: suggestHoverBg }} cursor=\"pointer\" onClick={() => {\n const next: Record<string, string> = { match_id: String(m.id) };\n if (categoryId) next.category_id = String(categoryId);\n if (month) next.month = month;\n if (qParam) next.q = qParam;\n setSearchParams(next);\n setMatchInput('');\n }}>\n <Text fontSize=\"sm\" fontWeight=\"600\" noOfLines={1}>{m.home} vs {m.away}</Text>\n <Text fontSize=\"xs\" color={textColor} noOfLines={1}>{m.date || ''}{m.comp ? ` • ${m.comp}` : ''}</Text>\n </Box>\n ))}\n </Box>\n )}\n </Box>\n </HStack>\n </HStack>\n </Container>\n </Box>\n\n {heroArticles.length > 0 && (\n <Container maxW=\"7xl\" mb={6}>\n <Grid templateColumns={{ base: '1fr', md: '2fr 1fr' }} gap={6}>\n <GridItem>\n <BlogTile article={heroArticles[0]} variant=\"large\" />\n </GridItem>\n <GridItem>\n <VStack spacing={6} align=\"stretch\">\n {heroArticles.slice(1, 3).map((a) => (\n <BlogTile key={a.id} article={a} variant=\"small\" />\n ))}\n </VStack>\n </GridItem>\n </Grid>\n </Container>\n )}\n\n <Container maxW=\"7xl\">\n {/* Responsive grid with consistent card sizing */}\n <Grid templateColumns={{ base: '1fr', sm: 'repeat(2, 1fr)', lg: 'repeat(4, 1fr)' }} gap={8}>\n {isLoading && Array.from({ length: 9 }).map((_, i) => (\n <Skeleton key={i} h={{ base: '260px', md: '300px' }} borderRadius=\"md\" />\n ))}\n {!isLoading && listArticles.map((a, idx) => (\n <React.Fragment key={`row-${a.id}`}>\n <GridItem>\n <BlogTile article={a} />\n </GridItem>\n {articleBanners.length > 0 && idx === insertionIndex && (\n <GridItem key={`banner-inline-${articleBanners[0].id}`} colSpan={{ base: 1, sm: 2, lg: 3 }}>\n <a\n href={articleBanners[0].click_url || '#'}\n target={articleBanners[0].click_url ? '_blank' : undefined}\n rel={articleBanners[0].click_url ? 'noopener noreferrer' : undefined}\n style={{ display: 'block' }}\n >\n {/* eslint-disable-next-line jsx-a11y/alt-text */}\n <img\n src={assetUrl(articleBanners[0].image_url) || '/images/sponsors/placeholder.png'}\n alt={articleBanners[0].name}\n style={{ width: '100%', height: 'auto', display: 'block', borderRadius: 8 }}\n loading=\"lazy\"\n decoding=\"async\"\n />\n </a>\n </GridItem>\n )}\n </React.Fragment>\n ))}\n </Grid>\n {isFetchingNextPage && (\n <VStack py={6}>\n <Text color={textColor}>{t('blog.loading')}</Text>\n </VStack>\n )}\n </Container>\n \n {/* Newsletter CTA */}\n <NewsletterCTA />\n \n </Box>\n </MainLayout>\n );\n};\n\nexport default BlogPage;\n","import React from 'react';\nimport {\n Modal,\n ModalOverlay,\n ModalContent,\n ModalHeader,\n ModalFooter,\n ModalBody,\n ModalCloseButton,\n Button,\n Box,\n Text,\n VStack,\n HStack,\n Badge,\n Flex,\n useColorModeValue,\n} from '@chakra-ui/react';\nimport { useTranslation } from 'react-i18next';\nimport { TeamLogo } from '../common/TeamLogo';\n\ninterface ClubModalProps {\n isOpen: boolean;\n onClose: () => void;\n club: {\n team: string;\n team_id?: string;\n team_logo_url?: string;\n rank?: string | number;\n played?: string | number;\n wins?: string | number;\n draws?: string | number;\n losses?: string | number;\n score?: string;\n points?: string | number;\n // Additional fields from FACR\n goals_scored?: string | number;\n goals_conceded?: string | number;\n goal_difference?: string | number;\n form?: string; // Last 5 matches form (e.g., \"WWDWL\")\n position_change?: number; // +/- change in position\n } | null;\n clubType?: 'football' | 'futsal';\n}\n\nconst ClubModal: React.FC<ClubModalProps> = ({ isOpen, onClose, club, clubType = 'football' }) => {\n const { t } = useTranslation();\n if (!club) return null;\n\n // Theme-aware colors\n const cardBg = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'whiteAlpha.300');\n const fallbackBg = useColorModeValue('gray.100', 'gray.700');\n const fallbackText = useColorModeValue('gray.600', 'gray.300');\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} size=\"lg\" isCentered>\n <ModalOverlay bg=\"blackAlpha.600\" backdropFilter=\"blur(4px)\" />\n <ModalContent>\n <ModalHeader>\n <Flex align=\"center\" gap={3}>\n <TeamLogo\n teamId={club.team_id}\n teamName={club.team}\n facrLogo={club.team_logo_url}\n size=\"large\"\n alt={club.team}\n borderRadius=\"full\"\n bg={cardBg}\n borderWidth=\"1px\"\n borderColor={borderColor}\n fallbackIcon={\n <Box\n w=\"48px\"\n h=\"48px\"\n bg={fallbackBg}\n borderRadius=\"full\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n color={fallbackText}\n fontSize=\"lg\"\n fontWeight=\"bold\"\n borderWidth=\"1px\"\n borderColor={borderColor}\n >\n {club.team.substring(0, 2).toUpperCase()}\n </Box>\n }\n />\n <Box>\n <Text fontSize=\"xl\" fontWeight=\"bold\">\n {club.team}\n </Text>\n {club.rank && (\n <Badge colorScheme=\"blue\" fontSize=\"sm\">\n {t('table.position_place', { position: club.rank })}\n </Badge>\n )}\n </Box>\n </Flex>\n </ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n <VStack spacing={4} align=\"stretch\">\n {/* Statistics */}\n <Box \n borderWidth=\"1px\" \n borderRadius=\"lg\" \n p={4} \n bg={useColorModeValue('gray.50', 'gray.700')}\n borderColor={borderColor}\n >\n <Text fontSize=\"md\" fontWeight=\"semibold\" mb={3} color={useColorModeValue('gray.700', 'gray.200')}>\n {t('club_modal.statistics')}\n </Text>\n <VStack spacing={2} align=\"stretch\">\n <HStack justify=\"space-between\">\n <Text color={useColorModeValue('gray.600', 'gray.300')}>{t('club_modal.matches_played')}:</Text>\n <Text fontWeight=\"bold\" color={useColorModeValue('gray.800', 'gray.100')}>{club.played || 0}</Text>\n </HStack>\n <HStack justify=\"space-between\">\n <Text color={useColorModeValue('gray.600', 'gray.300')}>{t('club_modal.wins')}:</Text>\n <Text fontWeight=\"bold\" color=\"green.600\">\n {club.wins || 0}\n </Text>\n </HStack>\n <HStack justify=\"space-between\">\n <Text color={useColorModeValue('gray.600', 'gray.300')}>{t('club_modal.draws')}:</Text>\n <Text fontWeight=\"bold\" color={useColorModeValue('gray.600', 'gray.400')}>\n {club.draws || 0}\n </Text>\n </HStack>\n <HStack justify=\"space-between\">\n <Text color={useColorModeValue('gray.600', 'gray.300')}>{t('club_modal.losses')}:</Text>\n <Text fontWeight=\"bold\" color=\"red.600\">\n {club.losses || 0}\n </Text>\n </HStack>\n <HStack justify=\"space-between\">\n <Text color={useColorModeValue('gray.600', 'gray.300')}>{t('club_modal.score')}:</Text>\n <Text fontWeight=\"bold\" color={useColorModeValue('gray.800', 'gray.100')}>{club.score || '0:0'}</Text>\n </HStack>\n {(club.goals_scored !== undefined || club.goals_conceded !== undefined) && (\n <>\n <HStack justify=\"space-between\">\n <Text color={useColorModeValue('gray.600', 'gray.300')}>{t('club_modal.goals_scored')}:</Text>\n <Text fontWeight=\"bold\" color=\"green.500\">{club.goals_scored || 0}</Text>\n </HStack>\n <HStack justify=\"space-between\">\n <Text color={useColorModeValue('gray.600', 'gray.300')}>{t('club_modal.goals_conceded')}:</Text>\n <Text fontWeight=\"bold\" color=\"red.500\">{club.goals_conceded || 0}</Text>\n </HStack>\n </>\n )}\n {club.goal_difference !== undefined && (\n <HStack justify=\"space-between\">\n <Text color={useColorModeValue('gray.600', 'gray.300')}>{t('club_modal.goal_difference')}:</Text>\n <Text fontWeight=\"bold\" color={Number(club.goal_difference) >= 0 ? 'green.600' : 'red.600'}>\n {Number(club.goal_difference) > 0 ? '+' : ''}{club.goal_difference}\n </Text>\n </HStack>\n )}\n <HStack justify=\"space-between\" pt={2} borderTopWidth=\"1px\" borderColor={borderColor}>\n <Text color={useColorModeValue('gray.700', 'gray.200')} fontWeight=\"semibold\">{t('club_modal.points')}:</Text>\n <Badge colorScheme=\"blue\" fontSize=\"lg\" px={3} py={1}>\n {club.points || 0}\n </Badge>\n </HStack>\n </VStack>\n </Box>\n\n {/* Form (Last 5 matches) */}\n {club.form && (\n <Box \n borderWidth=\"1px\" \n borderRadius=\"lg\" \n p={4} \n bg={useColorModeValue('gray.50', 'gray.700')}\n borderColor={borderColor}\n >\n <Text fontSize=\"md\" fontWeight=\"semibold\" mb={3} color={useColorModeValue('gray.700', 'gray.200')}>\n {t('club_modal.form_last_5')}\n </Text>\n <HStack spacing={2} justify=\"center\">\n {club.form.split('').map((result, idx) => (\n <Badge \n key={idx}\n colorScheme={result === 'W' ? 'green' : result === 'D' ? 'yellow' : 'red'}\n fontSize=\"md\"\n px={3}\n py={1}\n borderRadius=\"md\"\n >\n {result === 'W' ? 'V' : result === 'D' ? 'R' : 'P'}\n </Badge>\n ))}\n </HStack>\n </Box>\n )}\n </VStack>\n </ModalBody>\n <ModalFooter>\n <Button colorScheme=\"gray\" onClick={onClose}>\n {t('club_modal.close')}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n );\n};\n\nexport default ClubModal;\n","import { useEffect, useState } from 'react';\nimport { useMutation } from '@tanstack/react-query';\nimport { \n Box, \n Button, \n FormControl, \n FormLabel, \n FormErrorMessage,\n Heading, \n Input, \n Text, \n Textarea, \n VStack, \n useToast,\n useColorModeValue,\n Container,\n Tabs,\n TabList,\n TabPanels,\n Tab,\n TabPanel,\n SimpleGrid,\n HStack,\n Avatar,\n Badge,\n Icon,\n Link,\n Divider\n} from '@chakra-ui/react';\nimport { useForm } from 'react-hook-form';\nimport { sendContact } from '../services/public';\nimport { useSettings } from '../hooks/useSettings';\nimport MainLayout from '../components/layout/MainLayout';\nimport { FiMail, FiPhone, FiMapPin } from 'react-icons/fi';\nimport { trackContactSubmit, trackFormSubmit } from '../utils/umami';\nimport ContactMap from '../components/home/ContactMap';\nimport { getPublicContacts, GroupedContacts } from '../services/contactInfo';\nimport { facrApi } from '../services/facr/facrApi';\nimport { getCompetitionAliasesPublic } from '../services/competitionAliases';\nimport { getImageUrl } from '../utils/imageUtils';\nimport { useTranslation } from 'react-i18next';\n\ntype ContactFormData = {\n name: string;\n email: string;\n subject: string;\n message: string;\n source?: string;\n};\n\nconst ContactPage: React.FC = () => {\n const { t } = useTranslation();\n const toast = useToast();\n const { settings } = useSettings();\n const cardBg = useColorModeValue('white', 'gray.800');\n const cardBorder = useColorModeValue('gray.200', 'gray.700');\n const bgColor = useColorModeValue('white', 'gray.800');\n const borderColor = useColorModeValue('gray.200', 'gray.700');\n\n // Public contacts (grouped by category)\n const [contactsData, setContactsData] = useState<GroupedContacts | null>(null);\n const [contactsLoading, setContactsLoading] = useState(true);\n // Club competitions (for tabs fallback) and aliases map\n const [competitions, setCompetitions] = useState<Array<{ code?: string; name: string }>>([]);\n const [aliasesMap, setAliasesMap] = useState<Record<string, string>>({});\n\n const {\n register,\n handleSubmit,\n reset,\n formState: { errors, isSubmitting },\n } = useForm<ContactFormData>();\n\n const { mutate, isLoading } = useMutation({\n mutationFn: (data: ContactFormData) => sendContact({ ...data, source: 'contact' }),\n onSuccess: () => {\n reset();\n // Track successful contact form submission\n trackContactSubmit(true);\n trackFormSubmit('Contact Form', true);\n toast({\n title: t('contact.message_sent'),\n description: t('contact.message_sent_desc'),\n status: 'success',\n duration: 5000,\n isClosable: true,\n });\n },\n onError: (error: any) => {\n // Heuristics for Axios errors\n const code = error?.code || '';\n const msgFromServer = error?.response?.data?.error || error?.response?.data?.message;\n const isTimeout = code === 'ECONNABORTED' || /timeout/i.test(String(error?.message || ''));\n const isNetwork = !!error?.isAxiosError && !error?.response;\n\n const description = msgFromServer\n || (isTimeout ? t('contact.timeout_error')\n : isNetwork ? t('contact.network_error')\n : t('contact.general_error'));\n\n // Track failed contact form submission\n trackContactSubmit(false);\n trackFormSubmit('Contact Form', false);\n\n toast({\n title: t('contact.error_title'),\n description,\n status: 'error',\n duration: 6000,\n isClosable: true,\n });\n },\n });\n\n // Load public contacts once\n useEffect(() => {\n let mounted = true;\n (async () => {\n try {\n const data = await getPublicContacts();\n if (mounted) setContactsData(data);\n } catch (e) {\n console.error('Failed to load contacts', e);\n } finally {\n if (mounted) setContactsLoading(false);\n }\n })();\n return () => { mounted = false; };\n }, []);\n\n // Load club competitions + aliases (used to populate tabs when no contact categories are defined)\n useEffect(() => {\n (async () => {\n try {\n const clubId = (settings as any)?.club_id || '';\n const clubType = ((settings as any)?.club_type || 'football') as 'football' | 'futsal';\n let comps: Array<{ code?: string; name: string }> = [];\n if (clubId) {\n try {\n const club = await facrApi.getClub(String(clubId), clubType);\n const arr = Array.isArray((club as any)?.competitions) ? (club as any).competitions : [];\n arr.forEach((c: any) => comps.push({ code: c.code, name: c.name || c.code }));\n } catch {}\n }\n let amap: Record<string, string> = {};\n try {\n const list = await getCompetitionAliasesPublic();\n list.forEach((a) => { if (a.code && a.alias) amap[a.code] = a.alias; });\n } catch {}\n const withAliases = comps.map((c) => ({ code: c.code, name: (c.code && amap[c.code]) ? amap[c.code] : c.name }));\n setAliasesMap(amap);\n setCompetitions(withAliases);\n } catch {}\n })();\n }, [settings]);\n\n const onSubmit = (data: ContactFormData) => {\n mutate(data);\n };\n\n return (\n <MainLayout>\n <Container maxW=\"container.xl\">\n <VStack align=\"stretch\" spacing={8}>\n {/* Top: Map + Contact categories (tabs) */}\n <Box>\n <Heading size=\"xl\" mb={4}>Kontakt</Heading>\n {/* contacts are loaded in useEffect */}\n\n {(() => {\n const lat = (settings as any)?.location_latitude;\n const lng = (settings as any)?.location_longitude;\n const hasLocation = !!lat && !!lng;\n const categories = Object.entries(contactsData?.categories || {});\n const uncategorized = contactsData?.uncategorized || [];\n const hasContacts = categories.length > 0 || uncategorized.length > 0;\n\n const hasContactInfo = !!(\n (settings as any)?.contact_address ||\n (settings as any)?.contact_phone ||\n (settings as any)?.contact_email\n );\n\n if (!hasLocation && !hasContacts && !hasContactInfo) return null;\n\n return (\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={8} alignItems=\"start\">\n {/* Map on the left */}\n {hasLocation && (\n <Box borderRadius=\"lg\" overflow=\"hidden\" boxShadow=\"md\" alignSelf=\"start\">\n <ContactMap\n latitude={lat}\n longitude={lng}\n zoom={(settings as any)?.map_zoom_level || 15}\n address={(settings as any)?.contact_address}\n clubName={(settings as any)?.club_name || (settings as any)?.site_title}\n mapStyle={(settings as any)?.map_style || 'default'}\n clubPrimaryColor={(settings as any)?.primary_color}\n clubSecondaryColor={(settings as any)?.accent_color}\n />\n </Box>\n )}\n\n {/* Right column: contact info card (if any) + contacts tabs */}\n {(hasContactInfo || hasContacts) && (\n <VStack align=\"stretch\" spacing={4}>\n {hasContactInfo && (\n <Box bg={bgColor} p={4} borderRadius=\"lg\" borderWidth=\"1px\" borderColor={borderColor} boxShadow=\"sm\">\n <Heading size=\"md\" mb={3}>{t('contact.contact_info')}</Heading>\n <VStack align=\"stretch\" spacing={3}>\n {(settings as any)?.contact_address && (\n <HStack align=\"start\">\n <Icon as={FiMapPin} boxSize={5} color=\"blue.500\" mt={1} />\n <VStack align=\"start\" spacing={0}>\n <Text fontWeight=\"bold\">{t('contact.address')}</Text>\n <Text>{(settings as any)?.contact_address}</Text>\n {(settings as any)?.contact_city && (\n <Text>\n {(settings as any)?.contact_zip && `${(settings as any)?.contact_zip} `}\n {(settings as any)?.contact_city}\n </Text>\n )}\n {(settings as any)?.contact_country && <Text>{(settings as any)?.contact_country}</Text>}\n </VStack>\n </HStack>\n )}\n\n {(settings as any)?.contact_phone && (\n <HStack align=\"start\">\n <Icon as={FiPhone} boxSize={5} color=\"blue.500\" mt={1} />\n <VStack align=\"start\" spacing={0}>\n <Text fontWeight=\"bold\">{t('contact.phone')}</Text>\n <Link href={`tel:${(settings as any)?.contact_phone}`} color=\"blue.500\">\n {(settings as any)?.contact_phone}\n </Link>\n </VStack>\n </HStack>\n )}\n\n {(settings as any)?.contact_email && (\n <HStack align=\"start\">\n <Icon as={FiMail} boxSize={5} color=\"blue.500\" mt={1} />\n <VStack align=\"start\" spacing={0}>\n <Text fontWeight=\"bold\">{t('contact.email')}</Text>\n <Link href={`mailto:${(settings as any)?.contact_email}`} color=\"blue.500\">\n {(settings as any)?.contact_email}\n </Link>\n </VStack>\n </HStack>\n )}\n </VStack>\n </Box>\n )}\n\n {hasContacts && (\n <Box bg={bgColor} p={4} borderRadius=\"lg\" borderWidth=\"1px\" borderColor={borderColor} boxShadow=\"sm\">\n <Heading size=\"md\" mb={3}>{t('contact.contact_persons')}</Heading>\n <Tabs colorScheme=\"blue\" isFitted isLazy>\n {(() => {\n const categoryEntries = Object.entries(contactsData?.categories || {});\n const compNames = competitions.map((c) => (c.code && aliasesMap[c.code]) ? aliasesMap[c.code] : c.name).filter(Boolean);\n const useCategories = categoryEntries.length > 0;\n const tabs = useCategories ? categoryEntries.map(([n]) => n) : compNames;\n const hasOthers = uncategorized.length > 0;\n return (\n <>\n <TabList>\n {tabs.map((n) => (\n <Tab key={n}>{n}</Tab>\n ))}\n {hasOthers && <Tab>{t('contact.others')}</Tab>}\n </TabList>\n <TabPanels>\n {useCategories\n ? categoryEntries.map(([name, persons]) => (\n <TabPanel key={name} pt={4}>\n <SimpleGrid columns={{ base: 1, sm: 2 }} spacing={4}>\n {persons.map((contact) => (\n <Box key={contact.id} bg={bgColor} p={4} borderRadius=\"md\" borderWidth=\"1px\" borderColor={borderColor}>\n <VStack align=\"start\" spacing={3}>\n {contact.image_url && (\n <Avatar src={getImageUrl(contact.image_url)} name={contact.name} size=\"lg\" />\n )}\n <Box>\n <Heading size=\"sm\">{contact.name}</Heading>\n {contact.position && (\n <Badge colorScheme=\"blue\" mt={1}>{contact.position}</Badge>\n )}\n </Box>\n {contact.description && (\n <Text fontSize=\"sm\" color=\"gray.600\">{contact.description}</Text>\n )}\n <VStack align=\"start\" spacing={1}>\n {contact.email && (\n <HStack spacing={2}>\n <Icon as={FiMail} color=\"blue.500\" />\n <Link href={`mailto:${contact.email}`} color=\"blue.500\" fontSize=\"sm\">{contact.email}</Link>\n </HStack>\n )}\n {contact.phone && (\n <HStack spacing={2}>\n <Icon as={FiPhone} color=\"blue.500\" />\n <Link href={`tel:${contact.phone}`} color=\"blue.500\" fontSize=\"sm\">{contact.phone}</Link>\n </HStack>\n )}\n </VStack>\n </VStack>\n </Box>\n ))}\n </SimpleGrid>\n </TabPanel>\n ))\n : tabs.map((name) => {\n const persons = (contactsData?.categories || {})[name] || [];\n return (\n <TabPanel key={name} pt={4}>\n {persons.length > 0 ? (\n <SimpleGrid columns={{ base: 1, sm: 2 }} spacing={4}>\n {persons.map((contact) => (\n <Box key={contact.id} bg={bgColor} p={4} borderRadius=\"md\" borderWidth=\"1px\" borderColor={borderColor}>\n <VStack align=\"start\" spacing={3}>\n {contact.image_url && (\n <Avatar src={getImageUrl(contact.image_url)} name={contact.name} size=\"lg\" />\n )}\n <Box>\n <Heading size=\"sm\">{contact.name}</Heading>\n {contact.position && (\n <Badge colorScheme=\"blue\" mt={1}>{contact.position}</Badge>\n )}\n </Box>\n {contact.description && (\n <Text fontSize=\"sm\" color=\"gray.600\">{contact.description}</Text>\n )}\n <VStack align=\"start\" spacing={1}>\n {contact.email && (\n <HStack spacing={2}>\n <Icon as={FiMail} color=\"blue.500\" />\n <Link href={`mailto:${contact.email}`} color=\"blue.500\" fontSize=\"sm\">{contact.email}</Link>\n </HStack>\n )}\n {contact.phone && (\n <HStack spacing={2}>\n <Icon as={FiPhone} color=\"blue.500\" />\n <Link href={`tel:${contact.phone}`} color=\"blue.500\" fontSize=\"sm\">{contact.phone}</Link>\n </HStack>\n )}\n </VStack>\n </VStack>\n </Box>\n ))}\n </SimpleGrid>\n ) : (\n <Text color=\"gray.500\">{t('contact.no_contacts')}</Text>\n )}\n </TabPanel>\n );\n })}\n {hasOthers && (\n <TabPanel pt={4}>\n <SimpleGrid columns={{ base: 1, sm: 2 }} spacing={4}>\n {uncategorized.map((contact) => (\n <Box key={contact.id} bg={bgColor} p={4} borderRadius=\"md\" borderWidth=\"1px\" borderColor={borderColor}>\n <VStack align=\"start\" spacing={3}>\n {contact.image_url && (\n <Avatar src={getImageUrl(contact.image_url)} name={contact.name} size=\"lg\" />\n )}\n <Box>\n <Heading size=\"sm\">{contact.name}</Heading>\n {contact.position && (\n <Badge colorScheme=\"blue\" mt={1}>{contact.position}</Badge>\n )}\n </Box>\n {contact.description && (\n <Text fontSize=\"sm\" color=\"gray.600\">{contact.description}</Text>\n )}\n <VStack align=\"start\" spacing={1}>\n {contact.email && (\n <HStack spacing={2}>\n <Icon as={FiMail} color=\"blue.500\" />\n <Link href={`mailto:${contact.email}`} color=\"blue.500\" fontSize=\"sm\">{contact.email}</Link>\n </HStack>\n )}\n {contact.phone && (\n <HStack spacing={2}>\n <Icon as={FiPhone} color=\"blue.500\" />\n <Link href={`tel:${contact.phone}`} color=\"blue.500\" fontSize=\"sm\">{contact.phone}</Link>\n </HStack>\n )}\n </VStack>\n </VStack>\n </Box>\n ))}\n </SimpleGrid>\n </TabPanel>\n )}\n </TabPanels>\n </>\n );\n })()}\n </Tabs>\n </Box>\n )}\n </VStack>\n )}\n </SimpleGrid>\n );\n })()}\n </Box>\n\n <Divider />\n\n {/* Contact form at the end */}\n <Box>\n <Heading size=\"lg\" mb={2} color={settings?.primaryColor || 'brand.500'}>\n {t('contact.contact_us')}\n </Heading>\n <Text color=\"gray.500\">\n {t('contact.contact_description')}\n </Text>\n </Box>\n\n <Box\n bg={cardBg}\n borderRadius=\"lg\"\n borderWidth=\"1px\"\n borderColor={cardBorder}\n boxShadow=\"sm\"\n p={6}\n >\n <form onSubmit={handleSubmit(onSubmit)}>\n <VStack spacing={4}>\n <FormControl isInvalid={!!errors.name}>\n <FormLabel htmlFor=\"name\">{t('contact.name_label')}</FormLabel>\n <Input\n id=\"name\"\n placeholder={t('contact.name_placeholder')}\n {...register('name', {\n required: t('contact.name_required'),\n minLength: { value: 2, message: t('contact.name_min_length') },\n })}\n />\n <FormErrorMessage>\n {errors.name && errors.name.message}\n </FormErrorMessage>\n </FormControl>\n\n <FormControl isInvalid={!!errors.email}>\n <FormLabel htmlFor=\"email\">{t('contact.email_label')}</FormLabel>\n <Input\n id=\"email\"\n type=\"email\"\n placeholder={t('contact.email_placeholder')}\n {...register('email', {\n required: t('contact.email_required'),\n pattern: {\n value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i,\n message: t('contact.email_invalid'),\n },\n })}\n />\n <FormErrorMessage>\n {errors.email && errors.email.message}\n </FormErrorMessage>\n </FormControl>\n\n <FormControl isInvalid={!!errors.subject}>\n <FormLabel htmlFor=\"subject\">{t('contact.subject_label')}</FormLabel>\n <Input\n id=\"subject\"\n placeholder={t('contact.subject_placeholder')}\n {...register('subject', {\n required: t('contact.subject_required'),\n maxLength: { value: 100, message: t('contact.subject_max_length') },\n })}\n />\n <FormErrorMessage>\n {errors.subject && errors.subject.message}\n </FormErrorMessage>\n </FormControl>\n\n <FormControl isInvalid={!!errors.message}>\n <FormLabel htmlFor=\"message\">{t('contact.message_label')}</FormLabel>\n <Textarea\n id=\"message\"\n rows={6}\n placeholder={t('contact.message_placeholder')}\n {...register('message', {\n required: t('contact.message_required'),\n minLength: { value: 10, message: t('contact.message_min_length') },\n maxLength: { value: 2000, message: t('contact.message_max_length') },\n })}\n />\n <FormErrorMessage>\n {errors.message && errors.message.message}\n </FormErrorMessage>\n </FormControl>\n\n <Button\n type=\"submit\"\n colorScheme={settings?.primaryColor || 'brand'}\n size=\"lg\"\n width=\"full\"\n mt={4}\n isLoading={isLoading}\n loadingText={t('contact.sending')}\n data-umami-event=\"Contact Form Submit\"\n >\n {t('contact.send_message')}\n </Button>\n </VStack>\n </form>\n </Box>\n </VStack>\n </Container>\n </MainLayout>\n );\n};\n\nexport default ContactPage;\n","// Translate country codes and names to Czech nationality names\nexport function translateNationality(code?: string): string {\n const val = String(code ?? '');\n if (!val) return '';\n \n // Country code translations (2-letter codes)\n const codeTranslations: Record<string, string> = {\n 'CZ': 'Česká republika',\n 'SK': 'Slovensko',\n 'PL': 'Polsko',\n 'DE': 'Německo',\n 'AT': 'Rakousko',\n 'UA': 'Ukrajina',\n 'FR': 'Francie',\n 'ES': 'Španělsko',\n 'IT': 'Itálie',\n 'GB': 'Anglie',\n 'UK': 'Velká Británie',\n 'US': 'USA',\n 'BR': 'Brazílie',\n 'AR': 'Argentina',\n 'PT': 'Portugalsko',\n 'NL': 'Nizozemsko',\n 'BE': 'Belgie',\n 'CH': 'Švýcarsko',\n 'SE': 'Švédsko',\n 'NO': 'Norsko',\n 'DK': 'Dánsko',\n 'FI': 'Finsko',\n 'RU': 'Rusko',\n 'HR': 'Chorvatsko',\n 'RS': 'Srbsko',\n 'SI': 'Slovinsko',\n 'HU': 'Maďarsko',\n 'RO': 'Rumunsko',\n 'BG': 'Bulharsko',\n 'GR': 'Řecko',\n 'TR': 'Turecko',\n 'JP': 'Japonsko',\n 'CN': 'Čína',\n 'KR': 'Jižní Korea',\n 'AU': 'Austrálie',\n 'NZ': 'Nový Zéland',\n 'CA': 'Kanada',\n 'MX': 'Mexiko',\n 'IE': 'Irsko',\n 'IS': 'Island',\n };\n\n // Full country name translations (from REST Countries API)\n const nameTranslations: Record<string, string> = {\n 'Czechia': 'Česká republika',\n 'Czech Republic': 'Česká republika',\n 'Slovakia': 'Slovensko',\n 'Poland': 'Polsko',\n 'Germany': 'Německo',\n 'Austria': 'Rakousko',\n 'Ukraine': 'Ukrajina',\n 'France': 'Francie',\n 'Spain': 'Španělsko',\n 'Italy': 'Itálie',\n 'England': 'Anglie',\n 'United Kingdom': 'Velká Británie',\n 'United States': 'USA',\n 'Brazil': 'Brazílie',\n 'Argentina': 'Argentina',\n 'Portugal': 'Portugalsko',\n 'Netherlands': 'Nizozemsko',\n 'Belgium': 'Belgie',\n 'Switzerland': 'Švýcarsko',\n 'Sweden': 'Švédsko',\n 'Norway': 'Norsko',\n 'Denmark': 'Dánsko',\n 'Finland': 'Finsko',\n 'Russia': 'Rusko',\n 'Croatia': 'Chorvatsko',\n 'Serbia': 'Srbsko',\n 'Slovenia': 'Slovinsko',\n 'Hungary': 'Maďarsko',\n 'Romania': 'Rumunsko',\n 'Bulgaria': 'Bulharsko',\n 'Greece': 'Řecko',\n 'Turkey': 'Turecko',\n 'Japan': 'Japonsko',\n 'China': 'Čína',\n 'South Korea': 'Jižní Korea',\n 'Australia': 'Austrálie',\n 'New Zealand': 'Nový Zéland',\n 'Canada': 'Kanada',\n 'Mexico': 'Mexiko',\n 'Ireland': 'Irsko',\n 'Iceland': 'Island',\n 'Bosnia and Herzegovina': 'Bosna a Hercegovina',\n 'Montenegro': 'Černá Hora',\n 'North Macedonia': 'Severní Makedonie',\n 'Albania': 'Albánie',\n 'Luxembourg': 'Lucembursko',\n 'Moldova': 'Moldavsko',\n 'Lithuania': 'Litva',\n 'Latvia': 'Lotyšsko',\n 'Estonia': 'Estonsko',\n 'Belarus': 'Bělorusko',\n };\n\n // Try code translation first (for 2-letter codes)\n const upperCode = val.toUpperCase();\n if (codeTranslations[upperCode]) {\n return codeTranslations[upperCode];\n }\n\n // Try full name translation (case-insensitive)\n const lowerName = val.toLowerCase();\n for (const [englishName, czechName] of Object.entries(nameTranslations)) {\n if (englishName.toLowerCase() === lowerName) {\n return czechName;\n }\n }\n\n // Return original if no translation found\n return val;\n}\n\n// Convert a 2-letter ISO country code to a flag emoji\nexport function countryCodeToEmoji(cc?: string): string {\n if (!cc) return '';\n const v = String(cc).trim().toUpperCase();\n if (!/^[A-Z]{2}$/.test(v)) return '';\n return v.replace(/./g, (ch) => String.fromCodePoint(127397 + ch.charCodeAt(0)));\n}\n\n// Get an emoji flag for a given nationality string (code like \"CZ\" or English name like \"Czechia\")\nexport function getCountryFlag(nationality?: string): string {\n if (!nationality) return '';\n const n = String(nationality).trim();\n if (!n) return '';\n // If already a 2-letter code\n if (/^[A-Za-z]{2}$/.test(n)) {\n // Normalize UK to GB for emoji\n const code = n.toUpperCase() === 'UK' ? 'GB' : n.toUpperCase();\n return countryCodeToEmoji(code);\n }\n // Map of English and Czech names to ISO alpha-2 codes (subset covering our translations)\n const nameToCode: Record<string, string> = {\n 'Czechia': 'CZ',\n 'Czech Republic': 'CZ',\n 'Česká republika': 'CZ',\n 'Slovakia': 'SK',\n 'Slovensko': 'SK',\n 'Poland': 'PL',\n 'Polsko': 'PL',\n 'Germany': 'DE',\n 'Německo': 'DE',\n 'Austria': 'AT',\n 'Rakousko': 'AT',\n 'Ukraine': 'UA',\n 'Ukrajina': 'UA',\n 'France': 'FR',\n 'Francie': 'FR',\n 'Spain': 'ES',\n 'Španělsko': 'ES',\n 'Italy': 'IT',\n 'Itálie': 'IT',\n 'England': 'GB',\n 'United Kingdom': 'GB',\n 'Velká Británie': 'GB',\n 'United States': 'US',\n 'USA': 'US',\n 'Brazil': 'BR',\n 'Argentina': 'AR',\n 'Portugal': 'PT',\n 'Netherlands': 'NL',\n 'Nizozemsko': 'NL',\n 'Belgium': 'BE',\n 'Belgie': 'BE',\n 'Switzerland': 'CH',\n 'Švýcarsko': 'CH',\n 'Sweden': 'SE',\n 'Švédsko': 'SE',\n 'Norway': 'NO',\n 'Norsko': 'NO',\n 'Denmark': 'DK',\n 'Dánsko': 'DK',\n 'Finland': 'FI',\n 'Finsko': 'FI',\n 'Russia': 'RU',\n 'Rusko': 'RU',\n 'Croatia': 'HR',\n 'Chorvatsko': 'HR',\n 'Serbia': 'RS',\n 'Srbsko': 'RS',\n 'Slovenia': 'SI',\n 'Slovinsko': 'SI',\n 'Hungary': 'HU',\n 'Maďarsko': 'HU',\n 'Romania': 'RO',\n 'Rumunsko': 'RO',\n 'Bulgaria': 'BG',\n 'Bulharsko': 'BG',\n 'Greece': 'GR',\n 'Řecko': 'GR',\n 'Turkey': 'TR',\n 'Turecko': 'TR',\n 'Japan': 'JP',\n 'Japonsko': 'JP',\n 'China': 'CN',\n 'Čína': 'CN',\n 'South Korea': 'KR',\n 'Jižní Korea': 'KR',\n 'Australia': 'AU',\n 'Austrálie': 'AU',\n 'New Zealand': 'NZ',\n 'Nový Zéland': 'NZ',\n 'Canada': 'CA',\n 'Kanada': 'CA',\n 'Mexico': 'MX',\n 'Mexiko': 'MX',\n 'Ireland': 'IE',\n 'Irsko': 'IE',\n 'Iceland': 'IS',\n 'Island': 'IS',\n 'Bosnia and Herzegovina': 'BA',\n 'Bosna a Hercegovina': 'BA',\n 'Montenegro': 'ME',\n 'Černá Hora': 'ME',\n 'North Macedonia': 'MK',\n 'Severní Makedonie': 'MK',\n 'Albania': 'AL',\n 'Albánie': 'AL',\n 'Luxembourg': 'LU',\n 'Lucembursko': 'LU',\n 'Moldova': 'MD',\n 'Moldavsko': 'MD',\n 'Lithuania': 'LT',\n 'Litva': 'LT',\n 'Latvia': 'LV',\n 'Lotyšsko': 'LV',\n 'Estonia': 'EE',\n 'Estonsko': 'EE',\n 'Belarus': 'BY',\n 'Bělorusko': 'BY',\n };\n const code = nameToCode[n] || nameToCode[n.replace(/\\s+/g, ' ').trim()] || nameToCode[n.toLowerCase().replace(/\\b\\w/g, (l) => l.toUpperCase())];\n if (code) return countryCodeToEmoji(code);\n return '';\n}\n","import React, { useMemo, useState } from 'react';\nimport {\n Box,\n Container,\n Heading,\n Text,\n VStack,\n HStack,\n Switch,\n FormControl,\n FormLabel,\n Input,\n Button,\n useToast,\n Alert,\n AlertIcon,\n Card,\n CardBody,\n SimpleGrid,\n Badge,\n Divider,\n Spinner,\n Spacer,\n} from '@chakra-ui/react';\nimport { useSearchParams, useNavigate } from 'react-router-dom';\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { getPreferences, savePreferences, unsubscribeToken, SubscriberPreferences } from '../services/public/newsletter';\nimport { usePublicSettings } from '../hooks/usePublicSettings';\nimport { facrApi } from '../services/facr/facrApi';\nimport { trackEvent } from '../utils/umami';\n\nconst NewsletterPreferencesPage: React.FC = () => {\n const [params] = useSearchParams();\n const token = params.get('token') || '';\n const toast = useToast();\n const navigate = useNavigate();\n const qc = useQueryClient();\n\n const { data, isLoading, isError } = useQuery({\n queryKey: ['newsletter', 'prefs', token],\n queryFn: () => getPreferences(token),\n enabled: !!token,\n });\n\n // Load club competitions for nicer multi-select\n const { data: settings } = usePublicSettings();\n const clubId = settings?.club_id;\n const clubType = (settings?.club_type as 'football'|'futsal') || 'football';\n const { data: competitions } = useQuery({\n queryKey: ['facr', 'competitions', clubId, clubType],\n queryFn: async () => {\n if (!clubId) return [] as Array<{ code?: string; name?: string }>;\n const comps = await facrApi.getClubCompetitions(clubId, clubType);\n return comps || [];\n },\n enabled: !!clubId,\n });\n\n const initialPrefs: SubscriberPreferences = useMemo(() => ({\n blogs: true,\n matches: true,\n events: true,\n scores: true,\n weekly: true,\n ...(data?.preferences || ({} as SubscriberPreferences)),\n }), [data]);\n\n const [prefs, setPrefs] = useState<SubscriberPreferences>(initialPrefs);\n React.useEffect(() => { setPrefs(initialPrefs); }, [initialPrefs]);\n\n // If competitions list is available and user has no selection, default to ALL selected\n React.useEffect(() => {\n if (Array.isArray(competitions) && competitions.length > 0) {\n const raw = String(prefs.competitions || '').trim();\n if (!raw) {\n const codes = competitions.map((c: any, idx: number) => String(c?.code || c?.id || c?.name || `comp-${idx}`)).filter(Boolean);\n if (codes.length > 0) {\n setPrefs((prev) => ({ ...prev, competitions: codes.join(', ') }));\n }\n }\n }\n }, [competitions]);\n\n const saveMut = useMutation({\n mutationFn: () => savePreferences(token, prefs),\n onSuccess: () => {\n toast({ title: 'Preference uloženy', status: 'success' });\n qc.invalidateQueries({ queryKey: ['newsletter', 'prefs', token] });\n \n // Track preference save\n trackEvent('Newsletter Preferences Saved', {\n blogs: prefs.blogs,\n matches: prefs.matches,\n events: prefs.events,\n scores: prefs.scores,\n });\n },\n onError: (err: any) => toast({ title: 'Chyba při ukládání', description: String(err?.response?.data?.error || err?.message || err), status: 'error' }),\n });\n\n const unsubMut = useMutation({\n mutationFn: () => unsubscribeToken(token),\n onSuccess: () => {\n toast({ title: 'Odběr byl zrušen', status: 'success' });\n qc.invalidateQueries({ queryKey: ['newsletter', 'prefs', token] });\n \n // Track unsubscribe via preferences page\n trackEvent('Newsletter Unsubscribe', {\n success: true,\n source: 'preferences_page'\n });\n \n // Optionally redirect to home after a short delay\n setTimeout(() => navigate('/'), 1500);\n },\n onError: (err: any) => toast({ title: 'Chyba při odhlášení', description: String(err?.response?.data?.error || err?.message || err), status: 'error' }),\n });\n\n // helpers to handle competitions selection as comma-separated codes\n const selectedCodes = useMemo(() => {\n const raw = (prefs.competitions as string) || '';\n return new Set(raw.split(',').map((s) => s.trim()).filter(Boolean));\n }, [prefs.competitions]);\n const toggleCode = (code: string, on: boolean) => {\n const next = new Set(selectedCodes);\n if (on) next.add(code); else next.delete(code);\n const value = Array.from(next).join(', ');\n setPrefs({ ...prefs, competitions: value });\n };\n\n if (!token) {\n return (\n <Box maxW=\"640px\" mx=\"auto\" p={6}>\n <Alert status=\"error\" borderRadius=\"md\"><AlertIcon />Chybí parametr token v adrese.</Alert>\n </Box>\n );\n }\n\n if (isLoading) {\n return (\n <Container maxW=\"container.md\" py={8}>\n <HStack>\n <Spinner />\n <Text>Načítání…</Text>\n </HStack>\n </Container>\n );\n }\n\n if (isError || !data) {\n return (\n <Box maxW=\"640px\" mx=\"auto\" p={6}>\n <Alert status=\"error\" borderRadius=\"md\"><AlertIcon />Neplatný nebo expirovaný token.</Alert>\n </Box>\n );\n }\n\n\n // helpers to toggle all main content types on/off\n const setAll = (on: boolean) => setPrefs({\n ...prefs,\n blogs: on,\n matches: on,\n events: on,\n scores: on,\n weekly: on,\n });\n\n return (\n <Container maxW=\"container.md\" py={8}>\n <HStack mb={2} align=\"center\">\n <Heading size=\"lg\">Nastavení newsletteru</Heading>\n <Spacer />\n <Button size=\"sm\" variant=\"outline\" onClick={() => setAll(true)}>Zapnout vše</Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setAll(false)}>Vypnout vše</Button>\n </HStack>\n <HStack mb={6} color=\"gray.600\">\n <Text>Spravujte, jaké e-maily chcete dostávat na adresu</Text>\n <Badge colorScheme={data.is_active ? 'green' : 'red'}>{data.email}</Badge>\n </HStack>\n\n <Card mb={6}>\n <CardBody>\n <VStack spacing={6} align=\"stretch\">\n <SimpleGrid columns={{ base: 1, md: 2 }} spacing={4}>\n <FormControl display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n <FormLabel m={0}>Články (blog)</FormLabel>\n <Switch isChecked={!!prefs.blogs} onChange={(e) => setPrefs({ ...prefs, blogs: e.target.checked })} />\n </FormControl>\n <FormControl display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n <FormLabel m={0}>Nadcházející zápasy</FormLabel>\n <Switch isChecked={!!prefs.matches} onChange={(e) => setPrefs({ ...prefs, matches: e.target.checked })} />\n </FormControl>\n <FormControl display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n <FormLabel m={0}>Události</FormLabel>\n <Switch isChecked={!!prefs.events} onChange={(e) => setPrefs({ ...prefs, events: e.target.checked })} />\n </FormControl>\n <FormControl display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n <FormLabel m={0}>Výsledky (souhrn týdne)</FormLabel>\n <Switch isChecked={!!prefs.scores} onChange={(e) => setPrefs({ ...prefs, scores: e.target.checked })} />\n </FormControl>\n <FormControl display=\"flex\" alignItems=\"center\" justifyContent=\"space-between\">\n <FormLabel m={0}>Týdenní souhrn (digest)</FormLabel>\n <Switch isChecked={!!(prefs as any).weekly} onChange={(e) => setPrefs({ ...prefs, weekly: e.target.checked })} />\n </FormControl>\n </SimpleGrid>\n\n <Divider />\n\n <FormControl>\n <FormLabel>Preferované soutěže</FormLabel>\n {Array.isArray(competitions) && competitions.length > 0 ? (\n <VStack align=\"stretch\" spacing={1} maxH=\"220px\" overflowY=\"auto\" borderWidth=\"1px\" borderRadius=\"md\" p={3}>\n <HStack mb={1}>\n <Button size=\"xs\" variant=\"outline\" onClick={()=>{\n const all = competitions.map((c: any, idx: number) => String(c?.code || c?.id || c?.name || `comp-${idx}`)).filter(Boolean);\n setPrefs({ ...prefs, competitions: all.join(', ') });\n }}>Zapnout vše</Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={()=> setPrefs({ ...prefs, competitions: '' })}>Vypnout vše</Button>\n </HStack>\n {competitions.map((c: any, idx: number) => {\n const code = (c?.code || c?.id || c?.name || `comp-${idx}`) as string;\n const name = (c?.name || c?.code || code) as string;\n const checked = selectedCodes.has(String(code));\n return (\n <HStack key={code} justify=\"space-between\">\n <Text>{name}</Text>\n <Switch isChecked={checked} onChange={(e) => toggleCode(String(code), e.target.checked)} />\n </HStack>\n );\n })}\n </VStack>\n ) : (\n <Input placeholder=\"např. 5LM, POH\" value={(prefs.competitions as string) || ''} onChange={(e) => setPrefs({ ...prefs, competitions: e.target.value })} />\n )}\n <Text mt={2} fontSize=\"sm\" color=\"gray.500\">Pokud není seznam k dispozici, můžete zadat kódy soutěží ručně, oddělené čárkou.</Text>\n </FormControl>\n </VStack>\n </CardBody>\n </Card>\n\n <HStack spacing={3} pt={2} borderTopWidth=\"1px\">\n <Button\n colorScheme=\"blue\"\n onClick={() => saveMut.mutate()}\n isLoading={saveMut.isLoading}\n data-umami-event=\"Save Preferences\"\n >\n Uložit\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => qc.invalidateQueries({ queryKey: ['newsletter', 'prefs', token] })}\n data-umami-event=\"Refresh Preferences\"\n >\n Obnovit\n </Button>\n <Spacer />\n <Button\n colorScheme=\"red\"\n variant=\"outline\"\n onClick={() => unsubMut.mutate()}\n isLoading={unsubMut.isLoading}\n data-umami-event=\"Unsubscribe\"\n data-umami-event-source=\"preferences\"\n >\n Zrušit odběr\n </Button>\n </HStack>\n </Container>\n );\n};\n\nexport default NewsletterPreferencesPage;\n","import React from 'react';\nimport {\n Button,\n HStack,\n Icon,\n Text,\n VStack,\n useColorModeValue,\n} from '@chakra-ui/react';\nimport { \n FiDownload,\n FiFile, \n FiFileText, \n FiImage,\n FiVideo,\n FiMusic,\n} from 'react-icons/fi';\nimport { assetUrl } from '../../utils/url';\n\nexport interface FilePreviewProps {\n url: string;\n name?: string;\n mimeType?: string;\n size?: number;\n showInline?: boolean;\n buttonOnly?: boolean;\n}\n\nconst FilePreview: React.FC<FilePreviewProps> = ({\n url,\n name,\n mimeType = '',\n size,\n buttonOnly = false,\n}) => {\n \n const fullUrl = assetUrl(url) || url;\n const fileName = name || url.split('/').pop() || 'file';\n const shortenName = (n: string, max = 34) => {\n const base = String(n || '').trim();\n if (base.length <= max) return base;\n const dot = base.lastIndexOf('.');\n const ext = dot > 0 ? base.slice(dot) : '';\n const keep = Math.max(10, max - (ext.length + 3));\n return `${base.slice(0, keep)}…${ext}`;\n };\n const displayName = shortenName(fileName);\n const mime = mimeType.toLowerCase();\n \n const borderColor = useColorModeValue('gray.200', 'gray.700');\n const cardBg = useColorModeValue('white', 'gray.800');\n const mutedText = useColorModeValue('gray.600', 'gray.300');\n\n // Determine file type and icon\n const getFileInfo = () => {\n if (mime.startsWith('image/')) {\n return { type: 'image', icon: FiImage, color: 'purple.500', canPreview: true };\n }\n if (mime === 'application/pdf') {\n return { type: 'pdf', icon: FiFileText, color: 'red.500', canPreview: true };\n }\n if (mime.startsWith('video/')) {\n return { type: 'video', icon: FiVideo, color: 'pink.500', canPreview: true };\n }\n if (mime.startsWith('audio/')) {\n return { type: 'audio', icon: FiMusic, color: 'green.500', canPreview: true };\n }\n if (mime.includes('word') || mime.includes('document')) {\n return { type: 'document', icon: FiFileText, color: 'blue.500', canPreview: false };\n }\n if (mime.includes('sheet') || mime.includes('excel')) {\n return { type: 'spreadsheet', icon: FiFile, color: 'green.600', canPreview: false };\n }\n if (mime.includes('presentation') || mime.includes('powerpoint')) {\n return { type: 'presentation', icon: FiFile, color: 'orange.500', canPreview: false };\n }\n return { type: 'other', icon: FiFile, color: 'gray.500', canPreview: false };\n };\n\n const fileInfo = getFileInfo();\n const sizeKB = typeof size === 'number' ? Math.round(size / 1024) : undefined;\n const sizeMB = sizeKB && sizeKB > 1024 ? (sizeKB / 1024).toFixed(1) : undefined;\n const sizeStr = sizeMB ? `${sizeMB} MB` : sizeKB ? `${sizeKB} kB` : '';\n\n // Action button handler\n const handleDownload = async () => {\n const fallback = () => {\n try {\n const a = document.createElement('a');\n a.href = fullUrl;\n a.setAttribute('download', fileName);\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n } catch {}\n };\n try {\n const res = await fetch(fullUrl);\n if (!res.ok) return fallback();\n const blob = await res.blob();\n const urlObj = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = urlObj;\n a.setAttribute('download', fileName);\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(() => URL.revokeObjectURL(urlObj), 2000);\n } catch {\n fallback();\n }\n };\n\n // Button-only compact variant (for tight sidebars like Přílohy)\n if (buttonOnly) {\n return (\n <Button\n size=\"xs\"\n leftIcon={<FiDownload />}\n colorScheme=\"blue\"\n variant=\"outline\"\n onClick={handleDownload}\n >\n Stáhnout\n </Button>\n );\n }\n\n // Default: row with icon, truncated name and action\n return (\n <HStack\n justify=\"space-between\"\n p={3}\n borderWidth=\"1px\"\n borderColor={borderColor}\n borderRadius=\"md\"\n bg={cardBg}\n flexWrap=\"wrap\"\n w=\"100%\"\n >\n <HStack flex={1} minW={0}>\n <Icon as={fileInfo.icon} color={fileInfo.color} flexShrink={0} />\n <VStack align=\"start\" spacing={0} flex={1} minW={0}>\n <Text fontWeight=\"medium\" isTruncated maxW=\"100%\">\n {displayName}\n </Text>\n {sizeStr && <Text fontSize=\"xs\" color={mutedText}>{sizeStr}</Text>}\n </VStack>\n </HStack>\n <HStack spacing={2} flexShrink={0}>\n <Button size=\"sm\" leftIcon={<FiDownload />} colorScheme=\"blue\" onClick={handleDownload}>\n Stáhnout\n </Button>\n </HStack>\n </HStack>\n );\n};\n\nexport default FilePreview;\n","import React from 'react';\nimport MainLayout from '../components/layout/MainLayout';\nimport { Box, Container, Heading, Text, Stack, Image, SimpleGrid, Divider } from '@chakra-ui/react';\nimport { usePublicSettings } from '../hooks/usePublicSettings';\nimport { useTranslation } from 'react-i18next';\nimport { assetUrl } from '../utils/url';\nimport NewsletterCTA from '../components/common/NewsletterCTA';\n\nconst ClubPage: React.FC = () => {\n const { data: settings } = usePublicSettings();\n const { t } = useTranslation();\n\n return (\n <MainLayout>\n <Container maxW=\"7xl\" py={{ base: 6, md: 10 }}>\n <Stack spacing={8}>\n <Stack direction={{ base: 'column', md: 'row' }} align={{ base: 'flex-start', md: 'center' }} spacing={6}>\n {settings?.club_logo_url && (\n <Image src={assetUrl(settings.club_logo_url)} alt={settings?.club_name || 'Logo'} boxSize={{ base: '64px', md: '80px' }} objectFit=\"contain\" />\n )}\n <Box>\n <Heading as=\"h1\" size=\"xl\">{settings?.club_name || t('nav.club')}</Heading>\n <Text color=\"gray.600\">{t('about.club_info')}</Text>\n </Box>\n </Stack>\n\n {settings?.about_html ? (\n <Box>\n <Box className=\"prose\" color=\"gray.800\" dangerouslySetInnerHTML={{ __html: settings.about_html as any }} />\n </Box>\n ) : (\n <Box>\n <Heading as=\"h2\" size=\"md\" mb={3}>Značka a identita</Heading>\n <Text color=\"gray.700\">\n Zde může být popis historie, vize a hodnot klubu. Doplníme dle potřeby v další iteraci.\n </Text>\n </Box>\n )}\n\n <Divider />\n\n <Box>\n <Heading as=\"h2\" size=\"md\" mb={3}>Stadion</Heading>\n <Text color=\"gray.700\">Informace o stadionu, adresa, kapacita a fotografie (volitelné).</Text>\n </Box>\n </Stack>\n </Container>\n \n {/* Newsletter CTA */}\n <NewsletterCTA />\n \n </MainLayout>\n );\n};\n\nexport default ClubPage;\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Box,\n Button,\n Container,\n FormControl,\n FormLabel,\n Input,\n Tab,\n TabList,\n TabPanel,\n TabPanels,\n Tabs,\n Heading,\n Text,\n useToast,\n VStack,\n HStack,\n Link as ChakraLink,\n Select,\n Avatar,\n Badge,\n Progress,\n useColorModeValue,\n SimpleGrid,\n Image,\n IconButton,\n} from '@chakra-ui/react';\nimport { useAuth } from '../contexts/AuthContext';\nimport api from '../services/api';\nimport { getLeaderboard, LeaderboardItem, getProfile, EngagementProfile, getRewards, RewardItem, redeemReward, patchAvatar, patchProfile, getMyTransactions, PointsTx, getAchievements } from '../services/engagement';\nimport { getMyWinnings } from '../services/sweepstakes';\nimport { Upload, RefreshCw, Pencil, Gift } from 'lucide-react';\nimport UploadPanel, { UploadPanelFile } from '../components/common/UploadPanel';\n\nconst SemiAdminPage: React.FC = () => {\n const { user, updateUser } = useAuth();\n const splitName = (full?: string) => {\n const v = String(full || '').trim();\n if (!v) return { fn: '', ln: '' };\n const parts = v.split(/\\s+/);\n if (parts.length === 1) return { fn: parts[0], ln: '' };\n return { fn: parts[0], ln: parts.slice(1).join(' ') };\n };\n const init = splitName(user?.name);\n const [firstName, setFirstName] = useState(init.fn);\n const [lastName, setLastName] = useState(init.ln);\n const [isSaving, setIsSaving] = useState(false);\n const [prefsToken, setPrefsToken] = useState<string>('');\n const toast = useToast();\n\n useEffect(() => {\n const s = splitName(user?.name);\n setFirstName(s.fn);\n setLastName(s.ln);\n }, [user?.name]);\n\n useEffect(() => {\n (async () => {\n try {\n const res = await api.get('/newsletter/token/me');\n setPrefsToken(res.data?.token || '');\n } catch {}\n })();\n }, []);\n\n const loadProfile = async () => {\n setLoadingProf(true);\n try {\n const p = await getProfile();\n setProf(p);\n setUsernameEdit(p.username || '');\n } finally {\n setLoadingProf(false);\n }\n };\n\n const loadRewards = async () => {\n setLoadingRewards(true);\n try { setRewards(await getRewards()); } finally { setLoadingRewards(false); }\n };\n\n useEffect(() => { loadProfile(); loadRewards(); }, []);\n useEffect(() => {\n (async () => {\n setTxLoading(true);\n try { const items = await getMyTransactions({ limit: 100 }); setTxItems(items); } finally { setTxLoading(false); }\n })();\n (async () => {\n setAchLoading(true);\n try { const res = await getAchievements(); setAchItems(res.achievements || []); } finally { setAchLoading(false); }\n })();\n }, []);\n\n useEffect(() => {\n const onRefresh = () => { loadProfile().catch(()=>{}); };\n window.addEventListener('engagement:refresh', onRefresh as any);\n return () => window.removeEventListener('engagement:refresh', onRefresh as any);\n }, []);\n\n const handleSave = async (e: React.FormEvent) => {\n e.preventDefault();\n setIsSaving(true);\n try {\n const res = await api.put('/me', { first_name: firstName, last_name: lastName });\n const updated = res.data?.user;\n if (updated) {\n const n = `${updated.first_name || firstName} ${updated.last_name || lastName}`.trim();\n updateUser({ name: n });\n }\n toast({ title: 'Uloženo', description: 'Osobní údaje byly aktualizovány.', status: 'success', duration: 3000 });\n } catch (err: any) {\n toast({ title: 'Chyba', description: err?.response?.data?.error || 'Nelze uložit změny', status: 'error' });\n } finally {\n setIsSaving(false);\n }\n };\n\n const prefsUrl = prefsToken ? `/newsletter/preferences?token=${encodeURIComponent(prefsToken)}` : '';\n const [metric, setMetric] = useState<'points'|'level'|'xp'>('points');\n const [leaders, setLeaders] = useState<LeaderboardItem[]>([]);\n const [loadingLb, setLoadingLb] = useState<boolean>(false);\n const [txLoading, setTxLoading] = useState<boolean>(false);\n const [txItems, setTxItems] = useState<PointsTx[]>([]);\n const [achLoading, setAchLoading] = useState<boolean>(false);\n const [achItems, setAchItems] = useState<any[]>([]);\n const [winsLoading, setWinsLoading] = useState<boolean>(false);\n const [wins, setWins] = useState<Array<{ id:number; prize_name?: string; claim_status: string; created_at?: string }>>([]);\n\n useEffect(() => {\n (async () => {\n try {\n setWinsLoading(true);\n const res = await getMyWinnings();\n setWins((res.items || []).map((w:any) => ({ id: w.id, prize_name: w.prize_name, claim_status: w.claim_status, created_at: w.created_at })));\n } catch {\n setWins([]);\n } finally {\n setWinsLoading(false);\n }\n })();\n }, []);\n\n // Engagement profile\n const [prof, setProf] = useState<EngagementProfile | null>(null);\n const [loadingProf, setLoadingProf] = useState<boolean>(true);\n const [rewards, setRewards] = useState<RewardItem[]>([]);\n const [loadingRewards, setLoadingRewards] = useState<boolean>(false);\n const [usernameEdit, setUsernameEdit] = useState<string>('');\n const [usernameEditing, setUsernameEditing] = useState<boolean>(false);\n const cardBg = useColorModeValue('white', 'gray.800');\n const border = useColorModeValue('gray.200', 'gray.700');\n\n useEffect(() => {\n let mounted = true;\n (async () => {\n try {\n setLoadingLb(true);\n const res = await getLeaderboard(metric, 20);\n if (mounted) setLeaders(res.items || []);\n } catch {\n if (mounted) setLeaders([]);\n } finally {\n if (mounted) setLoadingLb(false);\n }\n })();\n return () => { mounted = false; };\n }, [metric]);\n\n // XP thresholds helpers\n const levelInfo = useMemo(() => {\n if (!prof) return { level: 1, xp: 0, currentBase: 0, nextBase: 100, pct: 0 };\n const L = Math.max(1, Number(prof.level || 1));\n const xp = Number(prof.xp || 0);\n // total needed to reach level L: 100 + 200 + ... + 100*(L-1) = 50*(L-1)*L\n const totalToL = 50 * (L - 1) * L;\n const nextInc = 100 * L;\n const totalToNext = totalToL + nextInc;\n const inLevel = Math.max(0, xp - totalToL);\n const pct = Math.max(0, Math.min(100, Math.floor((inLevel / Math.max(1, nextInc)) * 100)));\n return { level: L, xp, currentBase: totalToL, nextBase: totalToNext, pct, inLevel, nextInc };\n }, [prof]);\n\n const baseNameColor = useColorModeValue('gray.800', 'gray.100');\n const nameColor = useMemo(() => {\n const L = levelInfo.level;\n if (L >= 20) return 'yellow.400'; // gold\n if (L >= 15) return 'purple.400'; // epic\n if (L >= 10) return 'blue.400'; // rare\n if (L >= 5) return 'teal.400'; // uncommon\n return baseNameColor;\n }, [levelInfo.level, baseNameColor]);\n\n const triggerUpload = () => {\n if (!prof?.avatar_upload_unlocked) {\n toast({ status: 'info', title: 'Odemkněte nahrání avataru', description: 'V obchodě níže můžete odemknout možnost nahrát vlastní profilový obrázek.', duration: 3500 });\n const el = document.getElementById('rewards-store'); if (el) el.scrollIntoView({ behavior: 'smooth' });\n return;\n }\n const panel = document.getElementById('avatar-upload-panel');\n if (panel) panel.scrollIntoView({ behavior: 'smooth', block: 'center' });\n };\n\n const uploadAvatarFile = async (file: File): Promise<UploadPanelFile> => {\n if (!prof?.avatar_upload_unlocked) {\n throw new Error('Nahrání avataru není odemčeno.');\n }\n const fd = new FormData();\n fd.append('file', file);\n const res = await api.post('/upload', fd, { headers: { 'Content-Type': 'multipart/form-data' } });\n const url = res.data?.url || res.data?.absolute_url;\n if (!url) {\n throw new Error('Upload selhal');\n }\n await patchAvatar({ avatar_url: url });\n await loadProfile();\n return {\n url,\n name: file.name,\n type: file.type || 'image/*',\n size: file.size || 0,\n };\n };\n\n const randomizeAvatar = async () => {\n const seed = Math.random().toString(36).slice(2, 10);\n const url = `https://api.dicebear.com/7.x/pixel-art/svg?radius=50&seed=${encodeURIComponent(seed)}`;\n await patchAvatar({ avatar_url: url });\n await loadProfile();\n toast({ status: 'success', title: 'Náhodný avatar nastaven' });\n };\n\n const saveUsername = async () => {\n const v = usernameEdit.trim();\n if (!v) { toast({ status: 'warning', title: 'Uživatelské jméno je prázdné' }); return; }\n try {\n setUsernameEditing(true);\n await patchProfile({ username: v });\n toast({ status: 'success', title: 'Uživatelské jméno uloženo' });\n await loadProfile();\n } catch (e: any) {\n toast({ status: 'error', title: 'Chyba', description: e?.response?.data?.error || 'Nelze uložit' });\n } finally { setUsernameEditing(false); }\n };\n\n return (\n <Container maxW=\"5xl\" py={8}>\n <Heading size=\"lg\" mb={6}>Fan zóna</Heading>\n\n {/* Profile header */}\n <Box borderWidth=\"1px\" borderColor={border} bg={cardBg} borderRadius=\"lg\" p={5} mb={6} textAlign=\"center\">\n <VStack spacing={3} align=\"center\">\n <Box position=\"relative\" display=\"inline-block\">\n <Avatar size=\"2xl\" name={user?.name || prof?.username || 'Uživatel'} src={prof?.animated_avatar_url || prof?.avatar_url || undefined} />\n {/* Upload icon (left) */}\n <IconButton aria-label=\"Nahrát avatar\" icon={<Upload size={16} />} size=\"sm\" variant=\"solid\" colorScheme=\"blue\" position=\"absolute\" left=\"-10px\" top=\"50%\" transform=\"translateY(-50%)\" onClick={triggerUpload} />\n {/* Level badge (right) */}\n <Badge position=\"absolute\" right=\"-10px\" top=\"50%\" transform=\"translateY(-50%)\" colorScheme=\"yellow\" fontSize=\"0.8rem\" p={2} borderRadius=\"md\">Lv {levelInfo.level}</Badge>\n {/* Randomize (bottom) */}\n <IconButton aria-label=\"Náhodný avatar\" icon={<RefreshCw size={16} />} size=\"xs\" variant=\"ghost\" position=\"absolute\" bottom=\"-6px\" right=\"50%\" transform=\"translateX(50%)\" onClick={randomizeAvatar} />\n </Box>\n {prof?.avatar_upload_unlocked && (\n <Box id=\"avatar-upload-panel\" mt={4}>\n <UploadPanel\n label=\"Nahrát avatar\"\n description=\"Nahrajte vlastní profilový obrázek.\"\n accept=\"image/*,image/gif\"\n multiple={false}\n maxFiles={1}\n uploadFn={uploadAvatarFile}\n allowUrlImport={false}\n />\n </Box>\n )}\n {/* Username */}\n <HStack spacing={2}>\n {!usernameEditing && (\n <Text fontSize=\"xl\" fontWeight=\"700\" color={nameColor}>\n {(prof?.username || '').trim() || 'Nastavte uživatelské jméno'}\n </Text>\n )}\n <IconButton aria-label=\"Upravit\" size=\"xs\" variant=\"ghost\" icon={<Pencil size={16} />} onClick={() => setUsernameEditing((v)=>!v)} />\n </HStack>\n {usernameEditing && (\n <HStack spacing={2}>\n <Input value={usernameEdit} onChange={(e)=>setUsernameEdit(e.target.value)} placeholder=\"uživatelské-jméno\" maxW=\"260px\" />\n <Button colorScheme=\"blue\" size=\"sm\" isLoading={usernameEditing} onClick={saveUsername}>Uložit</Button>\n </HStack>\n )}\n {/* Full name */}\n <Text color={useColorModeValue('gray.600','gray.400')}>{`${firstName || ''} ${lastName || ''}`.trim() || '—'}</Text>\n {/* XP progress */}\n <HStack w=\"100%\" maxW=\"lg\" spacing={3} align=\"center\">\n <Box flex={1}>\n <Progress value={levelInfo.pct} size=\"md\" borderRadius=\"full\" colorScheme=\"blue\" />\n <Text fontSize=\"sm\" color={useColorModeValue('gray.600','gray.400')} mt={1}>{levelInfo.inLevel || 0} / {levelInfo.nextInc} XP do další úrovně</Text>\n </Box>\n <Badge colorScheme=\"yellow\">Lv {levelInfo.level}</Badge>\n </HStack>\n {/* Points */}\n <Text>Aktuální body: <Text as=\"span\" fontWeight=\"700\">{prof?.points ?? 0}</Text></Text>\n </VStack>\n </Box>\n\n {/* Store */}\n <Box id=\"rewards-store\" borderWidth=\"1px\" borderColor={border} bg={cardBg} borderRadius=\"lg\" p={5} mb={8}>\n <Heading size=\"md\" mb={3}>Obchod s odměnami</Heading>\n {loadingRewards ? (\n <Text>Načítám…</Text>\n ) : (\n <SimpleGrid minChildWidth=\"220px\" spacing={4}>\n {rewards.map((r) => (\n <Box key={r.id} borderWidth=\"1px\" borderColor={border} borderRadius=\"md\" p={3}>\n <VStack align=\"stretch\" spacing={2}>\n <Text fontWeight=\"700\">{r.name}</Text>\n {r.image_url && <Image src={r.image_url} alt={r.name} borderRadius=\"md\" />}\n <Text fontSize=\"sm\" color={useColorModeValue('gray.600','gray.400')}>Cena: {r.cost_points} bodů</Text>\n <Button size=\"sm\" colorScheme=\"blue\" onClick={async ()=>{\n try { const res = await redeemReward(r.id); toast({ status:'success', title: 'Odměna uplatněna', description: res.status }); await loadProfile(); }\n catch(e:any){ toast({ status:'error', title:'Chyba', description: e?.response?.data?.error || 'Nelze uplatnit odměnu' }); }\n }}>Uplatnit</Button>\n </VStack>\n </Box>\n ))}\n </SimpleGrid>\n )}\n <Box mt={4}>\n <Heading size=\"sm\" mb={2}>Jak získat body</Heading>\n <VStack align=\"start\" spacing={1} fontSize=\"sm\" color={useColorModeValue('gray.700','gray.300')}>\n <Text>• Napište smysluplný komentář (+5)</Text>\n <Text>• Hlasujte v anketě (+3, 1× denně)</Text>\n <Text>• Přihlaste se k newsletteru (+12)</Text>\n </VStack>\n </Box>\n </Box>\n <Tabs colorScheme=\"blue\" isFitted variant=\"enclosed\">\n <TabList>\n <Tab>Osobní údaje</Tab>\n <Tab>Newsletter</Tab>\n <Tab>Žebříčky</Tab>\n <Tab>Historie bodů</Tab>\n <Tab>Úspěchy</Tab>\n <Tab>Výhry</Tab>\n </TabList>\n <TabPanels>\n <TabPanel>\n <Box as=\"form\" onSubmit={handleSave} maxW=\"lg\">\n <VStack align=\"stretch\" spacing={4}>\n <FormControl>\n <FormLabel>Jméno</FormLabel>\n <Input value={firstName} onChange={(e) => setFirstName(e.target.value)} placeholder=\"Jméno\" />\n </FormControl>\n <FormControl>\n <FormLabel>Příjmení</FormLabel>\n <Input value={lastName} onChange={(e) => setLastName(e.target.value)} placeholder=\"Příjmení\" />\n </FormControl>\n <HStack>\n <Button type=\"submit\" colorScheme=\"blue\" isLoading={isSaving}>Uložit</Button>\n </HStack>\n </VStack>\n </Box>\n </TabPanel>\n <TabPanel>\n <VStack align=\"start\" spacing={4}>\n <Text>Spravujte předvolby newsletteru nebo se odhlaste.</Text>\n {prefsUrl ? (\n <Button as={ChakraLink} href={prefsUrl} colorScheme=\"blue\">Otevřít nastavení newsletteru</Button>\n ) : (\n <Text>Načítám odkaz na nastavení…</Text>\n )}\n </VStack>\n </TabPanel>\n <TabPanel>\n <VStack align=\"stretch\" spacing={4}>\n <HStack justify=\"space-between\">\n <Heading size=\"md\">Žebříčky</Heading>\n <HStack>\n <Select size=\"sm\" value={metric} onChange={(e)=>setMetric(e.target.value as any)} maxW=\"180px\">\n <option value=\"points\">Body</option>\n <option value=\"level\">Úroveň</option>\n <option value=\"xp\">XP</option>\n </Select>\n </HStack>\n </HStack>\n <Box borderWidth=\"1px\" borderColor={border} borderRadius=\"md\" bg={cardBg} p={3}>\n <VStack align=\"stretch\" spacing={2}>\n {loadingLb && <Text>Načítám…</Text>}\n {!loadingLb && leaders.length === 0 && (\n <Text>Žádná data k zobrazení.</Text>\n )}\n {!loadingLb && leaders.map((it) => {\n const value = metric === 'points' ? it.points : (metric === 'level' ? it.level : it.xp);\n const max = Math.max(...leaders.map(l => metric === 'points' ? l.points : (metric === 'level' ? l.level : l.xp)), 1);\n const pct = Math.max(2, Math.floor((Number(value) / Number(max)) * 100));\n const name = (it.username || '').trim() || `${it.first_name || ''} ${it.last_name || ''}`.trim() || `#${it.user_id}`;\n return (\n <HStack key={`${metric}-${it.user_id}`} spacing={3}>\n <Badge colorScheme=\"blue\">{it.rank}</Badge>\n <Avatar size=\"sm\" name={name} src={it.animated_avatar_url || it.avatar_url || undefined} />\n <Box flex={1}>\n <HStack justify=\"space-between\">\n <Text fontWeight=\"600\" noOfLines={1}>{name}</Text>\n <Text fontSize=\"sm\">{value}</Text>\n </HStack>\n <Progress value={pct} size=\"sm\" colorScheme=\"blue\" borderRadius=\"full\" mt={1} />\n </Box>\n </HStack>\n );\n })}\n </VStack>\n </Box>\n </VStack>\n </TabPanel>\n <TabPanel>\n <VStack align=\"stretch\" spacing={3}>\n {txLoading ? (\n <Text>Načítám…</Text>\n ) : (\n <Box borderWidth=\"1px\" borderColor={border} borderRadius=\"md\" overflowX=\"auto\">\n <Box as=\"table\" w=\"100%\" style={{ borderCollapse: 'collapse' }}>\n <Box as=\"thead\" bg={useColorModeValue('gray.50','gray.700')}>\n <Box as=\"tr\">\n <Box as=\"th\" p={2} textAlign=\"left\">Čas</Box>\n <Box as=\"th\" p={2} textAlign=\"left\">Delta</Box>\n <Box as=\"th\" p={2} textAlign=\"left\">Důvod</Box>\n <Box as=\"th\" p={2} textAlign=\"left\">Meta</Box>\n </Box>\n </Box>\n <Box as=\"tbody\">\n {txItems.map((t) => (\n <Box as=\"tr\" key={t.id} borderTopWidth=\"1px\" borderColor={border}>\n <Box as=\"td\" p={2}>{t.created_at ? new Date(t.created_at).toLocaleString() : '-'}</Box>\n <Box as=\"td\" p={2}><Badge colorScheme={t.delta >= 0 ? 'green' : 'red'}>{t.delta >= 0 ? `+${t.delta}` : t.delta}</Badge></Box>\n <Box as=\"td\" p={2}><Badge>{t.reason}</Badge></Box>\n <Box as=\"td\" p={2}><Text fontSize=\"xs\" noOfLines={1}>{t.meta ? JSON.stringify(t.meta) : '-'}</Text></Box>\n </Box>\n ))}\n {txItems.length === 0 && (\n <Box as=\"tr\"><Box as=\"td\" p={3} colSpan={4}><Text color={useColorModeValue('gray.600','gray.400')}>Žádné transakce.</Text></Box></Box>\n )}\n </Box>\n </Box>\n </Box>\n )}\n </VStack>\n </TabPanel>\n <TabPanel>\n <VStack align=\"stretch\" spacing={3}>\n {achLoading ? (\n <Text>Načítám…</Text>\n ) : (\n <SimpleGrid minChildWidth=\"220px\" spacing={4}>\n {achItems.map((a: any) => (\n <Box key={a.id} borderWidth=\"1px\" borderColor={border} borderRadius=\"md\" p={3} bg={cardBg}>\n <VStack align=\"stretch\" spacing={1}>\n <HStack justify=\"space-between\">\n <Text fontWeight=\"600\">{a.title}</Text>\n {a.achieved ? <Badge colorScheme=\"green\">Splněno</Badge> : <Badge colorScheme=\"gray\">Nesplněno</Badge>}\n </HStack>\n <Text fontSize=\"sm\" color={useColorModeValue('gray.600','gray.400')}>{a.description}</Text>\n <HStack>\n <Badge>{a.points} bodů</Badge>\n {a.achieved_at && <Text fontSize=\"xs\" color={useColorModeValue('gray.500','gray.400')}>{new Date(a.achieved_at).toLocaleString()}</Text>}\n </HStack>\n </VStack>\n </Box>\n ))}\n {achItems.length === 0 && (\n <Text color={useColorModeValue('gray.600','gray.400')}>Žádné úspěchy k zobrazení.</Text>\n )}\n </SimpleGrid>\n )}\n </VStack>\n </TabPanel>\n </TabPanels>\n </Tabs>\n </Container>\n );\n};\n\nexport default SemiAdminPage;\n","import api from './api';\n\n// Use shared API_URL which already resolves to '/api/v1' under current origin\n\nexport interface FileInfo {\n id: number;\n filename: string;\n file_path: string;\n file_url: string;\n url: string;\n file_size: number;\n size: number;\n mime_type: string;\n uploaded_by?: {\n id: number;\n email: string;\n first_name: string;\n last_name: string;\n };\n created_at: string;\n usages?: FileUsage[];\n usage_count: number;\n md5_hash?: string;\n}\n\nexport interface FileUsage {\n id: number;\n file_id: number;\n entity_type: string;\n entity_id: number;\n field_name: string;\n entity_info?: {\n type: string;\n id: number;\n title?: string;\n name?: string;\n slug?: string;\n url?: string;\n position?: string;\n };\n}\n\nexport interface DuplicateFiles {\n [hash: string]: FileInfo[];\n}\n\nexport interface StorageUsage {\n used_bytes: number;\n used_count: number;\n quota_mb: number;\n quota_bytes: number;\n percent: number;\n warn_percent: number;\n critical_percent: number;\n status: 'ok' | 'warn' | 'critical';\n}\n\nexport const getAllFiles = async (params?: {\n search?: string;\n mime_type?: string;\n sort_by?: string;\n sort_order?: string;\n}): Promise<FileInfo[]> => {\n const response = await api.get(`/admin/files`, { params });\n return response.data;\n};\n\nexport const getUnusedFiles = async (): Promise<FileInfo[]> => {\n const response = await api.get(`/admin/files/unused`);\n return response.data;\n};\n\nexport const getDuplicateFiles = async (): Promise<DuplicateFiles> => {\n const response = await api.get(`/admin/files/duplicates`);\n return response.data;\n};\n\nexport const getStorageUsage = async (): Promise<StorageUsage> => {\n const response = await api.get(`/admin/files/usage`);\n return response.data;\n};\n\nexport const getFileUsages = async (fileId: number): Promise<any[]> => {\n const response = await api.get(`/admin/files/${fileId}/usages`);\n return response.data;\n};\n\nexport const deleteFile = async (fileId: number, force: boolean = false): Promise<void> => {\n await api.delete(`/admin/files/${fileId}`, { params: { force } });\n};\n\nexport const scanAndSyncFiles = async (): Promise<{\n message: string;\n found_files: number;\n new_files: number;\n orphaned_files: number;\n skipped_files?: number;\n new_files_list?: string[];\n orphaned_list?: string[];\n}> => {\n const response = await api.post(`/admin/files/scan`, {});\n return response.data;\n};\n\nexport const refreshFileTracking = async (entityType?: string): Promise<{\n message: string;\n stats: {\n articles_scanned: number;\n events_scanned: number;\n players_scanned: number;\n sponsors_scanned: number;\n contacts_scanned: number;\n teams_scanned: number;\n settings_scanned: number;\n };\n}> => {\n const response = await api.post(`/admin/files/refresh-tracking`, {}, { params: entityType ? { entity_type: entityType } : {} });\n return response.data;\n};\n\nexport const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];\n};\n\nimport { IconType } from 'react-icons';\nimport { FiImage, FiFileText, FiVideo, FiFile } from 'react-icons/fi';\n\nexport const getFileIcon = (mimeType: string): IconType => {\n if (mimeType.startsWith('image/')) return FiImage;\n if (mimeType === 'application/pdf') return FiFileText;\n if (mimeType.startsWith('video/')) return FiVideo;\n return FiFile;\n};\n","import {\n Box,\n Button,\n Heading,\n HStack,\n IconButton,\n Image,\n Input,\n InputGroup,\n InputLeftElement,\n Modal,\n ModalBody,\n ModalCloseButton,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalOverlay,\n Table,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n useDisclosure,\n useToast,\n VStack,\n Text,\n Badge,\n Tabs,\n TabList,\n Tab,\n TabPanels,\n TabPanel,\n useColorModeValue,\n Tooltip,\n Select,\n Flex,\n Spacer,\n Alert,\n AlertIcon,\n AlertTitle,\n AlertDescription,\n Stack,\n Link as ChakraLink,\n Divider,\n Code,\n Icon,\n Progress,\n} from '@chakra-ui/react';\nimport { useState, useMemo, useEffect, useRef } from 'react';\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { FiTrash2, FiSearch, FiRefreshCw, FiCopy, FiAlertTriangle, FiExternalLink } from 'react-icons/fi';\nimport AdminLayout from '../../layouts/AdminLayout';\nimport { useConfirmDialog } from '../../contexts/ConfirmDialogContext';\nimport {\n FileInfo,\n FileUsage,\n DuplicateFiles,\n getAllFiles,\n getUnusedFiles,\n getDuplicateFiles,\n deleteFile,\n scanAndSyncFiles,\n refreshFileTracking,\n formatFileSize,\n getFileIcon,\n getStorageUsage,\n} from '../../services/files';\nimport { API_URL } from '../../services/api';\nimport { assetUrl } from '../../utils/url';\n\nconst FilesAdminPage: React.FC = () => {\n const toast = useToast();\n const qc = useQueryClient();\n const [search, setSearch] = useState('');\n const [mimeFilter, setMimeFilter] = useState('');\n const [selectedFile, setSelectedFile] = useState<FileInfo | null>(null);\n const [deleteTarget, setDeleteTarget] = useState<FileInfo | null>(null);\n const [forceDelete, setForceDelete] = useState(false);\n const [scanResult, setScanResult] = useState<any>(null);\n const [refreshResult, setRefreshResult] = useState<any>(null);\n const [isBulkDeletingUnused, setIsBulkDeletingUnused] = useState(false);\n const [isBulkDeletingDuplicates, setIsBulkDeletingDuplicates] = useState(false);\n const { confirm } = useConfirmDialog();\n \n const { isOpen: isUsagesOpen, onOpen: onUsagesOpen, onClose: onUsagesClose } = useDisclosure();\n const { isOpen: isDeleteOpen, onOpen: onDeleteOpen, onClose: onDeleteClose } = useDisclosure();\n const { isOpen: isScanResultOpen, onOpen: onScanResultOpen, onClose: onScanResultClose } = useDisclosure();\n const { isOpen: isRefreshResultOpen, onOpen: onRefreshResultOpen, onClose: onRefreshResultClose } = useDisclosure();\n\n const borderColor = useColorModeValue('gray.200', 'gray.600');\n const bgHover = useColorModeValue('gray.50', 'gray.700');\n\n const hasAutoSyncedRef = useRef(false);\n\n // Fetch all files\n const { data: allFiles = [], isLoading, refetch } = useQuery({\n queryKey: ['admin-files', search, mimeFilter],\n queryFn: () => getAllFiles({ search, mime_type: mimeFilter }),\n });\n\n // Fetch unused files\n const { data: unusedFiles = [] } = useQuery({\n queryKey: ['admin-files-unused'],\n queryFn: getUnusedFiles,\n });\n\n // Fetch duplicate files\n const { data: duplicateFiles = {} } = useQuery({\n queryKey: ['admin-files-duplicates'],\n queryFn: getDuplicateFiles,\n });\n\n // Storage usage\n const { data: storageUsage } = useQuery({\n queryKey: ['admin-files-usage'],\n queryFn: getStorageUsage,\n });\n\n // Delete mutation\n const deleteMutation = useMutation({\n mutationFn: ({ id, force }: { id: number; force: boolean }) => deleteFile(id, force),\n onSuccess: () => {\n toast({ title: 'Soubor smazán', status: 'success' });\n qc.invalidateQueries({ queryKey: ['admin-files'] });\n qc.invalidateQueries({ queryKey: ['admin-files-unused'] });\n qc.invalidateQueries({ queryKey: ['admin-files-duplicates'] });\n qc.invalidateQueries({ queryKey: ['admin-files-usage'] });\n onDeleteClose();\n setDeleteTarget(null);\n setForceDelete(false);\n },\n onError: (error: any) => {\n if (error.response?.status === 409) {\n // File is in use - show warning\n setForceDelete(false);\n toast({\n title: 'Soubor je používán',\n description: 'Soubor je používán. Zkontrolujte použití a potvrďte smazání.',\n status: 'warning',\n duration: 5000,\n });\n } else {\n toast({\n title: 'Chyba při mazání',\n description: error?.response?.data?.error || 'Nepodařilo se smazat soubor',\n status: 'error',\n });\n }\n },\n });\n\n // Scan mutation\n const scanMutation = useMutation({\n mutationFn: scanAndSyncFiles,\n onSuccess: (data) => {\n setScanResult(data);\n onScanResultOpen();\n qc.invalidateQueries({ queryKey: ['admin-files'] });\n qc.invalidateQueries({ queryKey: ['admin-files-unused'] });\n qc.invalidateQueries({ queryKey: ['admin-files-duplicates'] });\n qc.invalidateQueries({ queryKey: ['admin-files-usage'] });\n },\n onError: () => {\n toast({ title: 'Chyba při skenování', status: 'error' });\n },\n });\n\n // Refresh tracking mutation\n const refreshTrackingMutation = useMutation({\n mutationFn: refreshFileTracking,\n onSuccess: (data) => {\n setRefreshResult(data);\n onRefreshResultOpen();\n qc.invalidateQueries({ queryKey: ['admin-files'] });\n qc.invalidateQueries({ queryKey: ['admin-files-unused'] });\n qc.invalidateQueries({ queryKey: ['admin-files-duplicates'] });\n },\n onError: () => {\n toast({ title: 'Chyba při aktualizaci sledování', status: 'error' });\n },\n });\n\n useEffect(() => {\n if (hasAutoSyncedRef.current) return;\n hasAutoSyncedRef.current = true;\n (async () => {\n try {\n await scanAndSyncFiles();\n } catch (e) {\n toast({ title: 'Automatické skenování selhalo', status: 'error' });\n }\n try {\n await refreshFileTracking();\n } catch (e) {\n toast({ title: 'Automatická aktualizace sledování selhala', status: 'error' });\n }\n qc.invalidateQueries({ queryKey: ['admin-files'] });\n qc.invalidateQueries({ queryKey: ['admin-files-unused'] });\n qc.invalidateQueries({ queryKey: ['admin-files-duplicates'] });\n qc.invalidateQueries({ queryKey: ['admin-files-usage'] });\n })();\n }, [qc, toast]);\n\n const handleDelete = (file: FileInfo) => {\n setDeleteTarget(file);\n setForceDelete(false);\n onDeleteOpen();\n };\n\n const confirmDelete = () => {\n if (deleteTarget) {\n deleteMutation.mutate({ id: deleteTarget.id, force: forceDelete });\n }\n };\n\n const handleViewUsages = (file: FileInfo) => {\n setSelectedFile(file);\n onUsagesOpen();\n };\n\n const copyToClipboard = (text: string) => {\n navigator.clipboard.writeText(text);\n toast({ title: 'Zkopírováno', status: 'success', duration: 2000 });\n };\n\n const getImageUrl = (url: string) => {\n const full = assetUrl(url);\n return full || url;\n };\n\n const handleDeleteAllUnused = async () => {\n if (unusedFiles.length === 0) return;\n const ok = await confirm({\n title: 'Vymazat nepoužívané soubory',\n message: `Opravdu chcete smazat ${unusedFiles.length} nepoužívaných souborů? Tuto akci nelze vrátit.`,\n confirmText: 'Vymazat',\n cancelText: 'Zrušit',\n isDanger: true,\n });\n if (!ok) return;\n setIsBulkDeletingUnused(true);\n let deleted = 0;\n let failed = 0;\n for (const f of unusedFiles) {\n try {\n await deleteFile(f.id, false);\n deleted++;\n } catch (e) {\n failed++;\n }\n }\n setIsBulkDeletingUnused(false);\n qc.invalidateQueries({ queryKey: ['admin-files'] });\n qc.invalidateQueries({ queryKey: ['admin-files-unused'] });\n qc.invalidateQueries({ queryKey: ['admin-files-duplicates'] });\n qc.invalidateQueries({ queryKey: ['admin-files-usage'] });\n toast({ title: 'Hromadné mazání dokončeno', description: `Smazáno ${deleted} / ${unusedFiles.length}. Chyby: ${failed}.`, status: failed > 0 ? 'warning' : 'success' });\n };\n\n const handleDeleteAllDuplicates = async () => {\n if (duplicateGroups.length === 0) return;\n const ok = await confirm({\n title: 'Vymazat duplicitní soubory',\n message: 'Smazat všechny duplicitní soubory bez použití? V každé skupině bude ponechán 1 soubor. Používané soubory budou přeskočeny.',\n confirmText: 'Vymazat',\n cancelText: 'Zrušit',\n isDanger: true,\n });\n if (!ok) return;\n setIsBulkDeletingDuplicates(true);\n // Build list of files to delete: in each group keep one (oldest by created_at), delete the rest only if usage_count === 0\n type FI = typeof duplicateFiles extends Record<string, infer A> ? A extends Array<infer B> ? B : never : never;\n const toDelete: FI[] = [] as any;\n duplicateGroups.forEach(([, files]) => {\n if (files.length <= 1) return;\n const sorted = [...files].sort((a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime());\n const [, ...rest] = sorted;\n rest.forEach(f => {\n if ((f.usage_count ?? 0) === 0) toDelete.push(f as any);\n });\n });\n let deleted = 0;\n let skipped = 0;\n let failed = 0;\n for (const f of toDelete) {\n try {\n await deleteFile((f as any).id, false);\n deleted++;\n } catch (e) {\n failed++;\n }\n }\n // Count duplicates with usage to report as skipped\n duplicateGroups.forEach(([, files]) => {\n if (files.length <= 1) return;\n const sorted = [...files].sort((a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime());\n const [, ...rest] = sorted;\n rest.forEach(f => { if ((f.usage_count ?? 0) > 0) skipped++; });\n });\n setIsBulkDeletingDuplicates(false);\n qc.invalidateQueries({ queryKey: ['admin-files'] });\n qc.invalidateQueries({ queryKey: ['admin-files-unused'] });\n qc.invalidateQueries({ queryKey: ['admin-files-duplicates'] });\n qc.invalidateQueries({ queryKey: ['admin-files-usage'] });\n toast({ title: 'Mazání duplicit dokončeno', description: `Smazáno ${deleted}, přeskočeno (použité) ${skipped}, chyby ${failed}.`, status: failed > 0 ? 'warning' : 'success' });\n };\n\n // Mime type options\n const mimeTypes = useMemo(() => {\n const types = new Set<string>();\n allFiles.forEach(file => {\n if (file.mime_type) {\n const baseType = file.mime_type.split('/')[0];\n types.add(baseType);\n }\n });\n return Array.from(types);\n }, [allFiles]);\n\n const FileRow: React.FC<{ file: FileInfo; showUsageCount?: boolean }> = ({ file, showUsageCount = true }) => (\n <Tr _hover={{ bg: bgHover }}>\n <Td>\n <HStack>\n {file.mime_type?.startsWith('image/') ? (\n <Image\n src={getImageUrl(file.file_url)}\n alt={file.filename}\n boxSize=\"40px\"\n objectFit=\"cover\"\n borderRadius=\"md\"\n fallbackSrc=\"/article-placeholder.svg\"\n />\n ) : (\n <Icon as={getFileIcon(file.mime_type || '')} boxSize={6} color=\"blue.500\" />\n )}\n <VStack align=\"start\" spacing={0}>\n <Text fontWeight=\"medium\" fontSize=\"sm\">{file.filename}</Text>\n <Text fontSize=\"xs\" color=\"gray.500\">{file.file_path}</Text>\n </VStack>\n </HStack>\n </Td>\n <Td fontSize=\"sm\">{formatFileSize(file.file_size)}</Td>\n <Td fontSize=\"sm\">\n <Badge colorScheme={file.mime_type?.startsWith('image/') ? 'blue' : 'gray'}>\n {file.mime_type}\n </Badge>\n </Td>\n {showUsageCount && (\n <Td>\n <HStack>\n <Badge colorScheme={file.usage_count > 0 ? 'green' : 'red'}>\n {file.usage_count}\n </Badge>\n {file.usage_count > 0 && (\n <IconButton\n aria-label=\"Zobrazit použití\"\n icon={<FiExternalLink />}\n size=\"xs\"\n variant=\"ghost\"\n onClick={() => handleViewUsages(file)}\n />\n )}\n </HStack>\n </Td>\n )}\n <Td fontSize=\"sm\">{new Date(file.created_at).toLocaleDateString('cs-CZ')}</Td>\n <Td>\n <HStack spacing={1}>\n <Tooltip label=\"Kopírovat URL\">\n <IconButton\n aria-label=\"Kopírovat URL\"\n icon={<FiCopy />}\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => copyToClipboard(file.file_url)}\n />\n </Tooltip>\n <Tooltip label=\"Smazat\">\n <IconButton\n aria-label=\"Smazat\"\n icon={<FiTrash2 />}\n size=\"sm\"\n variant=\"ghost\"\n colorScheme=\"red\"\n onClick={() => handleDelete(file)}\n />\n </Tooltip>\n </HStack>\n </Td>\n </Tr>\n );\n\n const duplicateGroups = Object.entries(duplicateFiles);\n\n return (\n <AdminLayout requireAdmin={true}>\n <VStack align=\"stretch\" spacing={6}>\n <HStack justify=\"space-between\">\n <Heading size=\"lg\">Správa souborů</Heading>\n <HStack spacing={2}>\n <Button\n leftIcon={<FiRefreshCw />}\n onClick={() => refreshTrackingMutation.mutate(undefined)}\n isLoading={refreshTrackingMutation.isPending}\n colorScheme=\"green\"\n size=\"sm\"\n variant=\"outline\"\n >\n Aktualizovat sledování\n </Button>\n <Button\n leftIcon={<FiRefreshCw />}\n onClick={() => scanMutation.mutate()}\n isLoading={scanMutation.isPending}\n colorScheme=\"blue\"\n size=\"sm\"\n >\n Skenovat soubory\n </Button>\n </HStack>\n </HStack>\n\n {storageUsage && (\n <VStack align=\"stretch\" spacing={2}>\n {(storageUsage.status === 'warn' || storageUsage.status === 'critical') && (\n <Alert status={storageUsage.status === 'critical' ? 'error' : 'warning'} borderRadius=\"md\">\n <AlertIcon />\n <Box>\n <AlertTitle>\n {storageUsage.status === 'critical' ? 'Úložiště téměř plné' : 'Dochází místo v úložišti'}\n </AlertTitle>\n <AlertDescription>\n Využito {storageUsage.percent.toFixed(1)}% ({formatFileSize(storageUsage.used_bytes)} z {formatFileSize(storageUsage.quota_bytes)}).\n </AlertDescription>\n </Box>\n </Alert>\n )}\n <HStack>\n <Text fontWeight=\"medium\">Využití úložiště</Text>\n <Spacer />\n <Text fontSize=\"sm\" color=\"gray.500\">\n {formatFileSize(storageUsage.used_bytes)} / {formatFileSize(storageUsage.quota_bytes)} ({storageUsage.percent.toFixed(1)}%)\n </Text>\n </HStack>\n <Progress\n value={Math.min(100, storageUsage.percent)}\n colorScheme={storageUsage.status === 'critical' ? 'red' : storageUsage.status === 'warn' ? 'orange' : 'blue'}\n height=\"10px\"\n borderRadius=\"md\"\n />\n </VStack>\n )}\n\n <Tabs colorScheme=\"blue\" variant=\"enclosed\">\n <TabList>\n <Tab>Všechny soubory ({allFiles.length})</Tab>\n <Tab>Nepoužívané ({unusedFiles.length})</Tab>\n <Tab>Duplicity ({duplicateGroups.length})</Tab>\n </TabList>\n\n <TabPanels>\n {/* All Files Tab */}\n <TabPanel>\n <VStack align=\"stretch\" spacing={4}>\n {allFiles.length === 0 && !isLoading && (\n <Alert status=\"info\" borderRadius=\"md\">\n <AlertIcon />\n <Box flex=\"1\">\n <AlertTitle>Žádné soubory v databázi</AlertTitle>\n <AlertDescription>\n Klikněte na tlačítko \"Skenovat soubory\" pro načtení souborů z uploads složky do databáze.\n </AlertDescription>\n </Box>\n </Alert>\n )}\n <HStack spacing={4}>\n <InputGroup maxW=\"400px\">\n <InputLeftElement pointerEvents=\"none\">\n <FiSearch />\n </InputLeftElement>\n <Input\n placeholder=\"Hledat soubory...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </InputGroup>\n <Select\n placeholder=\"Všechny typy\"\n maxW=\"200px\"\n value={mimeFilter}\n onChange={(e) => setMimeFilter(e.target.value)}\n >\n {mimeTypes.map(type => (\n <option key={type} value={type}>{type}</option>\n ))}\n </Select>\n <Spacer />\n <Text fontSize=\"sm\" color=\"gray.500\">\n Celkem: {allFiles.length} souborů\n </Text>\n </HStack>\n\n <Box overflowX=\"auto\" borderWidth=\"1px\" borderRadius=\"md\" borderColor={borderColor}>\n <Table size=\"sm\">\n <Thead>\n <Tr>\n <Th>Soubor</Th>\n <Th>Velikost</Th>\n <Th>Typ</Th>\n <Th>Použití</Th>\n <Th>Vytvořeno</Th>\n <Th>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {isLoading ? (\n <Tr>\n <Td colSpan={6} textAlign=\"center\" py={8}>\n Načítání...\n </Td>\n </Tr>\n ) : allFiles.length === 0 ? (\n <Tr>\n <Td colSpan={6} textAlign=\"center\" py={8}>\n Žádné soubory nenalezeny\n </Td>\n </Tr>\n ) : (\n allFiles.map(file => <FileRow key={file.id} file={file} />)\n )}\n </Tbody>\n </Table>\n </Box>\n </VStack>\n </TabPanel>\n\n {/* Unused Files Tab */}\n <TabPanel>\n <VStack align=\"stretch\" spacing={4}>\n <Alert status=\"info\" borderRadius=\"md\">\n <AlertIcon />\n <Box>\n <AlertTitle>Nepoužívané soubory</AlertTitle>\n <AlertDescription>\n Tyto soubory nejsou použity v žádném článku, hráči, sponzorovi nebo jiné entitě.\n </AlertDescription>\n </Box>\n </Alert>\n <HStack>\n <Spacer />\n <Button\n leftIcon={<FiTrash2 />}\n colorScheme=\"red\"\n size=\"sm\"\n onClick={handleDeleteAllUnused}\n isLoading={isBulkDeletingUnused}\n isDisabled={unusedFiles.length === 0}\n >\n Vymazat vše\n </Button>\n </HStack>\n <Box overflowX=\"auto\" borderWidth=\"1px\" borderRadius=\"md\" borderColor={borderColor}>\n <Table size=\"sm\">\n <Thead>\n <Tr>\n <Th>Soubor</Th>\n <Th>Velikost</Th>\n <Th>Typ</Th>\n <Th>Vytvořeno</Th>\n <Th>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {unusedFiles.length === 0 ? (\n <Tr>\n <Td colSpan={5} textAlign=\"center\" py={8}>\n Všechny soubory jsou používány\n </Td>\n </Tr>\n ) : (\n unusedFiles.map(file => <FileRow key={file.id} file={file} showUsageCount={false} />)\n )}\n </Tbody>\n </Table>\n </Box>\n </VStack>\n </TabPanel>\n\n {/* Duplicates Tab */}\n <TabPanel>\n <VStack align=\"stretch\" spacing={4}>\n <Alert status=\"warning\" borderRadius=\"md\">\n <AlertIcon />\n <Box>\n <AlertTitle>Duplicitní soubory</AlertTitle>\n <AlertDescription>\n Tyto soubory mají identický obsah (MD5 hash). Můžete je smazat a aktualizovat odkazy.\n </AlertDescription>\n </Box>\n </Alert>\n <HStack>\n <Spacer />\n <Button\n leftIcon={<FiTrash2 />}\n colorScheme=\"red\"\n size=\"sm\"\n onClick={handleDeleteAllDuplicates}\n isLoading={isBulkDeletingDuplicates}\n isDisabled={duplicateGroups.length === 0}\n >\n Vymazat vše\n </Button>\n </HStack>\n {duplicateGroups.length === 0 ? (\n <Box textAlign=\"center\" py={8}>\n <Text color=\"gray.500\">Žádné duplicity nenalezeny</Text>\n </Box>\n ) : (\n duplicateGroups.map(([hash, files]) => (\n <Box key={hash} borderWidth=\"1px\" borderRadius=\"md\" p={4} borderColor={borderColor}>\n <VStack align=\"stretch\" spacing={2}>\n <HStack>\n <FiAlertTriangle color=\"orange\" />\n <Text fontWeight=\"bold\" fontSize=\"sm\">\n Duplicitní skupina ({files.length} souborů)\n </Text>\n <Code fontSize=\"xs\">{hash.substring(0, 12)}...</Code>\n </HStack>\n <Divider />\n <Table size=\"sm\" variant=\"simple\">\n <Thead>\n <Tr>\n <Th>Soubor</Th>\n <Th>Velikost</Th>\n <Th>Použití</Th>\n <Th>Vytvořeno</Th>\n <Th>Akce</Th>\n </Tr>\n </Thead>\n <Tbody>\n {files.map(file => (\n <FileRow key={file.id} file={file} />\n ))}\n </Tbody>\n </Table>\n </VStack>\n </Box>\n ))\n )}\n </VStack>\n </TabPanel>\n </TabPanels>\n </Tabs>\n </VStack>\n\n {/* File Usages Modal */}\n <Modal isOpen={isUsagesOpen} onClose={onUsagesClose} size=\"xl\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Použití souboru</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n {selectedFile && (\n <VStack align=\"stretch\" spacing={4}>\n <HStack>\n {selectedFile.mime_type?.startsWith('image/') && (\n <Image\n src={getImageUrl(selectedFile.file_url)}\n alt={selectedFile.filename}\n maxH=\"100px\"\n borderRadius=\"md\"\n />\n )}\n <VStack align=\"start\" flex={1}>\n <Text fontWeight=\"bold\">{selectedFile.filename}</Text>\n <Text fontSize=\"sm\" color=\"gray.500\">{selectedFile.file_path}</Text>\n </VStack>\n </HStack>\n\n <Divider />\n\n <VStack align=\"stretch\" spacing={2}>\n <Text fontWeight=\"bold\">Používáno v ({selectedFile.usage_count}):</Text>\n {selectedFile.usages && selectedFile.usages.length > 0 ? (\n selectedFile.usages.map((usage) => (\n <Box key={usage.id} p={3} borderWidth=\"1px\" borderRadius=\"md\">\n <HStack justify=\"space-between\">\n <VStack align=\"start\" spacing={0}>\n <Badge colorScheme=\"purple\">{usage.entity_type}</Badge>\n <Text fontSize=\"sm\" mt={1}>\n {usage.entity_info?.title || usage.entity_info?.name || `ID: ${usage.entity_id}`}\n </Text>\n {usage.field_name && (\n <Text fontSize=\"xs\" color=\"gray.500\">Pole: {usage.field_name}</Text>\n )}\n </VStack>\n {usage.entity_info?.url && (\n <ChakraLink href={usage.entity_info.url} isExternal>\n <IconButton\n aria-label=\"Otevřít\"\n icon={<FiExternalLink />}\n size=\"sm\"\n variant=\"ghost\"\n />\n </ChakraLink>\n )}\n </HStack>\n </Box>\n ))\n ) : (\n <Text color=\"gray.500\" fontSize=\"sm\">Soubor není nikde použit</Text>\n )}\n </VStack>\n </VStack>\n )}\n </ModalBody>\n <ModalFooter>\n <Button onClick={onUsagesClose}>Zavřít</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n {/* Delete Confirmation Modal */}\n <Modal isOpen={isDeleteOpen} onClose={onDeleteClose}>\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Smazat soubor</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n {deleteTarget && (\n <VStack align=\"stretch\" spacing={4}>\n <Text>\n Opravdu chcete smazat soubor <strong>{deleteTarget.filename}</strong>?\n </Text>\n \n {deleteTarget.usage_count > 0 && (\n <Alert status=\"warning\">\n <AlertIcon />\n <Box>\n <AlertTitle>Pozor!</AlertTitle>\n <AlertDescription>\n Tento soubor je použit na {deleteTarget.usage_count} místech.\n Smazáním může dojít k nefunkčnosti odkazů.\n </AlertDescription>\n </Box>\n </Alert>\n )}\n </VStack>\n )}\n </ModalBody>\n <ModalFooter>\n <HStack spacing={3}>\n <Button variant=\"ghost\" onClick={onDeleteClose}>\n Zrušit\n </Button>\n <Button\n colorScheme=\"red\"\n onClick={confirmDelete}\n isLoading={deleteMutation.isPending}\n >\n {(deleteTarget?.usage_count ?? 0) > 0 ? 'Přesto smazat' : 'Smazat'}\n </Button>\n </HStack>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n {/* Scan Results Modal */}\n <Modal isOpen={isScanResultOpen} onClose={onScanResultClose} size=\"lg\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Výsledky skenování souborů</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n {scanResult && (\n <VStack align=\"stretch\" spacing={4}>\n <Alert status=\"success\" borderRadius=\"md\">\n <AlertIcon />\n <Box flex=\"1\">\n <AlertTitle>Skenování dokončeno</AlertTitle>\n <AlertDescription>{scanResult.message}</AlertDescription>\n </Box>\n </Alert>\n\n <Stack spacing={3}>\n <HStack justify=\"space-between\" p={3} borderWidth=\"1px\" borderRadius=\"md\">\n <Text fontWeight=\"medium\">Nalezených souborů:</Text>\n <Badge colorScheme=\"blue\" fontSize=\"md\" px={3} py={1}>\n {scanResult.found_files}\n </Badge>\n </HStack>\n\n <HStack justify=\"space-between\" p={3} borderWidth=\"1px\" borderRadius=\"md\">\n <Text fontWeight=\"medium\">Nově přidaných:</Text>\n <Badge colorScheme=\"green\" fontSize=\"md\" px={3} py={1}>\n {scanResult.new_files}\n </Badge>\n </HStack>\n\n {scanResult.skipped_files !== undefined && scanResult.skipped_files > 0 && (\n <HStack justify=\"space-between\" p={3} borderWidth=\"1px\" borderRadius=\"md\">\n <Text fontWeight=\"medium\">Přeskočených (.gitkeep, atd.):</Text>\n <Badge colorScheme=\"gray\" fontSize=\"md\" px={3} py={1}>\n {scanResult.skipped_files}\n </Badge>\n </HStack>\n )}\n\n {scanResult.orphaned_files > 0 && (\n <HStack justify=\"space-between\" p={3} borderWidth=\"1px\" borderRadius=\"md\" borderColor=\"orange.300\">\n <Text fontWeight=\"medium\">Osiřelých záznamů:</Text>\n <Badge colorScheme=\"orange\" fontSize=\"md\" px={3} py={1}>\n {scanResult.orphaned_files}\n </Badge>\n </HStack>\n )}\n </Stack>\n\n {scanResult.new_files_list && scanResult.new_files_list.length > 0 && (\n <Box>\n <Text fontWeight=\"bold\" mb={2}>Nově přidané soubory:</Text>\n <Box maxH=\"200px\" overflowY=\"auto\" borderWidth=\"1px\" borderRadius=\"md\" p={3}>\n <VStack align=\"stretch\" spacing={1}>\n {scanResult.new_files_list.map((filename: string, idx: number) => (\n <Text key={idx} fontSize=\"sm\" fontFamily=\"monospace\">\n ✓ {filename}\n </Text>\n ))}\n </VStack>\n </Box>\n </Box>\n )}\n\n {scanResult.orphaned_list && scanResult.orphaned_list.length > 0 && (\n <Box>\n <Text fontWeight=\"bold\" mb={2} color=\"orange.500\">Osiřelé záznamy (soubory v DB, ale ne na disku):</Text>\n <Box maxH=\"200px\" overflowY=\"auto\" borderWidth=\"1px\" borderRadius=\"md\" p={3} borderColor=\"orange.300\">\n <VStack align=\"stretch\" spacing={1}>\n {scanResult.orphaned_list.map((filename: string, idx: number) => (\n <Text key={idx} fontSize=\"sm\" fontFamily=\"monospace\" color=\"orange.600\">\n ⚠ {filename}\n </Text>\n ))}\n </VStack>\n </Box>\n </Box>\n )}\n </VStack>\n )}\n </ModalBody>\n <ModalFooter>\n <Button colorScheme=\"blue\" onClick={onScanResultClose}>\n Zavřít\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n {/* Refresh Tracking Result Modal */}\n <Modal isOpen={isRefreshResultOpen} onClose={onRefreshResultClose} size=\"lg\">\n <ModalOverlay />\n <ModalContent>\n <ModalHeader>Výsledky aktualizace sledování</ModalHeader>\n <ModalCloseButton />\n <ModalBody>\n {refreshResult && (\n <VStack align=\"stretch\" spacing={4}>\n <Alert status=\"success\">\n <AlertIcon />\n <Box>\n <AlertTitle>Sledování aktualizováno!</AlertTitle>\n <AlertDescription>\n {refreshResult.message}\n </AlertDescription>\n </Box>\n </Alert>\n\n <Stack spacing={3}>\n <Text fontWeight=\"bold\" fontSize=\"lg\" mb={2}>Statistiky:</Text>\n \n <HStack justify=\"space-between\" p={3} borderWidth=\"1px\" borderRadius=\"md\">\n <Text fontWeight=\"medium\">Články:</Text>\n <Badge colorScheme=\"blue\" fontSize=\"md\" px={3} py={1}>\n {refreshResult.stats.articles_scanned}\n </Badge>\n </HStack>\n\n <HStack justify=\"space-between\" p={3} borderWidth=\"1px\" borderRadius=\"md\">\n <Text fontWeight=\"medium\">Aktivity:</Text>\n <Badge colorScheme=\"blue\" fontSize=\"md\" px={3} py={1}>\n {refreshResult.stats.events_scanned}\n </Badge>\n </HStack>\n\n <HStack justify=\"space-between\" p={3} borderWidth=\"1px\" borderRadius=\"md\">\n <Text fontWeight=\"medium\">Hráči:</Text>\n <Badge colorScheme=\"blue\" fontSize=\"md\" px={3} py={1}>\n {refreshResult.stats.players_scanned}\n </Badge>\n </HStack>\n\n <HStack justify=\"space-between\" p={3} borderWidth=\"1px\" borderRadius=\"md\">\n <Text fontWeight=\"medium\">Sponzoři:</Text>\n <Badge colorScheme=\"blue\" fontSize=\"md\" px={3} py={1}>\n {refreshResult.stats.sponsors_scanned}\n </Badge>\n </HStack>\n\n <HStack justify=\"space-between\" p={3} borderWidth=\"1px\" borderRadius=\"md\">\n <Text fontWeight=\"medium\">Kontakty:</Text>\n <Badge colorScheme=\"blue\" fontSize=\"md\" px={3} py={1}>\n {refreshResult.stats.contacts_scanned}\n </Badge>\n </HStack>\n\n <HStack justify=\"space-between\" p={3} borderWidth=\"1px\" borderRadius=\"md\">\n <Text fontWeight=\"medium\">Týmy:</Text>\n <Badge colorScheme=\"blue\" fontSize=\"md\" px={3} py={1}>\n {refreshResult.stats.teams_scanned}\n </Badge>\n </HStack>\n </Stack>\n </VStack>\n )}\n </ModalBody>\n <ModalFooter>\n <Button colorScheme=\"blue\" onClick={onRefreshResultClose}>\n Zavřít\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </AdminLayout>\n );\n};\n\nexport default FilesAdminPage;\n","import { Box, BoxProps, Heading, Icon, useColorModeValue } from '@chakra-ui/react';\nimport { ReactNode } from 'react';\n\ninterface WidgetProps extends BoxProps {\n title: string;\n icon?: any;\n children: ReactNode;\n}\n\nexport const Widget = ({ title, icon, children, ...rest }: WidgetProps) => {\n return (\n <Box\n bg={useColorModeValue('white', 'gray.800')}\n p={4}\n borderRadius=\"lg\"\n boxShadow=\"sm\"\n borderWidth=\"1px\"\n borderColor={useColorModeValue('gray.200', 'gray.700')}\n _hover={{ boxShadow: 'md' }}\n transition=\"all 0.2s\"\n {...rest}\n >\n <Heading size=\"md\" mb={4} display=\"flex\" alignItems=\"center\">\n {icon && <Icon as={icon} mr={2} />}\n {title}\n </Heading>\n {children}\n </Box>\n );\n};\n"],"names":["ClothingPage","items","setItems","useState","loading","setLoading","cardBg","useColorModeValue","borderColor","eshopUrl","process","useEffect","async","data","getClothing","e","console","error","fetchItems","_jsx","MainLayout","children","Container","maxW","py","Center","minH","Spinner","size","color","_jsxs","Helmet","name","content","VStack","spacing","align","Box","Heading","as","mb","Text","fontSize","mt","Button","ChakraLink","href","isExternal","colorScheme","rightIcon","FiExternalLink","length","SimpleGrid","columns","base","sm","md","lg","map","item","url","_hover","textDecoration","role","bg","borderWidth","borderRadius","overflow","transition","_groupHover","transform","boxShadow","position","paddingTop","Image","src","image_url","alt","title","top","left","width","height","objectFit","fallbackSrc","right","p","opacity","noOfLines","description","HStack","justify","price","Badge","px","currency","id","normalizeNavItem","raw","_raw$id","ID","Array","isArray","c","undefined","label","icon","type","page_type","page_id","visible","display_order","parent_id","target","css_class","requires_auth","requires_admin","allow_editor","normalizeSocialLink","_raw$id2","platform","getNavigationItems","response","api","get","it","getAllNavigationItems","createNavigationItem","post","updateNavigationItem","put","concat","deleteNavigationItem","delete","reorderNavigationItems","orders","getEditorAllowedAdminNav","getAllSocialLinks","createSocialLink","link","updateSocialLink","deleteSocialLink","reorderSocialLinks","seedDefaultNavigation","PlayersPage","t","useTranslation","isLoading","isError","useQuery","queryKey","queryFn","getPlayers","active","textSecondary","q","setQ","gender","setGender","setPosition","activeOnly","setActiveOnly","positions","useMemo","all","filter","Boolean","from","Set","filtered","list","slice","is_active","toLowerCase","trim","needle","first_name","last_name","pos","jersey","jersey_number","String","includes","InputGroup","InputLeftElement","pointerEvents","SearchIcon","Input","value","onChange","placeholder","Select","Checkbox","isChecked","checked","Stack","RouterLink","to","assetUrl","w","h","fontWeight","NewsletterCTA","ForgotPasswordPage","email","setEmail","code","setCode","newPassword","setNewPassword","confirmPassword","setConfirmPassword","setIsLoading","step","setStep","toast","useToast","handleInitiateReset","preventDefault","status","duration","isClosable","_error$response","_error$response$data","message","handleVerifyCode","_error$response2","_error$response2$data","handleCompleteReset","new_password","_error$response3","_error$response3$data","display","alignItems","justifyContent","renderStep","onSubmit","textAlign","FormControl","isRequired","FormLabel","loadingText","PinInput","isDisabled","autoFocus","otp","_","i","PinInputField","variant","onClick","PasswordHelpTooltip","PageHeader","_ref","badge","action","iconBg","iconColor","pb","borderBottomWidth","Flex","wrap","gap","flex","Icon","boxSize","bgGradient","bgClip","leftIcon","shadow","CompetitionAliasesAdminPage","editing","setEditing","draggedIndex","setDraggedIndex","reorderMode","setReorderMode","confirm","useConfirmDialog","load","getCompetitionAliasesAdmin","then","importFromFacrAuto","path","test","startsWith","origin","URL","API_URL","window","location","toString","_unused2","resolveBackendUrl","res","fetch","cache","ok","json","comps","competitions","latest","existing","newOnes","has","Promise","upsertCompetitionAlias","alias","original_name","_unused3","sorted","normalizeOrder","Number","MAX_SAFE_INTEGER","sort","a","b","orderA","orderB","localeCompare","onSaveAll","entries","Object","_data$alias2","Error","savedList","find","payload","prev","Map","s","set","values","hasChanges","keys","handleDragEnd","AdminLayout","requireAdmin","mx","_Fragment","FiSave","reordered","idx","reorderCompetitionAliases","cancelReorder","FiRefreshCcw","ml","FiMove","FiDownload","_unused","overflowX","Table","Thead","Tr","Th","textTransform","letterSpacing","isNumeric","Tbody","_editing$it$code","ed","isEdited","draggable","onDragStart","handleDragStart","index","dataTransfer","effectAllowed","onDragOver","handleDragOver","newItems","draggedItem","splice","onDragEnd","cursor","Td","fontFamily","FiEdit3","_objectSpread","_focus","IconButton","_data$alias","saved","n","onSave","FiTrash2","confirmText","cancelText","isDanger","deleteCompetitionAlias","onDelete","colSpan","NewsletterSubscribe","register","handleSubmit","reset","formState","errors","useForm","headingColor","textColor","disclaimerColor","subscribeToNewsletter","trackNewsletterSubscribe","pathname","trackFormSubmit","dispatchEvent","CustomEvent","errorMessage","isInvalid","autoComplete","required","pattern","disabled","FormErrorMessage","HelpTooltipCard","showStrengthBars","border","pillBg","pillBorder","Popover","trigger","openDelay","closeDelay","placement","PopoverTrigger","InfoOutlineIcon","Portal","PopoverContent","PopoverArrow","PopoverBody","pl","m","style","listStyle","CheckCircleIcon","_dark","_ref2","SponsorsAdminPage","_editing$display_orde2","normalizeImageUrl","qc","useQueryClient","getSponsors","isOpen","onOpen","onClose","useDisclosure","closeModal","createMut","useMutation","mutationFn","createSponsor","onSuccess","created","setQueryData","old","newList","invalidateQueries","onError","_e$response","_e$response$data","chyba","updateMut","updateSponsor","updated","_e$response2","_e$response2$data","deleteMut","deleteSponsor","_e$response3","_e$response3$data","FiPlus","openCreate","tier","_s$display_order","logo_url","website_url","Link","Switch","mutateAsync","err","toggleActive","FiEdit2","openEdit","Modal","ModalOverlay","ModalContent","ModalHeader","ModalCloseButton","ModalBody","UploadPanel","accept","multiple","maxFiles","allowUrlImport","urlPlaceholder","files","last","NumberInput","val","parseInt","min","NumberInputField","ModalFooter","mr","_editing$is_active","_editing$display_orde","getNewsletterSubscribers","sendNewsletter","subject","timeout","sendNewsletterTest","adminSendSmtpTest","sendNewsletterTestAdvanced","getNewsletterStatus","sendNewsletterDigest","setNewsletterAutomation","patch","enabled","previewNewsletter","getRecentEmailStats","_response$data","getEmailEventsForLog","_response$data2","deleteSubscriber","toggleSubscriberStatus","isActive","updateSubscriberPreferences","preferences","createNewsletterSubscriber","searchByICO","encodeURIComponent","ico","adminListBans","adminListUnbanRequests","CommentsAdminPage","_listQ$data","_listQ$data2","_listQ$data3","_unbanQ$data","_bansQ$data","setStatus","React","targetType","setTargetType","targetId","setTargetId","userId","setUserId","page","setPage","reportedOnly","setReportedOnly","targetOptions","setTargetOptions","targetLoading","setTargetLoading","userOptions","setUserOptions","userLoading","setUserLoading","listQ","params","adminListComments","target_type","target_id","user_id","page_size","keepPreviousData","unbanQ","bansQ","updateStatusMut","args","adminUpdateCommentStatus","deleteComment","banUserId","setBanUserId","banModal","banReason","setBanReason","banHours","setBanHours","banMut","reason","duration_hours","adminBanUser","resolveUnbanMut","adminResolveUnban","liftBanMut","adminLiftBan","getArticles","getEvents","_r$data","_r$data2","r","arr","albums","al","date","yt","getCachedYouTube","vids","videos","v","video_id","published_date","users","adminListUsers","u","loadUsers","itemsAll","reports","opt","_c$user","_c$user2","_c$user3","user","target_label","spam_score","toFixed","Tooltip","FiEye","FiEyeOff","mutate","_c$user4","total","Math","max","_r$user","_r$user2","_r$user3","_r$user4","_b$user","_b$user2","_b$user3","_b$user4","untilText","until","Date","toLocaleString","created_at","isCentered","isPending","PrivacyPolicyPage","boxBg","boxText","toLocaleDateString","Divider","List","styleType","ListItem","getBanners","body","_b$id","Id","iD","createBanner","updateBanner","deleteBanner","NavItem","useLocation","activeBg","activeColor","hoverBg","LinkComponent","linkProps","isDefaultPrevented","_before","getIconForPageType","pageType","dashboard","FaTachometerAlt","analytics","FaChartBar","teams","FaUsers","matches","FaCalendarAlt","activities","players","FaFutbol","articles","FaNewspaper","categories","FaFileAlt","about","FaBook","FaVideo","gallery","FaImage","scoreboard","scoreboard_remote","FaMobileAlt","clothing","FaTshirt","sponsors","FaHandshake","banners","FaBullhorn","messages","FaEnvelope","contacts","FaAddressBook","newsletter","FaPaperPlane","polls","FaPoll","navigation","FaBars","competition_aliases","FaAward","prefetch","FaRocket","FaUserShield","settings","FaPalette","FaFolder","media","docs","shortlinks","FaLink","comments","FaComments","engagement","sweepstakes","FaGift","FaTools","FaMoneyBillWave","FaQrcode","FaFileInvoiceDollar","FaUserFriends","bgProp","borderRight","borderColorProp","logout","useAuth","publicSettings","usePublicSettings","isAdmin","defaultBg","defaultBorderColor","isEshopEnabled","eshop_enabled","isManualClubDataMode","club_data_mode","dividerColor","categoryTextColor","categoryIconColor","headerMutedColor","scrollThumb","scrollThumbHover","badgeBgGreen","badgeColorGreen","badgeBorderGreen","badgeBgGray","badgeColorGray","badgeBorderGray","upcomingEvents","getUpcomingEvents","upcomingCount","scrollRef","useRef","seedFixRef","scrollToCurrentPage","isReady","debug","_scrollContainerRef$c","options","arguments","scrollContainerSelector","navItemSelector","enableDebug","scrollContainerRef","isScrollingRef","setIsReady","useCallback","log","getScrollContainer","current","container","document","querySelector","findCurrentNavItem","navItems","querySelectorAll","getAttribute","element","navItem","containerRect","getBoundingClientRect","itemRect","itemTopRelativeToContainer","scrollTop","itemHeight","containerHeight","targetScrollTop","maxScrollTop","scrollHeight","finalScrollTop","scrollTo","behavior","setTimeout","scrollTimer","clearTimeout","initTimer","scrollPosition","useAdminNavScrollRetention","renderNavItem","props","setNavItems","navLoading","setNavLoading","hasItemDeep","predicate","check","some","hasShortlinks","hasEngagement","hasComments","hasSweepstakes","hasCompetitionAliases","hasClothing","hasEshopProducts","hasAbout","hasVideos","hasGallery","hasScoreboard","hasScoreboardRemote","hasSponsors","hasBanners","hasMessages","hasContacts","hasNewsletter","hasPolls","hasFiles","hasNavigation","hasUsers","hasSettingsPage","hasAnalytics","hasPrefetch","hasManualData","COLLAPSE_KEY","collapsed","setCollapsed","localStorage","getItem","parsed","JSON","parse","next","forEach","toggleCollapsed","setItem","stringify","adminItems","newAdminItems","seedError","reloaded","reloadedAdmin","warn","editorItems","bottom","borderRightWidth","pt","zIndex","overflowY","ref","onScroll","css","background","FaTimes","club_logo_url","FaHome","my","isCategory","hasChildren","catCollapsed","categoryHeader","ChevronRightIcon","ChevronDownIcon","Collapse","in","animateOpacity","unmountOnExit","child","cidx","childIcon","childUrl","showBadge","itemIcon","itemUrl","FaSyncAlt","FaSignOutAlt","onMenuToggle","rightContent","rest","_objectWithoutProperties","_excluded","userData","headerShadow","hasArrow","ThemeToggle","Menu","MenuButton","Avatar","avatar","MenuList","MenuItem","FaUserCog","adminIndex","section","keywords","FaHashtag","FaCommentAlt","FaChartLine","FaChalkboard","FaFolderOpen","FaTrophy","FaTicketAlt","FaBell","FaCog","FaKey","FaBug","FaGlobe","FaSearch","highlight","text","esc","replace","re","RegExp","parts","split","match","out","push","backgroundColor","score","kws","join","indexOf","AdminSearchModal","onSelectPath","debounced","setDebounced","setIdx","inputRef","_inputRef$current","focus","results","onSelect","motionPreset","Kbd","onKeyDown","key","chosen","ctrlKey","metaKey","AdminSupportButton","setMessage","submitting","setSubmitting","extUI","setExtUI","extToken","setExtToken","actions","getRecentActions","search","timeline","now","_a$status","ago","round","at","method","toUpperCase","ms","getAdminSettings","error_review_ui_url","error_review_admin_token","FaLifeRing","maxH","Textarea","rows","open","reportError","severity","tags","source","context","recentActions","AdminHealthIndicator","lastError","setLastError","timer","cancelled","fetchStatus","_res$data","mapped","defaultIsOpen","isSearchOpen","onSearchOpen","onSearchClose","manuallyOpenedRef","handleClose","navigate","useNavigate","isAuthenticated","colorMode","useColorMode","sidebarBg","isMobile","setIsMobile","checkMobile","mobile","innerWidth","handleResize","addEventListener","removeEventListener","scrollPositions","lastPath","isRestoring","sidebar","currentScroll","savedPosition","requestAnimationFrame","useFastAdminScroll","state","handler","logAction","setIcon","rel","createElement","head","appendChild","endsWith","Skeleton","className","AdminSidebar","AdminHeader","handleOpen","normalize","orgPhrases","phrase","deriveTeamIdFromLogoUrl","TeamsAdminPage","queryClient","getFacrTablesCache","staleTime","mainClubId","club_id","mainClubBase","backendOrigin","theadBg","rowHoverBg","searchBg","overrides","fetchTeamLogoOverrides","overridesById","by_id","overridesByIdLC","k","overridesNameIndex","logo","norm","sportLogosMap","setSportLogosMap","sportLogosLoading","setSportLogosLoading","teamIds","comp","_comp$table","table","overall","team_id","add","derived","team_logo_url","idsArray","clear","batchFetchLogosFromSportLogosAPI","catch","finally","byName","by_name","byNameNormalized","byNamePairs","keyNorm","getLogo","teamName","teamId","original","_overridesByIdLC$tid","tid","hit","t1","_unused4","overrideUrl","getName","_overridesByIdLC$tid2","_unused5","viewMode","setViewMode","selectedCompIndex","setSelectedCompIndex","setFilter","filterDebounced","setFilterDebounced","allTeamsUnique","_comp$table2","rawName","team","rn","canonicalName","variants","currentIsEmpty","newIsNotEmpty","sensitivity","variantsByKey","setIsOpen","selected","setSelected","form","setForm","external_team_id","team_name","fileRef","uploadedFile","setUploadedFile","externalUploadStatus","setExternalUploadStatus","externalUploadError","setExternalUploadError","showExternalUploadInfo","abs","host","hostname","backendHost","isFacr","isLogoAPI","isLocalUpload","_unused6","query","setQuery","searchResults","searchClubs","onOpenEdit","teamLogoUrl","variantNames","extTeamId","_unused7","_unused8","primaryNameTry","pick","_unused9","logoUrl","primaryName","apiLogo","fetchLogoFromLogoAPI","_unused0","uploadAttempted","shouldUpload","_unused1","logoFileToUpload","fetchLogoAsBlob","logaResult","uploadToLogaSportcreative","filename","File","pop","clubName","success","confirmedUrl","_unused10","putTeamLogoOverride","ButtonGroup","isAttached","InputRightElement","getLogoAPIRequestStats","totalRequests","Alert","AlertIcon","Tabs","TabList","flexWrap","Tab","minW","whiteSpace","TabPanels","_comp$table3","f","rowsFiltered","TabPanel","sx","WebkitOverflowScrolling","rank","played","wins","draws","losses","points","tidRaw","displayName","flexShrink","Tag","TagLabel","gridColumn","Drawer","DrawerOverlay","DrawerContent","DrawerHeader","DrawerBody","_fileRef$current","click","apiUrl","_unused11","_e$target$files","file","uploadImage","DrawerFooter","NewsletterAdminPage","_statusData$total_sub","_statusData$active_su","_statusData$weekly_ho","_statusData$sample_re","_typePreview$activeTy","_typePreview$activeTy2","searchTerm","setSearchTerm","selectedSubscribers","setSelectedSubscribers","newsletterData","setNewsletterData","smtpHost","setSmtpHost","smtpPort","setSmtpPort","smtpUser","setSmtpUser","smtpPass","setSmtpPass","smtpFrom","setSmtpFrom","smtpTo","setSmtpTo","smtpTLS","setSmtpTLS","smtpSubject","setSmtpSubject","smtpBody","setSmtpBody","showSmtpPass","setShowSmtpPass","adminSmtpTestMutation","port","username","password","use_tls","_err$response","_err$response$data","testEmail","setTestEmail","testEmails","setTestEmails","testType","setTestType","prefsModalOpen","setPrefsModalOpen","editingSubscriber","setEditingSubscriber","editingPrefs","setEditingPrefs","sendMode","setSendMode","setCompetitions","previewSubject","setPreviewSubject","previewHtml","setPreviewHtml","previewLoading","setPreviewLoading","mailTypeLabel","weekly","scores","blogs","events","detailsOpen","setDetailsOpen","activeType","setActiveType","typePreview","setTypePreview","detailsCompetitions","setDetailsCompetitions","detailsLoading","setDetailsLoading","sendNowLoading","setSendNowLoading","newSubscriberEmail","setNewSubscriberEmail","newSubscriberICO","setNewSubscriberICO","newSubscriberPrefs","setNewSubscriberPrefs","icoSearchResult","setIcoSearchResult","icoSearching","setIcoSearching","closeDetails","selectedCompCodes","detailsSelectedCompCodes","subscribers","recipientsForType","exportRecipientsCSV","getRecipientsFor","prefs","x","safeCSV","lines","blob","Blob","createObjectURL","download","revokeObjectURL","loadPreviewForType","html","types","testModal","smtpModal","addSubscriberModal","useBreakpointValue","clubId","clubType","club_type","clubCompetitions","facrApi","getClubCompetitions","compOptions","o","settingsQuery","enableWeekly","setEnableWeekly","enable_weekly","enableMatchReminders","setEnableMatchReminders","enable_match_reminders","enableResults","setEnableResults","enable_results","weeklyDay","setWeeklyDay","newsletter_weekly_day","toTimeString","padStart","weeklyTime","setWeeklyTime","newsletter_weekly_hour","reminderLead","setReminderLead","newsletter_reminder_lead_hours","quietStartTime","setQuietStartTime","newsletter_quiet_start","quietEndTime","setQuietEndTime","newsletter_quiet_end","parseHour","exec","isNaN","saveScheduleMutation","updateAdminSettings","_err$response2","_err$response2$data","sanitizeHtml","withoutEvents","filteredSubscribers","subscriber","toggleStatusMutation","deleteMutation","updatePrefsMutation","_err$response3","_err$response3$data","sendNewsletterMutation","sendTestMutation","emails","recipients","recipient","_error$response4","_error$response4$data","createSubscriberMutation","_ref3","_error$response5","_error$response5$data","icoSearchMutation","found","_error$response6","_error$response6$data","onSettled","formatDate","dateString","format","locale","cs","statusData","automationToggle","recentStats","statsLoading","statsFrom","setStatsFrom","statsTo","setStatsTo","filteredStats","row","ts","getTime","fromTs","toTs","eventsModalOpen","setEventsModalOpen","activeLog","setActiveLog","eventsQuery","eventFilter","setEventFilter","spam","unsubscribe","ev","_eventFilter","event_type","AddIcon","DeleteIcon","EmailIcon","isFitted","total_subscribers","active_subscribers","next_approximate","interval_minutes","newsletter_enabled","weekly_day","weekly_enabled","sun","mon","tue","wed","thu","fri","sat","weekly_hour","weekly_next_scheduled","diff","mins","floor","hrs","rem","sample_recipients","_typePreview$t","count","openDetails","FormHelperText","DateRangePicker","fromValue","toValue","opens","clicks","unsubs","handleSelectSubscriber","isSelected","subId","updated_at","selectAllComps","clearComps","toggleComp","on","dangerouslySetInnerHTML","__html","handleSendNewsletter","detailsSelectAllComps","detailsClearComps","toggleDetailsComp","typeKey","compsInput","shown","handleICOChange","maxLength","dic","address","city","handleCreateSubscriber","ADMIN_PAGE_PRESETS","NAV_ICON_OPTIONS","FaFacebook","FaInstagram","FaYoutube","FaTwitter","FaTiktok","FaLinkedin","FaDiscord","FaTwitch","FaInfoCircle","FaTable","FaCamera","ICON_COMPONENTS","fromEntries","NavItemCard","onMoveUp","onMoveDown","onEdit","onAddChild","isExpanded","onToggleExpand","level","onChildMoveUp","onChildMoveDown","onToggleVisible","childrenDroppableId","draggableChildPrefix","onEditTarget","onDeleteTarget","indentPx","Card","CardBody","ChevronUpIcon","ViewOffIcon","isTruncated","ExternalLinkIcon","ViewIcon","EditIcon","Droppable","droppableId","provided","innerRef","droppableProps","childIndex","Draggable","draggableId","dragProvided","draggableProps","dragHandleProps","NavigationAdminPage","_editingNav$visible","PAGE_TYPE_OPTIONS","adminNavItems","setAdminNavItems","socialLinks","setSocialLinks","editingNav","setEditingNav","editingSocial","setEditingSocial","expandedItems","setExpandedItems","isAdminNav","setIsAdminNav","isNavModalOpen","onNavModalOpen","onNavModalClose","isSocialModalOpen","onSocialModalOpen","onSocialModalClose","loadData","navData","socialData","seedResult","seeded","newNavData","newSocialData","frontend","admin","toggleVisible","newVisible","applyToggle","moveChildNavItem","parentId","direction","moveWithin","setList","parentIdx","findIndex","parent","targetIndex","updatedParent","moveNavItem","moveAdminNavItem","openNavModal","forAdmin","itemsCount","toggleExpand","deleteNav","DragDropContext","result","destination","parseAdminChildrenId","parseFrontChildrenId","moved","srcParentId","destParentId","findParentIndex","pid","destChildIndex","before","after","dropIntoId","dIdxProbe","pIdx","srcChildren","dIdx","destChildren","topOrders","srcIdx","destIdx","childIdx","_selected$url","protocol","TablesPage","setError","aliasMap","setAliasMap","selectedClub","setSelectedClub","isModalOpen","setIsModalOpen","setOverrides","tableBg","tableHeaderBg","tableTextColor","rowOddBg","rowEvenBg","sortState","setSortState","toNumber","parseFloat","scoreDiff","str","toggleSort","compId","cur","order","arrow","ovr","res2","amap","getCompetitionAliasesPublic","_c$table","_amap$c$code","_amap$String","_amap$c$code2","_amap$String2","_amap$c$code$display_","_amap$c$code3","_amap$String3","_r$rank","_r$team","_r$played","_r$wins","_r$draws","_r$losses","_r$score","_r$points","matches_link","sortCategoriesWithOrder","stripPrefixes","byNameMap","byIdMap","pickName","_byIdMap$id","orig","_hit","_selected","va","vb","isText","displayTeam","displayLogo","pickLogo","_byIdMap$teamId","exact","cand","stripped","kn","TeamLogo","facrLogo","ClubModal","club","getCurrentSweepstake","enterSweepstake","markSweepstakeVisualPlayed","getMyWinnings","adminListSweepstakes","adminCreateSweepstake","adminUpdateSweepstake","adminDeleteSweepstake","adminFinalizeSweepstake","seed","adminGetVisualData","adminListPrizes","_res$data4","adminCreatePrize","adminUpdatePrize","prizeId","adminDeletePrize","adminReorderPrizes","adminUpdateWinner","winnerId","stripHtml","div","innerHTML","textContent","innerText","formatDateTime","dt","dd","MM","yyyy","hh","d","dateStr","timeStr","toLocaleTimeString","hour","minute","cleanVenue","normalizeTag","article","activity","targetUrl","onGenerated","setText","shortUrl","setShortUrl","aiProgress","setAiProgress","aiStartTime","setAiStartTime","images","setImages","campaignId","computeTarget","handleGenerate","stopPropagation","progressInterval","setInterval","random","fullUrl","urlStr","searchParams","withUtm","platformCode","target_url","source_type","source_id","sUrl","createShortLink","short_url","resPub","createPublicShortLink","club_name","composed","resolvedMatch","getArticleMatchLink","extId","external_match_id","resp","snapshot","match_id","result_home","result_away","competition","date_time","venue","home","home_team","away","away_team","_category","_ai$text","ai","generateInstagramAI","category","category_name","_article$title","trackingUrl","hashtags","catName","snippet","defaultTags","composeInstagramPostFromArticle","_ai$text2","desc","start_time","place","composeInstagramPostFromActivity","primaryColor","primary_color","secondaryColor","secondary_color","imagePromptBase","colorHint","imagePrompt","imgResp","generateInstagramImagesAI","prompt","aspect","urls","imgErr","clearInterval","handleShareClick","longUrl","buildShareUrl","getPublicShortUrl","tw","fb","navigator","clipboard","writeText","AdminButtonEl","Share2","VisitorShareEl","onMouseDown","onTouchStart","Instagram","Twitter","Facebook","Copy","ChakraImage","AILoadingModal","progress","estimatedTime","SpartaNavbar","theme","useClubTheme","mobileOpen","setMobileOpen","dynamicNavItems","setDynamicNavItems","navCategories","setNavCategories","publicItems","publicNewItems","cats","getCategories","convertToNavLink","getTranslatedLabel","translationKey","external","categoryItems","cat","slug","NAV_LINKS","navLinks","l","show_about_in_nav","gallery_label","shop_url","nav","ShortlinksAdminPage","_articlesQ$data","_linksQ$data","_linksQ$data$items","_linksQ$data2","_statsData$timeseries","selectedTarget","setSelectedTarget","setTitle","creating","setCreating","statsModal","statsLink","setStatsLink","statsData","setStatsData","linksQ","listShortLinks","articlesQ","published","eventsQ","staticTargets","is_public","rawCode","safeCode","substring","idStr","idNum","defaultCode","msg","details","_it$click_count","click_count","FiClipboard","FiBarChart2","getShortLinkStats","openStats","timeseries","referrers","Referrer","Count","utms","Source","Medium","Campaign","ArticlesWidget","Widget","divider","_article$author","_article$author2","_article$author3","FaUser","author","parseISO","TeamsWidget","settingsLoading","getPublicSettings","facrTables","primaryKey","getWeatherIcon","condition","isDay","lowerCondition","FaSun","FaMoon","FaCloudSun","FaCloud","FaCloudRain","FaSnowflake","WeatherWidget","weather","refetch","refetchInterval","bgCard","currentIcon","is_day","uvColor","uv","uvLabel","getUVLabel","FaMapMarkerAlt","region","lineHeight","temp_c","feelslike_c","FaWind","wind_kph","degree","wind_degree","FaTint","humidity","FaEye","vis_km","FaThermometerHalf","pressure_mb","Progress","forecast","forecastday","day","dayIcon","dayName","weekday","maxtemp_c","mintemp_c","daily_chance_of_rain","last_updated","AdminHelp","StatCard","help","Stat","StatLabel","StatNumber","StatHelpText","AdminDashboardPage","_data$users$total","_data$users","_data$users$new_this_","_data$events$total","_data$events","_data$events$upcoming","_data$articles$total","_data$articles","_data$articles$publis","_analyticsOverview$to","_analyticsOverview$to2","_analyticsOverview$pa","_analyticsOverview$un","_analyticsOverview$un2","_analyticsOverview$un3","_analyticsOverview$pa2","_analyticsOverview$pa3","isEditor","isFetching","getAnalytics","analyticsOverview","isLoadingOverview","getAnalyticsOverview","topPages","getTopPages","topEvents","quickActions","FaImages","AlertTitle","AlertDescription","new_this_week","upcoming","total_page_views","page_views_today","unique_visitors","unique_visitors_week","page_views_week","FaMousePointer","page_name","page_path","view_count","event","eventInfo","eventName","getEventTranslation","y","xl","MatchesWidget","normalizePreferences","normalized","joined","getPreferences","token","savePreferences","unsubscribeToken","getMyNewsletterToken","API_BASE_URL","REACT_APP_API_BASE_URL","unsubscribeFromNewsletter","axios","NewsletterUnsubscribePage","encodedEmail","useParams","isSuccess","setIsSuccess","decodeURIComponent","trackEvent","processUnsubscribe","handleBackToHome","useAllPageElementConfigs","configs","setConfigs","visibility","setVisibility","styles","setStyles","elementOrder","setElementOrder","refreshKey","setRefreshKey","applyDOMOrder","sections","elementMap","elementName","parentElement","updateInjectedStyleProps","stylesMap","styleId","styleEl","getElementById","cssBlocks","addDecl","decls","prop","unit","toKebab","st","handled","paddingRight","paddingBottom","paddingLeft","marginTop","marginRight","marginBottom","marginLeft","gridTemplateColumns","gridTemplateRows","gridAutoFlow","gridColumnGap","gridRowGap","justifyItems","borderTop","borderBottom","borderLeft","borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius","alignContent","justifySelf","alignSelf","placeItems","placeContent","placeSelf","maxWidth","minWidth","maxHeight","minHeight","offsetHeight","getPageElementConfigs","configMap","visMap","config","element_name","_config$settings","_config$settings2","_config$settings2$sty","customCSS","remove","importantDecls","sp","classList","cls","isEditingMode","_document$body","_document$body$classL","contains","URLSearchParams","loadConfigs","handleMyUIbrixChange","previewMode","timestamp","detail","handleMyUIbrixReorder","_document$body2","_document$body2$class","handleMyUIbrixStyleChange","newStyles","handleForceRefresh","getVariant","defaultVariant","isVisible","defaultVisible","getStyles","getSeoSettings","updateSeoSettings","fetchSettings","updateSettings","defaultSettings","contactInfo","phone","website","workingHours","features","darkMode","notifications","updatedAt","toISOString","createdAt","useSettings","updateSettingsMutation","updateTheme","updateSocialLinks","updateFeatures","isUpdating","ScoreboardPreview","isFlipped","sidesFlipped","short","awayShort","homeShort","deriveShortLocal","awayName","homeName","awayLogo","homeLogo","awayScore","homeScore","fouls","awayFouls","homeFouls","awayTextColor","homeTextColor","SegmentScore","SegmentTeam","colorA","FoulsBar","leftCount","rightCount","leftColor","rightColor","shadeColor","_ref4","Dot","_ref5","ch","hex","percent","rgb","num","g","AboutAdminPage","_styleDescriptions$da","_styleDescriptions$da2","_styleDescriptions$da3","saving","setSaving","aiGenerating","setAiGenerating","aiPrompt","setAiPrompt","aiAudience","setAiAudience","aiModelId","setAiModelId","getDefaultTextModelId","setCategories","foundationYear","setFoundationYear","timelineEvents","setTimelineEvents","year","setData","subtitle","seo_title","seo_description","loadCategories","handleSave","handleGenerateAI","catsText","styleIntro","timelineDetails","extraGuidelines","fullPrompt","generateAboutAI","audience","model","processAIContent","cleanText","preserveHtmlTags","cleanAIText","styleDescriptions","default","modern","custom","FiLayout","FiCode","FiTrash","FiZap","AIPromptInput","modelId","isSubmitting","helperText","RichTextEditor","toolbar","showImageResize","borderTopWidth","Row","hid","hl","aid","sanitizeClubName","hG","aG","ourHome","ourAway","strip","A","B","C","CompetitionMatches","_data$competitions","getClub","aliases","setAliases","mounted","sortedCompetitions","_aliases$c$code","_aliases$c$id","_aliases$c$code2","_aliases$c$id2","_aliases$c$code$displ","_aliases$c$code3","_aliases$c$id3","home_id","home_logo_url","away_id","away_logo_url","club_internal_id","AboutPage","borderSubtle","img","HTMLImageElement","decoding","renderCategoriesList","property","seoTitle","seoDesc","clubLogo","cleanContent","DOMPurify","sanitize","USE_PROFILES","ADD_TAGS","ADD_ATTR","renderContent","margin","fontStyle","padding","listStylePosition","listStyleType","photoUrl","pageUrl","albumTitle","imageDimensions","setImageDimensions","imageLoaded","setImageLoaded","controlsBg","controlsBorder","controlsText","shouldShowCloseOutside","scrollBehavior","backdropFilter","onLoad","currentTarget","naturalWidth","naturalHeight","fallback","X","ExternalLink","AlbumDetailPage","album","setAlbum","selectedPhoto","setSelectedPhoto","bgColor","infoBg","infoBorder","infoText","profileRes","albumsRes","allSettled","foundAlbum","profileData","albumsData","albumUrl","photo_limit","rendered","albumData","photos","photos_count","views_count","page_url","image_1500","fetched_at","fetchAlbum","Breadcrumb","separator","ChevronRight","BreadcrumbItem","BreadcrumbLink","isCurrentPage","Calendar","ImageIcon","photo","handlePhotoClick","CommentsSection","PhotoModal","handleCloseModal","PollsPage","tabIndex","setTabIndex","bgSection","getPolls","pollsData","isLoadingPolls","promises","poll","getPoll","featuredPolls","featured","activePolls","allPolls","pollResponse","PollCard","hasVoted","has_voted","canShowResults","can_show_results","getSetupStatus","initializeSetup","validateSMTP","listComments","createComment","updateComment","reactComment","unreactComment","requestUnban","reportComment","ALL_TEXT_MODELS","provider","getEnabledTextModels","parseBoolEnv","_models$0$id","_models$","findTextModel","quickEditImage","request","readOnly","onImageUpload","quillRef","toolbarRef","onChangeRef","changeDebounceRef","lastContentRef","selectedImageIdRef","selectImageByIdRef","toolbarDragRef","startX","startY","startLeft","startTop","isMounted","setIsMounted","cropOpen","setCropOpen","cropSrc","setCropSrc","cropFile","setCropFile","crop","setCrop","cropQuality","setCropQuality","cropMaxWidth","setCropMaxWidth","cropProcessing","setCropProcessing","imgRef","isLinkOpen","setIsLinkOpen","linkText","setLinkText","linkUrl","setLinkUrl","linkRangeRef","isHtmlEditorOpen","setIsHtmlEditorOpen","htmlSource","setHtmlSource","htmlRangeRef","htmlSwitchingRef","MonacoComponent","setMonacoComponent","htmlEditMode","setHtmlEditMode","isFullHtmlConfirmOpen","setIsFullHtmlConfirmOpen","confirmCancelRef","confirmDontAsk","setConfirmDontAsk","pendingSanitizedRef","pendingRawRef","selectedImageElement","setSelectedImageElement","imageFilters","setImageFilters","brightness","contrast","saturation","blur","grayscale","sepia","hueRotate","rotation","flipH","flipV","showImageToolbar","setShowImageToolbar","toolbarPosition","setToolbarPosition","previewImage","setPreviewImage","isPreviewOpen","setIsPreviewOpen","imageWidth","setImageWidth","manualWidth","setManualWidth","widthPercent","setWidthPercent","toolbarConfigs","full","header","basic","minimal","toolbarConfig","cleanEditorHTML","wrapper","removeAttribute","decl","_decl$split$","setAttribute","handleChange","_delta","cleaned","handleImageUpload","input","onchange","reader","FileReader","onload","readAsDataURL","handleLinkToolbar","_quillRef$current","quill","getEditor","range","getSelection","getLength","selectedText","getText","openHtmlEditor","_quillRef$current2","mode","_quill$root","currentHTML","root","handleInsertHtmlBlock","_quillRef$current3","sanitized","deleteText","dangerouslyPasteHTML","insertText","quillModules","handlers","image","matchVisual","_quillRef$current4","onTextChange","delta","_old","inserted","ops","op","insert","ctxStart","ctx","relStart","lastIndexOf","absStart","len","off","quillFormats","_quillRef$current5","_editor$root","editor","toolbarEl","previousElementSibling","selector","el","_quillRef$current7","selectedImage","resizeHandle","isResizing","startWidth","rafId","removeResizeHandle","parentNode","removeChild","selectImage","outline","_unused14","cssText","editorContainer","sizeLabel","updateSizeLabel","edW","clientWidth","pct","idAttr","updateHandlePositions","rect","scrollLeft","isCorner","handle","positionStyle","stopImmediatePropagation","clientX","clientY","offsetWidth","startHeight","aspectRatio","onPointerMove","deltaX","deltaY","newWidth","editorWidth","_unused12","onPointerUp","_selectImageByIdRef$c","call","_unused13","createResizeHandle","currentWidth","_unused15","filtersData","savedFilters","_unused16","editorRect","leftPos","toolbarWidth","topPos","_quillRef$current8","node","deselectImage","handleImageClick","imgEl","tagName","closest","imgSrc","handleKeyDown","tag","isContentEditable","handleScroll","cancelAnimationFrame","draggedImage","_e$dataTransfer","_unused19","dropEffect","handleDrop","_quillRef$current9","sel","anyDoc","docWithCaretRange","caretRangeFromPoint","caretPositionFromPoint","createRange","setStart","offsetNode","offset","setEnd","removeAllRanges","addRange","_unused20","dropRange","_unused21","insertEmbed","setSelection","_selectImageByIdRef$c2","_unused22","_quillRef$current0","processImg","doResize","_unused23","quality","_quillRef$current1","newUrl","_selectImageByIdRef$c3","_unused24","complete","once","_unused25","mo","MutationObserver","mutations","addedNodes","_node$querySelectorAl","HTMLElement","observe","childList","subtree","disconnect","applyFiltersToImage","filters","filterString","transformOrigin","resetFilters","defaultFilters","_quillRef$current10","updateFilter","newFilters","_quillRef$current11","Event","_unused26","_selectImageByIdRef$c4","_unused27","isApplyingFilters","setIsApplyingFilters","applyFiltersToBackend","_quillRef$current12","currentSrc","flip_h","flip_v","absoluteUrl","reselectAfterContentUpdate","deleteSelectedImage","_quillRef$current13","_unused28","resizeContainer","_unused29","alignImage","alignment","_quillRef$current14","float","_unused30","_selectImageByIdRef$c5","_unused31","applyWidthPx","opts","_quillRef$current15","finalWidth","_unused32","silent","resetWidth","_quillRef$current16","applyPercent","_quillRef$current17","clamped","applyManualWidth","_quillRef$current18","insertOrUpdateLink","_quillRef$current19","line","getLine","domNode","_unused33","_quillRef$current20","_quillRef$current21","_editor$root4","addResetButton","formatName","picker","_picker$parentElement","btn","_quillRef$current22","insertBefore","nextSibling","Code","stroke","fill","userSelect","ReactQuill","modules","formats","button","onMove","dx","dy","onUp","Settings","AlignLeft","AlignCenter","AlignRight","RotateCcw","RotateCw","FlipHorizontal","FlipVertical","Trash2","Sun","Contrast","Droplets","Eye","Filter","Sparkles","Check","DrawerCloseButton","defaultLanguage","language","automaticLayout","wordWrap","minimap","tabSize","insertSpaces","formatOnPaste","formatOnType","suggestOnTriggerCharacters","AlertDialog","leastDestructiveRef","AlertDialogOverlay","AlertDialogContent","AlertDialogHeader","AlertDialogCloseButton","AlertDialogBody","AlertDialogFooter","_quillRef$current23","_unused34","_unused35","_unused36","ReactCrop","keepSelection","_quillRef$current6","displayW","displayH","naturalW","naturalH","scaleX","scaleY","toDisplayPx","cropData","dispX","dispY","dispW","dispH","natX","natY","natW","natH","formData","FormData","append","headers","cropAndUpload","_quill$root2","anyQuill","leafInfo","getLeaf","leaf","targetImg","onerror","embedError","uploadFile","CustomRichEditor","ytMemCache","fetchedAt","sortByPublishedDate","primary","fetchStaticYouTubeCache","copy","ta","OverlaySponsorsPage","listSponsorsPublic","trackRef","containerRef","setDuration","repeatCount","setRepeatCount","scrollDistance","setScrollDistance","qrUrl","setQrUrl","qrVisible","setQrVisible","scheduleRef","imgs","completed","finalize","copyLen","singleWidth","used","contW","repeat","ceil","pps","qr","getQr","getPublicScoreboard","everyMin","qrEvery","QRShowEveryMinutes","durSec","qrDuration","QRShowDurationSeconds","show","intId","_scheduleRef$current","flatMap","rIdx","articleId","eventId","videoUrl","showTitle","maxPolls","unstyled","queryParams","article_id","event_id","video_url","pollsToDisplay","preSortedLimited","aRating","bRating","aFeat","bFeat","aDate","wrapperProps","limited","flat","ASSET_BASE","API_BASE","pathOrUrl","winOrigin","winPort","getBackendOrigin","isLocalHost","isBackendAsset","isSameAsFrontend","hash","ChartJS","CategoryScale","LinearScale","BarElement","Title","ChartTooltip","Legend","AnalyticsAdminPage","_stats$pageviews","_stats$visitors","_stats$visits","_stats$bounces","_stats$visits2","_stats$totaltime","_stats$visits3","stats","setStats","pageMetrics","setPageMetrics","referrerMetrics","setReferrerMetrics","browserMetrics","setBrowserMetrics","osMetrics","setOsMetrics","countryMetrics","setCountryMetrics","deviceMetrics","setDeviceMetrics","eventMetrics","setEventMetrics","queryMetrics","setQueryMetrics","pageviewsData","setPageviewsData","timeRange","setTimeRange","hasData","setHasData","setErrorMessage","noDataInfo","setNoDataInfo","selectedCountry","setSelectedCountry","countryDetails","setCountryDetails","loadingCountryDetails","setLoadingCountryDetails","umamiConfig","setUmamiConfig","showDiagnostics","setShowDiagnostics","_statsResponse$data$p","_statsResponse$data$v","_pages$data","_countries$data","daysNum","days","statsResponse","hasAnyStats","pageviews","visitors","pages","browsers","os","countries","devices","queries","pageviewsDataArray","pageviewsResponse","time","getHours","getDate","getMonth","hasPageviews","hasMetrics","fetchAnalytics","fetchUmamiConfig","formatNumber","Intl","NumberFormat","renderMetricTable","metrics","isEventMetrics","CardHeader","FiCalendar","FiInfo","FiUsers","FiActivity","visits","FiPercent","bounces","FiClock","totalSeconds","hours","minutes","seconds","formatDuration","totaltime","website_id","FiGlobe","reload","REACT_APP_UMAMI_URL","country","_country$x","countryCode","countryName","DisplayNames","of","flagEmoji","fromCodePoint","charCodeAt","handleCountryClick","FiFile","FiMonitor","FiCpu","FiSmartphone","FiSearch","handleModalClose","SIZE_OPTIONS","COLOR_OPTIONS","TransactionsAndAdjust","setReason","limit","setLimit","usersQ","txQ","adminListTransactions","adjUserId","setAdjUserId","adjDelta","setAdjDelta","adjReason","setAdjReason","passwordModal","currentPassword","setCurrentPassword","adjustMut","uid","adminAdjustPoints","current_password","rowGap","_v","isFinite","_find","_find2","meta","EngagementAdminPage","rewardFilter","setRewardFilter","rewardsQ","adminListRewards","redemptionsQ","adminListRedemptions","cost_points","stock","validUnlimited","setValidUnlimited","sizeList","setSizeList","colorList","setColorList","sizeCustom","setSizeCustom","colorCustom","setColorCustom","editItem","setEditItem","editModal","editForm","setEditForm","setMeta","editMeta","setEditMeta","usersById","setMetaField","setEditMetaField","valid_from","valid_to","metadata","adminCreateReward","adminUpdateReward","adminDeleteReward","redStatusMut","adminUpdateRedemptionStatus","rewards","redemptions","metric","setMetric","leaders","setLeaders","loadingLb","setLoadingLb","rewardById","adminGetLeaderboard","xp","animated_avatar_url","avatar_url","coupon_code","note","CheckboxGroup","vals","Wrap","WrapItem","license_key","download_url","_document$getElementB","_document$getElementB2","_document$getElementB3","_document$getElementB4","_r$metadata","_r$stock","_r$type","sku","FiCopy","_navigator$clipboard","vf","vt","prepared","__size_list","__color_list","_usersById$get","_usersById$get2","_rewardById$get","_rewardById$get2","_rewardById$get3","_rewardById$get4","reward_id","onUploadFinished","uploaded","_navigator$clipboard2","__size_custom","merged","__color_custom","_document$getElementB5","_document$getElementB6","_document$getElementB7","_document$getElementB8","sz","cz","ForbiddenPage","GiWhistle","GiSoccerBall","fetchJSON","loadMatchOverrideMap","past","MatchesPage","setClubName","setClubId","setClubType","facrCompetitions","setFacrCompetitions","activeTab","setActiveTab","isMatchModalOpen","setIsMatchModalOpen","selectedMatch","setSelectedMatch","sortAscending","setSortAscending","displayedMatchesCount","setDisplayedMatchesCount","MATCHES_PER_PAGE","fanEmail","setFanEmail","fanSubscribing","setFanSubscribing","textPrimary","handleTeamClick","truncateClubName","formatCzechDate","month","isClubTeam","aClean","bClean","getSentiment","parseScore","ourIsHome","ourIsAway","aTime","bTime","allMatches","competitionName","initialCounts","upcomingMatches","currentTime","liveCountdowns","useMultipleCountdowns","cachedSettingsJSON","facrClubJSON","teamLogoOverridesAPI","teamLogoOverridesFile","matchOverrideMapRaw","aliasesList","liveSettings","_facrClubJSON$competi","matchOverrideMap","teamLogoOverridesJSON","byId","reduce","acc","byNameStrippedPairs","normName","aliasNameIndex","urlToName","nm","canon","nameIndex","getOverrideName","_byId$tid","getFallbackLogo","candidate","getOverrideLogo","_byId$teamId","settingsJSON","local","_amap$c$id","_amap$c$id2","_amap$c$id3","rawMatchId","apiMatch","mm","getFullYear","getMinutes","isoDate","sourceHome","sourceAway","rawScore","isFutureMatch","actualScore","facr_link","report_url","sortedComps","onMouseEnter","onMouseLeave","viewBox","strokeWidth","strokeLinecap","strokeLinejoin","compIdx","_assetUrl","_assetUrl2","matchTime","isFuture","isPast","hasScore","countdown","openMatch","boxSizing","textOverflow","flexDirection","WebkitBackgroundClip","WebkitTextFillColor","MatchWeather","matchDateTime","isHomeMatch","matchHasStarted","sentiment","green","blue","red","handleLoadMore","competitionIndex","returnFocusOnClose","compName","_getSentiment","timeRemaining","totalMs","parseCountdownToMs","Grid","templateColumns","delayLoad","jt","facrLink","AuthContext","createContext","AuthProvider","setUser","authenticated","setAuthenticated","adminExists","setAdminExists","adminCheck","checkAdminExists","getStoredToken","credentials","updatedUser","clearToken","initializeAuth","Provider","login","remember","storeToken","updateUser","useContext","SponsorsPage","_errors$name","_errors$email","_errors$subject","_errors$message","textTertiary","sending","sendContact","fromServer","isTimeout","isNetwork","isAxiosError","_response","errMsg","sorter","_a$display_order","_b$display_order","ao","bo","generalPartners","standardSponsors","htmlFor","_p$id","_p$first_name","_p$last_name","_p$date_of_birth","_p$position","_p$jersey_number","_ref6","_p$team_id","_ref7","_p$nationality","_ref8","_p$height","_ref9","_p$weight","_ref0","_p$image_url","_ref1","_p$gender","_ref10","_p$is_active","_ref11","_p$created_at","_ref12","_p$email","_ref13","_p$phone","FirstName","LastName","date_of_birth","DateOfBirth","Position","JerseyNumber","TeamID","nationality","Nationality","Height","weight","Weight","ImageURL","Gender","IsActive","CreatedAt","Email","Phone","createPlayer","updatePlayer","deletePlayer","getPublicContacts","getContactCategories","createContactCategory","getContacts","createContact","updateContact","deleteContact","TermsPage","extractPalette","imageUrl","maxColors","resolve","reject","crossOrigin","canvas","getContext","targetW","iw","ih","ratio","drawImage","getImageData","quant","rq","gq","bq","colorDist","sqrt","cnt","mg","toHex","colors","unique","cr","cg","cb","ur","ug","ub","isData","sameOriginAsWindow","pickTextColor","bgHex","srgbToLinear","pow","relLuminance","contrastRatio","hex1","hex2","L1","L2","lighter","isContrastAccessible","generateJwtSecret","bytes","Uint8Array","crypto","getRandomValues","btoa","fromCharCode","hexToRgb","rgbToHex","lighten","amt","darken","adjustForContrast","preferredText","darker","generateThemeCandidates","palette","_withSat$","_withSat$2","_withSat$slice$","hexToHsl","gn","bn","pickAccent","best","bestScore","candidates","pushCandidate","secondary","accentColor","fixed","accent","usePalette","dominant","nextDistinct","accent1","withSat","vibrant","muted","mutedSecondary","accent3","darkAccent","bestAccent","sum","AI_TIMEOUT","REACT_APP_AI_TIMEOUT_MS","generateBlogAI","parsedData","generateMainImageAI","generateCSSAI","processOcrAI","transcribeAudioAI","getZoneramaAlbum","putZoneramaPick","saveAlbumToCache","albumLink","photoLimit","getZoneramaManifestWithFallbacks","assetBase","getZoneramaManifest","ctrlUrl","resCtrl","flatFromCtrl","photo_id","album_id","local_url","image_local","profileUrl","resProfile","flatFromProfile","picks","getZoneramaPicks","album_url","ConfirmationDialog","onConfirm","cancelRef","handleConfirm","themes","resolveLogoUrl","toAbsoluteUploadUrl","deproxify","ScoreboardAdminPage","setState","primaryDraftRef","secondaryDraftRef","homeTextDraftRef","awayTextDraftRef","primaryDraft","setPrimaryDraft","secondaryDraft","setSecondaryDraft","homeTextDraft","setHomeTextDraft","awayTextDraft","setAwayTextDraft","presets","setPresets","presetName","setPresetName","setSponsors","isSponsorModalOpen","openSponsorModal","closeSponsorModal","uploadedSponsorUrls","setUploadedSponsorUrls","uploadedNewSponsors","setUploadedNewSponsors","isBulkDeleting","setIsBulkDeleting","isBulkDeleteOpen","openBulkDelete","closeBulkDelete","cancelBulkRef","addingSponsors","setAddingSponsors","isPickingColor","setIsPickingColor","deferredState","useDeferredValue","previewState","saveDebounceRef","pendingPatchRef","commitDraftColors","toSave","startTransition","saveScoreboardState","queueSaveOnly","clubQuery","setClubQuery","assignTo","setAssignTo","searchLoading","searchError","useFacrApi","getScoreboardState","listPresets","listSponsorsAdmin","adminMatches","fetchAdminMatches","teamOverrides","byNameNorm","strippedPairs","facrCache","getFacrClubInfoCache","facrMatches","cname","kickoff","league","compFilter","setCompFilter","matchQuery","setMatchQuery","parsedMatches","parseTs","withTs","recent","setPartial","applyMatch","_byId$homeTeamId","_byId$awayTeamId","rawHomeName","rawAwayName","homeTeamId","home_team_id","awayTeamId","away_team_id","homeLogoURL","awayLogoURL","updates","deriveShort","externalMatchId","cHome","cAway","derivePrimaryFromLogo","CopyIcon","_state$homeShort","_state$awayShort","halfLength","half","ColorPicker","showAlpha","onChangeComplete","recentStorageKey","onInteractionStart","onInteractionEnd","logoRaw","applyClub","resetTimer","uploadFn","uploadSponsors","rels","baseName","urlAbs","prefillSponsorsFromPage","uploadQr","deleteQr","savePreset","loadPreset","updateAdminScoreboard","_unused17","getContactMessages","_m$ipAddress","_m$userAgent","_m$isRead","_m$createdAt","_m$updatedAt","ipAddress","ip_address","userAgent","user_agent","isRead","is_read","pagination","totalPages","markAsRead","deleteMessage","deleteMultipleMessages","numericIds","ids","forwardMessage","toEmail","to_email","forwardAllMessages","to_emails","saveDefault","save_default","Pagination","currentPage","onPageChange","maxVisiblePages","getPageNumbers","startPage","endPage","ChevronLeftIcon","MessageDetailModal","onMarkAsRead","hasCopied","onCopy","useClipboard","isPopoverOpen","onPopoverOpen","onPopoverClose","forwardEmail","setForwardEmail","forwardMutation","handleCopyEmail","CheckIcon","ArrowForwardIcon","PopoverCloseButton","PopoverHeader","handleForward","MessagesAdminPage","selectedMessages","setSelectedMessages","statusFilter","setStatusFilter","sortBy","setSortBy","field","setPagination","isDetailOpen","onDetailOpen","onDetailClose","isDeleteOpen","onDeleteOpen","onDeleteClose","isForwardAllOpen","onForwardAllOpen","onForwardAllClose","forwardAllEmail","setForwardAllEmail","saveForwardDefault","setSaveForwardDefault","selectedMessage","setSelectedMessage","sortOrder","markAsReadMutation","deleteMessageMutation","deleteMultipleMutation","forwardAllMutation","handleDeleteClick","handleSort","getSortIcon","handleBulkDelete","Search2Icon","handleSelectMessage","msgId","handleViewMessage","variables","handleDeleteConfirm","handleForwardAll","GalleryPage","setAlbums","zoneramaProfileUrl","setZoneramaProfileUrl","bgApp","errorBg","errorBorder","errorText","combinedAlbums","input_link","validBlogAlbums","parseDate","fetchAlbums","coverPhoto","normalizeArticle","_raw$category","_raw$author","_raw$attachments","Category","Author","attachments","aRaw","Attachments","mime_type","putArticleMatchLink","deleteArticleMatchLink","getFeaturedArticles","getArticle","createArticle","updateArticle","deleteArticle","getArticleBySlug","_list$data","appOrigin","apiOrigin","trackArticleView","ConfirmDialogContext","ConfirmDialogProvider","pendingRef","closeDialog","UniversalTranslator","onTranslationComplete","contentType","translateBlog","isTranslating","translationError","detectSourceLanguage","getTargetLanguage","useBlogTranslation","sourceLang","targetLang","FaLanguage","getContentTypeLabel","FaExclamationTriangle","FaCheck","AdminActivitiesPage","_settingsQ$data6","_settingsQ$data8","_settingsQ$data9","_settingsQ$data0","_settingsQ$data1","draftKey","setDraftKey","localDraft","setLocalDraft","aiLoading","setAiLoading","aiTone","setAiTone","aiOverwrite","setAiOverwrite","locationLat","setLocationLat","locationLng","setLocationLng","clubVideos","setClubVideos","youtubeTab","setYoutubeTab","savedLocations","setSavedLocations","selectedSavedId","setSelectedSavedId","mainImageLoading","setMainImageLoading","saveStatus","lastSaved","forceSave","clearDraft","useAutoSave","storageKey","_data$title2","updateEvent","_data$title","createEvent","removeItem","debounceMs","refreshLocalDraft","getDraftMetadata","age","loadDraft","restored","listDateFrom","setListDateFrom","listDateTo","setListDateTo","filteredEvents","NaN","typeLabel","ytData","settingsQ","clubAddr","contact_address","contact_city","contact_zip","hasCoords","location_latitude","location_longitude","lat","lng","unshift","persistSavedLocations","deleteEvent","aliasesMap","setAliasesMap","withAliases","generateWithAI","_settingsQ$data4","_parsedData","_parsedData2","plain","toneText","safeUserPrompt","constraints","min_words","startDate","setStartDate","startTime","setStartTime","endDate","setEndDate","endTime","setEndTime","end_time","toISO","missingTitle","missingStart","ThumbnailPreview","previewSize","_settingsQ$data7","latitude","longitude","detectLanguage","translateBlogContent","translatedTitle","translatedContent","handleQuickTranslateActivity","FiLink","pr","SaveStatusIndicator","compact","FiYoutube","video","_youtube_url","youtube_url","thumbnail_url","published_text","views_text","iso","nextStart","prevEnd","nextEndISO","start","end","rounded","setHours","setDate","DateTimeFormat","resolvedOptions","timeZone","applySavedLocation","loc","addCurrentLocationToSaved","deleteSelectedSaved","MapLinkImporter","currentLatitude","currentLongitude","mapStyle","map_style","clubPrimaryColor","clubSecondaryColor","accent_color","onImport","coords","locationString","street","zip","prevAtts","att","FilePreview","mimeType","PollLinker","startISO","endISO","file_url","_selectedOptions$","_liveResultsData$tota2","initialHasVoted","initialCanShowResults","onVoteSuccess","useUmami","selectedOptions","setSelectedOptions","setHasVoted","setCanShowResults","setResults","showingResults","setShowingResults","voterName","setVoterName","voterEmail","setVoterEmail","isRating","ratingOptionsSorted","maxRating","ratingValue","setRatingValue","selectedStyle","resolvedStyle","selectOptionForRating","byOrder","showLiveResults","liveResultsData","getPollResults","refetchOnWindowFocus","voteMutation","sessionToken","generateSessionToken","votePoll","option_ids","session_token","voter_name","voter_email","resultsData","poll_id","poll_title","rating","handleOptionClick","optionId","allow_multiple","max_choices","_liveResultsData$tota","totalVotesToShow","total_votes","displayResults","option_id","vote_count","percentage","StarIcon","option","numValues","RadioGroup","Radio","player","handleVote","lastSentAt","lastHash","stack","component","column","request_id","service","instance_env","instance_host","referrer","viewport","innerHeight","env","version","occurred_at","basis","fingerprint","keepalive","installGlobalErrorHandlers","_event$error","isResourceError","lineno","colno","FinancialDashboard","_dashboard$recent_exp","setDashboard","selectedYear","setSelectedYear","fetchDashboard","formatCurrency","amount","sponsorship_summary","received_this_year","expense_summary","total_expenses","StatArrow","FiTrendingUp","FiTrendingDown","pending_count","budget_summary","total_budget","total_spend","utilization","over_budget_count","FiAlertTriangle","remaining_budget","active_sponsors","FiCheckCircle","total_value","total_sponsors","approved_expenses","pending_expenses","this_month_expenses","FiFileText","expense_count","recent_expenses","expense","FiCreditCard","total_amount","translateAuthError","normalizeMessage","RegisterPage","_location$state","_location$state$from","setName","setPassword","nameTrim","emailTrim","QRCodesAdminPage","qrCodes","setQRCodes","isCreateModalOpen","setIsCreateModalOpen","isEditModalOpen","setIsEditModalOpen","editingQR","setEditingQR","setFormData","setIsSubmitting","fetchQRCodes","qr_code_url","scan_count","handleDownloadQR","copyToClipboard","FiEdit","handleEdit","handleDelete","getToken","eventData","Authorization","getEvent","CalendarPage","_selected$comp","i18n","compLinks","setCompLinks","useSearchParams","standings","setStandings","weekdayHeaders","activeCompetition","calendarDayBg","calendarDayBorder","calendarMatchBg","calendarMatchHoverBg","listGroupBg","listGroupBorder","listGroupHeaderBg","listGroupHeaderBgHighlight","listGroupHeaderBorderLeft","listGroupHeaderText","listMatchBg","listMatchBorder","listMatchHoverBg","listDateText","listVenueText","isClubModalOpen","setIsClubModalOpen","normalizedTeamName","foundTeam","standing","rowTeamName","clubData","win","draw","loss","goals_for","gf","goals_against","ga","pts","_overrides","_overrides2","compLinkMap","baseComps","cIdx","_amap$compId","goals_home","goals_away","enriched","infoPath","j2","mapCompMatches","bc","sortedEnriched","_amap","_amap$display_order","_amap2","_c$display_order","__compId","__compName","__compDisplayOrder","allComp","standingsData","tablesRes","_facrTablesJSON$compe","facrTablesJSON","_byId$teamId2","_r$goals_for","_r$goals_against","_byId$teamId3","Name","TeamName","goalsFor","scored","goals","goalsAgainst","conceded","compQ","cmp","modalCountdown","useCountdown","openMatchModal","handleMatchMouseDown","_dataset","dataset","monthRef","setMonthRef","startOfMonth","expandedDates","setExpandedDates","showPast","setShowPast","pragueTodayStr","_parts$find","_parts$find2","_parts$find3","formatToParts","weeks","startOfWeek","weekStartsOn","addDays","getMatchCompInfo","_baseComp","_baseComp2","_aliasMap$baseComp$co","baseComp","cc","isLazy","lazyBehavior","byDate","matchList","dateKey","_a$__compDisplayOrder","_b$__compDisplayOrder","aOrder","bOrder","groupByDate","mkHref","nowTs","compareByDateDesc","latestResults","grouped","info","shiftKey","altKey","_blur","onAuxClick","_blur2","inset","addMonths","faded","isSameMonth","today","_getSentiment2","_blur3","_blur4","_unused18","todayStr","pastKeys","reverse","futureKeys","renderGroup","dKey","dayMatches","borderLeftWidth","borderLeftColor","_getSentiment3","_blur5","_blur6","_byDate$get","_selected$comp2","_getSentiment4","countdownString","targetDate","updateInterval","setTimeRemaining","setIsActive","targetTime","updateCountdown","remaining","interval","countdowns","setCountdowns","updateAllCountdowns","newCountdowns","LanguageSwitcher","languages","setLanguages","currentLanguage","setCurrentLanguage","activeLanguages","lang","native_name","is_default","sort_order","fetchLanguages","_active","FaChevronDown","changeLanguage","languageCode","language_code","cookie","_q$data","_q$data2","_counters$comments","_counters$votes","onOpenRewards","getAchievements","achievements","counters","votes","achieved","CheckCircle","Circle","availablePoints","onRedeemed","getRewards","redeemMut","redeemReward","normalizeSocialUrl","network","MobileMenu","_settings$show_about_","menuBg","galleryHref","galleryLabel","hasTables","hasActivities","hasPlayers","hasArticles","handleSimpleLanguageChange","linkIsExternal","Comp","isArticlesLink","hasCats","catIdx","catIsExternal","catHref","catLinkProps","CatComp","childIsExternal","childLinkProps","ChildComp","custom_nav","customLinkIsExternal","HoverMenu","menuColorActive","menuColorInactive","menuBgActive","menuHoverBg","setOpen","openTimer","closeTimer","hasParentLink","isExternalParent","gutter","closeOnBlur","_engProfile$level","_engProfile$points","fullWidth","accountPath","activeTextColor","navTextColor","topBarBg","scrolled","setScrolled","containerMaxW","windowWidth","setWindowWidth","engProfile","setEngProfile","isAchOpen","onAchOpen","onAchClose","isRewOpen","onRewOpen","onRewClose","navbarData","useNavbarData","setHasTables","setHasActivities","setHasPlayers","setHasArticles","setHasVideos","setHasGallery","loadAllData","disposed","tablesResponse","articlesResponse","youtube","manifest","anyRows","loadContentData","onResize","getEngagementProfile","scrollY","passive","gallery_url","zonerama_url","isPathActive","filteredDynamicNavItems","filterItem","articlesIndex","links","baseLinks","customNav","insertIdx","navSplit","maxVisible","visibleCount","moreItems","headerVariant","navBgDefault","navBgMinimal","isTransparent","isMinimal","navBg","navBackdrop","navBorderBottomWidth","navBoxShadow","levelProgress","_engProfile$xp","lvl","threshold","facebook_url","instagram_url","FaShoppingBag","commonProps","FaExternalLinkAlt","HamburgerIcon","submitSearch","FaSearchIcon","AchievementsModal","RewardsModal","headerInsideContainer","showSponsorsSection","showTop","setShowTop","sponsorsVariant","footerVariant","containerVariant","isFullWidthLayout","contentMaxW","headerIsInside","Navbar","SponsorsSection","Footer","FiChevronUp","scrollToTop","apiClient","create","baseURL","explicit","baseOrigin","overridesCache","loadOverrides","_overridesCache","_overridesCache2","interceptors","use","_config$method","cacheKey","cached","cacheTtl","adapter","statusText","_response$config$meth","handleApiError","errorData","patched","applyOverridesToClub","_club$competitions","getClubTable","_byId$teamId4","clearCache","getCompetitionMatches","_response$data$compet","competitionId","setSearchResults","setSearchLoading","setSearchError","handleApiCall","apiCall","_res$data$data","patchMatchOverride","date_time_override","_err$response$status","putMatchOverride","externalTeamId","logoFile","responseData","logo_url_svg","logo_url_png","fetchUrl","fd","_res$data$results","_res$data2","_r$id","_r$name","_r$logo_url","ClubID","LogoURL","_res$data3","resolveBackend","CAP","buf","MatchDetailPage","setMatch","setCompetitionName","setCompetitionId","competitionCode","setCompetitionCode","prevMatch","setPrevMatch","nextMatch","setNextMatch","neighborSource","listForNeighbors","mid","dt2","d2","t2","day2","month2","year2","iso2","tshort","compDisplay","initReactI18next","init","stored","cookies","browserLang","fallbackLng","resources","translation","calendar","tables","contact","shop","news","all_articles","all_matches","all_tables","view_all","homepage","nearest_matches","latest_news","latest_title","more_articles_home","welcome_to_club","official_website","read_more","next_match","match_details","won","drawn","lost","goal_difference","latest_results","upcoming_events","featured_articles","more_articles","photo_gallery","video_gallery","our_partners","more_videos","partner_categories","general","main","official","technical","supplier","no_news","view_all_news","save","edit","update","cancel","close","back","previous","warning","view","upload","share","send","submit","refresh","close_window","continue","finish","stop","pause","resume","select","choose","apply","yes","no","more","open_menu","content_admin","play","open_on_youtube","deleted","error_occurred","success_message","confirm_delete","no_data_found","network_error","server_error","validation_error","permission_denied","page_not_found","session_expired","login_required","invalid_credentials","email_sent","email_error","file_uploaded","file_error","image_uploaded","image_error","footer","terms","privacy","eshop","partners","follow_us","copyright","all_rights_reserved","powered_by","powered_by_desc","order_now","learn_more","quick_links","contact_info","opening_hours","search_button","search_error","error_title","no_results","no_results_desc","try_different","searching","search_hint","clubs","others","upcoming_matches","past_matches","show_all_clubs","show_all_players","show_all_matches","show_all_articles","show_all_events","no_clubs_found","no_matches_found","no_articles_found","no_players_found","no_events_found","no_sponsors_found","no_contacts_found","no_gallery_found","no_categories_found","no_other_results","select_club","loading_table","table_error","position_place","club_modal","statistics","matches_played","goals_scored","goals_conceded","form_last_5","no_matches","check_settings","all_competitions","month_view","week_view","no_events","training","activities_title","activities_subtitle","all_types","no_activities","oldest_first","list_view","calendar_view","matches_filter","training_filter","meeting_filter","other_filter","previous_month","next_month","loading_activities","match_type","training_type","meeting_type","other_type","more_events","show_more","show_less","show_past_matches","hide_past_matches","search_placeholder","active_only","male","female","loading_error","blog","search_articles","search_match","all_categories","publish_date","read_time","search_results","category_articles","latest_articles","subscribe","subscribe_description","email_label","consent_text","subscribe_button","watch_latest","all_from_youtube","no_videos","youtube_channel","main_partners","become_partner","partnership_description","name_label","name_placeholder","name_required","email_placeholder","email_required","subject_label","subject_placeholder","subject_required","message_label","message_placeholder","message_required","send_message","message_sent","message_sent_desc","error_loading","timeout_error","send_error","contact_persons","no_contacts","contact_us","contact_description","name_min_length","email_invalid","subject_max_length","message_min_length","message_max_length","general_error","report","load_more","show_all","versus","postponed","newest_first","no_matches_to_display","check_club_settings","load_more_matches","showing_matches","no_albums","albums_will_appear","loading_albums","error_loading_albums","page_title","page_description","photos_count_one","photos_count_few","photos_count_many","photos_count_other","views_count_one","views_count_few","views_count_many","views_count_other","show_more_on_zonerama","latest_albums","view_all_albums","album_not_found","error_loading_album","back_to_gallery","loading_album","view_on_zonerama","photos_from_zonerama","no_photos_in_album","view_original","photo_modal_title","auth","forgot_password","reset_password","change_password","profile","account","sign_in","sign_up","sign_out","confirm_password","old_password","remember_me","already_have_account","dont_have_account","create_account","common","welcome_message","welcome_subtitle","coach","staff","season","cup","tournament","sponsor","partner","fan","fans","member","members","facebook","instagram","twitter","linkedin","schedule","archive","history","permission","signup","signin","signout","full_name","cost","quantity","inactive","hidden","public","private","draft","new","popular","recommended","none","other","less","hide","expand","collapse","ascending","descending","first","number","summary","overview","grid","graph","district","building","room","stadium","pitch","locker_room","office","store","restaurant","cafe","parking","entrance","exit","emergency_exit","toilet","wc","men","women","accessible","wheelchair","elevator","stairs","ramp","door","roof","wall","floor_surface","ceiling","lighting","heating","cooling","ventilation","security","safety","fire_safety","first_aid","emergency","danger","caution","notice","information","support","tiktok","snapchat","pinterest","reddit","whatsapp","telegram","signal","viber","messenger","skype","zoom","slack","discord","github","gitlab","bitbucket","my_account","email_preferences","subscribe_success","subscribe_success_desc","subscribe_error","subscribe_error_desc","page_settings","page_not_setup","matches_by_competition","club_info","meta_description","en","no_tables","schedule_link","ns","defaultNS","interpolation","escapeValue","formatSeparator","react","useSuspense","bindI18n","bindI18nStore","transEmptyNodeValue","transSupportBasicHtmlNodes","transKeepBasicHtmlNodesFor","ServiceWorkerUpdateListener","_ev$detail","registration","waiting","postMessage","STORAGE_KEY","defaultConsent","necessary","marketing","CookieBanner","setVisible","managing","setManaging","consent","setConsent","openHandler","_e","saveAndClose","rejectNonEssential","acceptAll","DefaultSEO","seo","setSeo","social","setSocial","fallbackClubName","site_title","site_description","meta_keywords","rawOg","default_og_image_url","ogImg","twitter_handle","canonical_base_url","sameAs","robots","enable_indexing","defaultTitle","titleTemplate","potentialAction","requiredRole","checkingSetup","setCheckingSetup","requiresSetup","setRequiresSetup","requires_setup","Navigate","QueryClient","defaultOptions","cacheTime","refetchOnMount","retry","extendTheme","initialColorMode","useSystemColorMode","brand","semanticTokens","global","components","baseStyle","sizes","solid","ghost","fonts","heading","PageLoader","thickness","HomePage","lazy","BlogPage","PremiumHomePage","PremiumBlogPage","PremiumNotFound","ArticleDetailPage","ActivityDetailPage","ClubPage","PlayerDetailPage","ContactPage","AuthPage","ResetPasswordPage","ActivitiesCalendarPage","SetupPage","StylePreviewPage","NewsletterPreferencesPage","VideosPage","SearchPage","OverlayScoreboardPage","NotFoundPage","I18nTestPage","CookiePolicyPage","ArticlesAdminPage","MatchesAdminPage","PlayersAdminPage","BannersAdminPage","SettingsAdminPage","UsersAdminPage","PrefetchAdminPage","AdminVideosPage","GalleryAdminPage","AdminMerchPage","AdminEshopProductsPage","AdminResetPasswordPage","FilesAdminPage","ContactsAdminPage","PollsAdminPage","AdminDocsPage","MobileScoreboardControlPage","SweepstakesAdminPage","SweepstakeVisualPage","I18nAdminPage","SemiAdminPage","ErrorsAdminPage","ManualFacrAdminPage","ExpensesPage","InvoicesPage","InvoiceSettingsPage","KontaktyPage","TicketAdminPage","AnalyticsInitializer","FontLoader","useFontLoader","fontId","font_heading","font_body","pairing","getFontPairing","require","getDefaultFontPairing","applyFontPairing","PublicRoute","currentPath","AdminRoutesWrapper","Outlet","AdminIndexRoute","HomeRoute","premium","BlogRoute","NotFoundRoute","AppLazy","ChakraProvider","QueryClientProvider","client","Router","ClubThemeProvider","HelmetProvider","Suspense","Routes","Route","ProtectedRoute","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","isLocalhost","registerValidSW","swUrl","serviceWorker","onupdatefound","installingWorker","installing","onstatechange","controller","onUpdate","ErrorBoundary","constructor","super","this","hasError","getDerivedStateFromError","componentDidCatch","errorInfo","componentStack","render","rootElement","_cachedColors","_cachedColors2","_cachedColors3","_cachedColors4","_cachedColors5","_cachedColors6","_cachedColors7","_cachedColors8","documentElement","cachedColors","setProperty","textOnPrimary","textOnSecondary","textOnAccent","ReactDOM","ColorModeScript","getConsent","reportWebVitals","ready","unregister","checkValidServiceWorker","serviceWorkerRegistration","readStored","maybe","withCredentials","csrfTokenCache","isMutating","hasAuth","csrf","csrf_token","getCsrfToken","_metadata","cfg","_error$config","_error$config2","_error$response2$head","_error$response3$head","reqUrl","requestId","_error$config3","isLoginEndpoint","isUploadEndpoint","_metadata2","batchUpdatePageElementConfigs","PREDEFINED_ELEMENTS","FaCube","FaColumns","FaRegClipboard","FaBullseye","FaMapSigns","FaFlag","FaCommentDots","FaBookOpen","FaBroadcastTower","FaPodcast","FaEnvelopeOpenText","FaPhoneAlt","FaHourglassHalf","FaQuestionCircle","FaMapMarkedAlt","FaCalendarCheck","ELEMENT_VARIANTS","hero","merch","banner","testimonials","live","podcast","quiz","ticketing","e2","DEFAULT_STATE","running","fromApi","normalizeFromApi","toApiPayload","getAdminScoreboard","startTimer","pauseTimer","startSecondHalf","absolutize","rawHome","home_logo","HomeLogoURL","rawAway","away_logo","AwayLogoURL","home_name","HomeName","away_name","AwayName","home_short","HomeShort","away_short","AwayShort","PrimaryColor","SecondaryColor","home_text_color","HomeTextColor","away_text_color","AwayTextColor","home_score","away_score","home_fouls","away_fouls","half_length","ExternalMatchID","Timer","sides_flipped","qr_show_every_minutes","qr_show_duration_seconds","_status$intervalMinut","rawOpen","setRawOpen","rawSel","setRawSel","rawLoading","setRawLoading","rawError","setRawError","rawText","setRawText","rawList","rawListError","rawListErrorMsg","fetchRaw","txt","transformResponse","obj","getPrefetchStatus","triggerPrefetch","lastUpdated","nextApproximate","fastMode","intervalMinutes","_rawList$files","toEmbed","idOrUrl","VideosSection","_videos_items","_videos","_settings$videos_limi","setYt","selectedVideo","setSelectedVideo","titleOverrides","videos_title_overrides","hasManualConfigured","videos_items","hasAutoConfigured","social_youtube","videos_module_enabled","videos_source","videos_style","videos_limit","canceled","run","extractVideoId","embedUrl","_embedUrl$split$","manualItems","manual","thumbnail","uploaded_at","videoId","legacy","autoItems","_titleOverrides$v$vid","seen","pushUnique","handlePlayClick","thumb","placeholderBg","placeholderIcon","videoPrimaryColor","AspectRatio","referrerPolicy","fallbackIdx","chain","FaPlay","borderTopColor","HorizontalScroller","allow","allowFullScreen","cols","FONT_PAIRINGS","googleFontsUrl","cssHeading","cssBody","loadGoogleFont","getFontStyleColor","classic","elegant","bold","playful","tech","onPollsChanged","setIsExpanded","selectedPollId","setSelectedPollId","showCreateForm","setShowCreateForm","newPollData","setNewPollData","show_results","require_auth","allow_guest_vote","bgBox","linkedPolls","isLoadingLinked","isLoadingAll","getAdminPolls","linkPollMutation","updateData","related_article_id","related_event_id","updatePoll","pollId","unlinkPollMutation","createPollMutation","createData","pollData","createPoll","resetNewPollForm","linkedPollIds","availablePolls","allAvailablePolls","handleUnlinkPoll","defaultIndex","handleLinkPoll","updateOption","CloseIcon","removeOption","addOption","handleCreatePoll","validOptions","fmt","defaultForm","rules_url","start_at","end_at","picker_style","total_prizes","prize_summary","entry_cost_points","max_entries_per_user","_form$total_prizes","_form$max_entries_per","_prizeForm$quantity","_prizeEditForm$quanti","editingRef","showDraftRecovery","setShowDraftRecovery","pendingDraft","setPendingDraft","prizes","setPrizes","prizeForm","setPrizeForm","kind","savingPrize","setSavingPrize","isPrizeEditOpen","onOpenPrizeEdit","onClosePrizeEdit","editingPrize","setEditingPrize","prizeEditForm","setPrizeEditForm","coverPreview","setCoverPreview","buildPayload","tpRaw","tp","hasDraft","draftAge","ensureCreated","startWait","movePrize","dir","ni","tmp","_entry_cost_points","_max_entries_per_user","openCreateWithDraft","scheduled","locked","finalized","archived","openEditWithDraft","openPrizes","getImageUrl","keepWithinRange","clampValueOnBlur","ArrowUpIcon","ArrowDownIcon","startEditPrize","delPrize","FACR_CLUB_ID","REACT_APP_FACR_CLUB_ID","FACR_CLUB_TYPE","REACT_APP_FACR_CLUB_TYPE","_trackRef$current","_trackRef$current$chi","titleLink","itemsPerView","tablet","desktop","showControls","enableDrag","showUnlimitedBadge","showCategories","showDuration","currentIndex","setCurrentIndex","isDragging","setIsDragging","setStartX","setScrollLeft","getItemsPerView","visibleItems","setVisibleItems","maxIndex","canGoNext","canGoPrev","handleMouseUp","transformValue","FiArrowRight","FiChevronLeft","handlePrev","FiChevronRight","handleNext","pageX","offsetLeft","onMouseUp","onMouseMove","walk","unlimited","_category2","heroArticles","setHeroArticles","latestArticles","setLatestArticles","newsItems","setNewsItems","standingsRows","setStandingsRows","nextCompetitionName","setNextCompetitionName","nextMatchCountdown","setNextMatchCountdown","parseCZDateTime","featuredResp","latestResp","featuredIds","mappedNews","excerpt","clubInfo","tableInfo","_first$table","heroPrimary","spartaSliderArticles","published_at","PremiumLayout","SpartaHorizontalSlider","NextMatch","StandingsCard","NewsList","seeAllHref","seeAllLabel","MerchSection","BANNER_PRESETS","inputBg","imageResolution","setImageResolution","recommendedPlacements","setRecommendedPlacements","getPreset","_resp$total","_resp$data$length","_resp$data","defaultPreset","preset","click_url","isArticleInline","previewWidth","previewHeight","imageLoadPromise","resolution","recommendPlacement","imgWidth","imgHeight","imgAspectRatio","bestMatch","showPassword","setShowPassword","setRemember","setSettings","_location$state2","_location$state2$from","targetFrom","storedTarget","DEFAULT_HISTORY","GLOBAL_KEY","clamp01","parseHex","hasAlpha","hexToHsva","hsvaToHex","hr","hg","hb","ha","rgbaToHex","loadHistory","saveHistory","showEyeDropper","hideHistory","subtleText","hsva","setHsva","setHex","hexInput","setHexInput","isEditingHex","setIsEditingHex","setHistory","eyeDropperAvailable","setEyeDropperAvailable","svRef","latestHsvaRef","EyeDropper","emitChange","nextHsva","addToRecent","nextHex","pushRecentColor","handleSvPointer","_svRef$current","handleSvPointerDown","_setPointerCapture","setPointerCapture","pointerId","move","up","handleHueChange","handleHueChangeEnd","handleAlphaChange","handleAlphaChangeEnd","svBackground","svPointerStyle","alphaPercent","currentHex","backgroundImage","onPointerDown","Slider","onChangeStart","handleHueChangeStart","onChangeEnd","SliderTrack","SliderFilledTrack","SliderThumb","onBlur","handleHexInputBlur","BsEyedropper","eyeDropper","EyeDropperCtor","picked","sRGBHex","pickedHsva","handleSaveManual","pushManualColor","FACR_DATE_FMT","formatMatchDate","isToday","isTomorrow","_aliasesQ$data2","categoryName","hideEmpty","onMatchClick","prefWeekly","setPrefWeekly","prefMatches","setPrefMatches","subscribing","setSubscribing","isAdminRoute","homeTeam","competition_id","__dt","isAfter","_byId$m$home_id","_byId$m$away_id","aliasesQ","resolveAliasName","_aliasesQ$data","normComp","aAlias","aOrig","displayMatches","resolved","nComp","nResolved","fallbackIcon","resolveUrl","L","MAP_STYLES","attribution","mapRef","mapInstanceRef","tileLayerRef","markerRef","isLoaded","setIsLoaded","loadError","setLoadError","integrity","script","loadLeaflet","center","scrollWheelZoom","tileUrl","attr","tileLayer","maxZoom","addTo","customIcon","leaflet","svgIcon","iconUrl","iconSize","iconAnchor","popupAnchor","createCustomMarkerIcon","marker","popupContent","bindPopup","enable","disable","invalidateSize","observer","IntersectionObserver","isIntersecting","ro","ResizeObserver","setView","getZoom","setLatLng","removeLayer","unbindPopup","getLogoStyle","isCircular","isLogoApi","isLogoApiUrl","small","medium","large","getLogoClassName","classes","__teamOverridesCache","__normalize","_imageProps$style","imageProps","setLogoUrl","observeRef","inView","rootMargin","freezeOnceVisible","elementRef","setIsVisible","hasBeenVisible","setHasBeenVisible","entry","useIntersectionObserver","debounceTimeoutRef","fetchLogo","_overrides$by_id","_overrides$by_id$team","loadTeamOverrides","currentClubId","currentClubLogoUrl","appliedByName","normMap","normTeam","getTeamLogo","sizeProps","utilSize","logoStyle","logoClassName","fotbalCzUrl","cachePromise","buildRelatedClubs","ourNameNorm","considerTeam","_team$name","_existing$matches_pla","matchesPlayed","lastPlayedDate","occurredAt","last_played_iso","datePart","timePart","parseDateTime","homeId","awayId","ad","getRelatedClubs","fetchRelatedClubs","scoreMatch","matchedKeywords","totalScore","keyword","keywordIdx","chars","lastIdx","matched","char","charIdx","t0","q0","q1","normalizeName","setParams","initial","matchesPast","matchLimit","setMatchLimit","matchPastLimit","setMatchPastLimit","articleLimit","setArticleLimit","playerLimit","setPlayerLimit","eventLimit","setEventLimit","doSearch","_clubsRes$value","_articlesRes$value","relatedClubsPromise","relatedClubsRes","clubsRes","matchesRes","matchesPastRes","articlesRes","playersRes","eventsRes","sponsorsRes","teamsRes","contactsRes","galleryRes","categoriesRes","facr","scoreText","matchId","allContacts","uncategorized","_res$data5","relatedClubs","relatedById","relatedByName","idKey","nameKey","hasRelatedFilter","related","matchPassesFilter","homeKey","awayKey","matchesData","competition_name","queryMatches","matchesPastData","result_text","baseArticles","_a$category","titleMatch","excerptMatch","contentMatch","categoryMatch","_a$category2","collectTopMatchIds","_item$metadata","topUpcoming","topPast","matchIds","linkedArticlesData","linkedSettled","mapArticle","_a$category3","linkedMapped","linkedUnique","playersData","fullName","nameMatch","positionMatch","eventsData","descMatch","locationMatch","event_date","event_time","sponsorsData","teamsData","shortMatch","short_name","contactsData","emailMatch","galleryData","cover_url","photo_count","categoriesList","searchAll","currentQ","currentS","hasAny","validClubs","qy","FaCalendar","_m$metadata","_m$metadata2","_m$metadata3","_m$metadata4","_m$metadata5","_m$metadata6","_m$metadata7","_m$metadata8","_m$metadata9","_m$metadata0","_m$metadata1","_m$metadata10","_m$metadata11","_m$metadata12","_p$metadata","_e$metadata","_c$metadata","_c$metadata2","FaPhone","_g$metadata","currentYear","shopUrl","setShopUrl","eshop_url","activeSponsors","shouldWrapChildren","FiArrowUpRight","_display_order","_display_order2","bt","trackNavigation","FiMail","getAIUsageStatus","MotionBox","motion","getModelIcon","Globe2","isReasoningModel","initialModelId","onModelChange","onAttachClick","onVoiceClick","models","defaultId","selectedModel","setSelectedModel","usageStatus","setUsageStatus","isLoadingUsage","setIsLoadingUsage","getRemainingToday","modelStatus","setRemaining","textareaRef","innerBg","placeholderColor","isAttachOpen","onAttachOpen","onAttachClose","isVoiceOpen","onVoiceOpen","onVoiceClose","ocrFiles","setOcrFiles","ocrText","setOcrText","isOcrProcessing","setIsOcrProcessing","mediaRecorderRef","mediaStreamRef","audioChunksRef","audioContextRef","analyserRef","animationFrameRef","recordingTimerRef","isRecording","setIsRecording","isVoiceProcessing","setIsVoiceProcessing","hasRecording","setHasRecording","recordingSeconds","setRecordingSeconds","waveform","setWaveform","adjustHeight","fetchUsageStatus","getDailyLimit","trimmed","maybePromise","handleInsertText","stopMediaStream","getTracks","stopRecording","_mediaRecorderRef$cur","resize","_focusVisible","_placeholder","borderBottomRadius","AnimatePresence","animate","FiChevronDown","handleModelChange","FiCheck","FiPaperclip","FiMic","Infinity","FiSend","isImage","document_url","_navigator$mediaDevic","mediaDevices","getUserMedia","stream","audio","AudioCtx","AudioContext","webkitAudioContext","createMediaStreamSource","analyser","createAnalyser","fftSize","connect","bufferLength","frequencyBinCount","dataArray","tick","getByteTimeDomainData","rms","jitter","sin","recorder","MediaRecorder","ondataavailable","onstop","uploadArticleFile","setUsers","selectedUser","setSelectedUser","authUser","editorPages","setEditorPages","loadingEditorPages","setLoadingEditorPages","savingEditorPageId","setSavingEditorPageId","fetchUsers","adminRoots","flattened","loadEditorPages","handleInputChange","resetForm","openEditModal","openCreateModal","errorMsg","errorDetails","minLength","newValue","handleToggleEditorPage","STORE_NAME","dbPromise","initDB","indexedDB","onsuccess","onupgradeneeded","db","objectStoreNames","createObjectStore","keyPath","createIndex","getCachedLogo","transaction","objectStore","saveCachedLogo","tx","oncomplete","updateLastUsed","lastUsed","circuitBreakerState","failures","lastFailureTime","maxFailures","resetTimeout","recordCircuitBreakerFailure","isCircuitBreakerOpen","AbortController","timeoutId","abort","fetchClubNameAndLogoFromAPI","requestStats","successfulRequests","failedRequests","lastResetTime","windowMs","logos","batchPromises","logoApiUrl","useEnglish","uname","_commentsQuery$data","appealBg","adminLikedColor","commentsQuery","useInfiniteQuery","pageParam","getNextPageParam","lastPage","_p$items","allItems","newContent","setNewContent","editingId","setEditingId","editContent","setEditContent","replyTo","setReplyTo","setErrorMsg","canRequestUnban","setCanRequestUnban","unbanMessage","setUnbanMessage","localReactions","setLocalReactions","pendingReactions","setPendingReactions","reactMut","onMutate","qk","cancelQueries","getQueryData","oldData","_next$my_reaction","reactions","prevType","my_reaction","prevCount","newPrev","admin_liked","_err","_vars","_data","_error","cp","unreactMut","_next$my_reaction2","unbanMut","reportMut","canEdit","byParent","ReactionBar","counts","localActive","viewCounts","serverActive","isBusy","renderThread","depth","_user","is_edited","Pencil","content_html","CheckCircle2","hasNextPage","fetchNextPage","isFetchingNextPage","Send","getRembgStatus","internal","setInternal","closeOnEsc","isReadOnly","normalizePhone","adminEmail","setAdminEmail","adminPassword","setAdminPassword","showAdminPassword","setShowAdminPassword","firstName","setFirstName","lastName","setLastName","jwtSecret","setJwtSecret","clubLogoUrl","setClubLogoUrl","uploadingLogo","setUploadingLogo","clubUrl","setClubUrl","clubLink","setClubLink","setPrimaryColor","setSecondaryColor","setAccentColor","setBackgroundColor","setTextColor","frontpageStyle","setFrontpageStyle","themePresets","setThemePresets","selectedPreset","setSelectedPreset","selectedFont","setSelectedFont","mapUrl","setMapUrl","gpsLat","setGpsLat","gpsLng","setGpsLng","setMapStyle","contactStreet","setContactStreet","contactCity","setContactCity","contactPostalCode","setContactPostalCode","contactCountry","setContactCountry","contactPhone","setContactPhone","contactEmail","setContactEmail","smtpUserEdited","setSmtpUserEdited","smtpFromName","setSmtpFromName","testingSMTP","setTestingSMTP","facebookUrl","setFacebookUrl","instagramUrl","setInstagramUrl","youtubeUrl","setYoutubeUrl","galleryUrl","setGalleryUrl","frontendBaseUrl","setFrontendBaseUrl","apiBaseUrl","setApiBaseUrl","isDomainHost","setIsDomainHost","showAdvancedApi","setShowAdvancedApi","apiUrlTouched","setApiUrlTouched","processingLogos","setProcessingLogos","rembgTotal","setRembgTotal","rembgDone","setRembgDone","borderCol","sanitizePassword","isValidEmail","setHasAdmin","isLocal","isIPv4","bgTextContrast","primaryTextContrast","isBgTextAccessible","adminPasswordStrength","hasMinLength","hasUpper","hasLower","hasNumber","hasSpecial","fulfilled","maxScore","selectedFontPairing","fontHeading","fontBody","_FONT_PAIRINGS$find","_FONT_PAIRINGS$find2","cleanPassword","composedFrom","admin_email","admin_password","jwt_secret","club_url","frontend_base_url","api_base_url","frontpage_style","background_color","text_color","contact_country","contact_phone","contact_email","smtp","ab","canonical","allowRembg","_resp$status","_resp$status2","startRembgBatch","started","deadline","s0","done","generateStrongPassword","charAt","clubIdValue","finalClubName","p0","handleSelectClub","extractUuidFromHref","detectClubTypeFromUrl","uploadUrl","logoFd","logoApiErr","onLogoFile","u2","applyPreset","ColorPickerPopover","autofixTextForBg","font","currentZoom","onMapStyleChange","houseNumber","ArcElement","PointElement","LineElement","_selectedPollStats$po","_selectedPollStats$po2","_selectedPollStats$po3","_selectedPollStats$po4","_statsData$votes_by_d","_statsData$votes_by_d2","isStatsOpen","onStatsOpen","onStatsClose","editingPoll","setEditingPoll","selectedPollStats","setSelectedPollStats","loadingVideos","setLoadingVideos","createMutation","updateMutation","deletePoll","isLoadingStats","getPollStats","votesData","isLoadingVotes","getPollVotes","newOptions","currentStyle","desiredStyle","optionsMatch","every","handleOpenCreate","closed","handleViewStats","start_date","end_date","category_id","related_match_id","related_video_url","player_id","handleOpenEdit","NumberInputStepper","NumberIncrementStepper","NumberDecrementStepper","authenticated_votes","guest_votes","votes_by_day","Line","labels","datasets","tension","responsive","plugins","legend","Doughnut","Bar","scales","beginAtZero","ticks","precision","exportVotesCSV","_selectedPollStats$po5","_v$user_id","option_text","user_email","user_first_name","user_last_name","csv","session","roundPercentage","roundPercentages","processed","mmss","handlePauseTimer","handleStartTimer","setConfig","loadUmamiScript","script_url","fetchConfig","trackAnalyticsEvent","scriptUrl","websiteId","defer","isEnabled","umami","track","translations","setTranslations","selectedLanguage","setSelectedLanguage","selectedContext","setSelectedContext","setTotal","setCurrentPage","pageSize","isLangModalOpen","onLangModalOpen","onLangModalClose","isTransModalOpen","onTransModalOpen","onTransModalClose","editingItem","setEditingItem","fetchTranslations","filteredTranslations","FaPlus","FaEdit","FaTrash","deleteLanguage","deleteTranslation","defaultValue","languageData","saveLanguage","translationData","saveTranslation","normalizePlayer","_p$team$id","_p$team","_p$Team","_p$team$id2","_p$team2","_p$Team2","_ref14","_p$team$name","_p$team3","_p$Team3","_p$Team4","Team","getPlayer","_window","_window$location","site_base_url","requiresId","setSaveStatus","setLastSaved","setHasDraft","setDraftAge","saveTimerRef","lastLocalDataRef","lastBackendDataRef","isSavingRef","lastDataObjRef","localSaveTimerRef","saveToLocalStorage","saveToBackend","dataString","STYLE_OPTIONS","MOCK_CLUB_DATA","maps","opponent","_STYLE_OPTIONS$find","_STYLE_OPTIONS$find2","setSelectedStyle","handleSelectStyle","feature","handleContinue","_storage_warn_thresho2","_storage_critical_thr2","_finished_match_displ","_smtp_port","testing","setTesting","umamiWebsiteId","setUmamiWebsiteId","umamiDomain","setUmamiDomain","umamiName","setUmamiName","umamiInitializing","setUmamiInitializing","storage_warn_threshold","storage_critical_threshold","tabMap","changed","handleSeoChange","handleNumChange","handleBoolChange","handleSelectChange","_storage_warn_thresho","_storage_critical_thr","smtp_host","smtp_port","smtp_user","smtp_password","smtp_from","smtp_from_name","smtp_encryption","smtp_auth","smtp_skip_verify","map_zoom_level","show_map_on_homepage","finished_match_display_days","error_review_ingest_token","defaults","ingestToken","presetStorageThresholds","maxFileSizeMB","isAuthError","domain","og_type","twitter_card","twitter_site","FaLightbulb","FaPhotoVideo","FaListOl","activeId","setActiveId","boundingClientRect","scrollIntoView","block","tocActiveColor","tocActiveBg","SectionHeader","scrollMarginTop","copyDeepLink","pushState","FaBolt","FaArrowUp","FaClipboardList","OrderedList","Accordion","allowToggle","AccordionItem","AccordionButton","_expanded","AccordionIcon","AccordionPanel","FaCheckCircle","FaPaintBrush","allowMultiple","onRowClick","safe","sortKey","setSortKey","setSortOrder","getTeam","_r$team$name","getRank","_a$played","_b$played","_a$wins","_b$wins","_a$draws","_b$draws","_a$losses","_b$losses","_a$points","_b$points","borderCollapse","borderSpacing","_team","_row$position","_played","_wins","_draws","_losses","_score","_points","teamNameRaw","rightAction","autoScroll","autoSpeed","rewindLoop","pauseOnHover","infiniteScroll","isHovering","setIsHovering","isPointerDownRef","startXRef","startScrollLeftRef","hasDraggedRef","rafIdRef","scrollBy","scrollSnapType","halfWidth","scrollWidth","atEnd","touches","onTouchMove","onTouchEnd","BlogCard","imageH","LinkBox","_data$pages","_featuredQ$data","featuredQ","allPages","loaded","_p$data","sentinelRef","io","primaryFeatured","secondaryFeatured","GridItem","templateRows","sleep","normStr","buildUpdatePayload","normalizeAttachments","galleryIds","normalizeGalleryIds","gallery_photo_ids","og_image_url","gallery_album_id","gallery_album_url","youtube_video_id","youtube_video_title","youtube_video_url","youtube_video_thumbnail","saveArticleReliable","isUpdate","payloadU","payloadC","buildCreatePayload","lastErr","attempt","_saved","onPhotosSelected","setAlbumLink","selectedPhotos","setSelectedPhotos","setVisibleCount","handleFetchAlbum","mappedPhotos","onKeyPress","Download","isIndeterminate","handleSelectAll","photoId","newSelected","togglePhoto","BlogTranslator","MatchLinkBadge","_linkQ$data","linkQ","facrQ","linkHrefRaw","linkHref","normalizeFacrLink","makeSlug","_existingSelectedAlbu","_existingSelectedAlbu2","_existingSelectedAlbu4","_existingSelectedAlbu5","setSearch","manualSaveInProgress","setManualSaveInProgress","lastContentChangeAt","setLastContentChangeAt","isContentTyping","setIsContentTyping","competition_code","setMatchOptions","aiMinWords","setAiMinWords","aiMinWordsInput","setAiMinWordsInput","featSwitchLoading","setFeatSwitchLoading","setAliasesList","linkedMatchId","setLinkedMatchId","linkedMatchTitle","setLinkedMatchTitle","matchIdInput","setMatchIdInput","matchOptions","matchSearch","setMatchSearch","activeTabIndex","setActiveTabIndex","matchDateFilter","setMatchDateFilter","tempMatchLink","setTempMatchLink","zAlbumLink","setZAlbumLink","zAlbumPhotos","setZAlbumPhotos","zLoading","setZLoading","albumPickerOpen","setAlbumPickerOpen","isAlbumPickerOpen","onAlbumPickerOpen","onAlbumPickerClose","isGalleryPickerOpen","onGalleryPickerOpen","onGalleryPickerClose","cachedAlbums","setCachedAlbums","galleryLoading","setGalleryLoading","galleryExpandedAlbumId","setGalleryExpandedAlbumId","galleryVisibleCount","setGalleryVisibleCount","youtubeVideos","setYoutubeVideos","youtubeLoading","setYoutubeLoading","youtubeSearch","setYoutubeSearch","youtubeManualInput","setYoutubeManualInput","isYouTubeModalOpen","onYouTubeModalOpen","onYouTubeModalClose","isExistingAlbumsOpen","onExistingAlbumsOpen","onExistingAlbumsClose","zVisibleCount","setZVisibleCount","existingSelectedAlbum","setExistingSelectedAlbum","existingSelectedPhotos","setExistingSelectedPhotos","existingVisibleCount","setExistingVisibleCount","autosaveData","__autosaveTs","_title","fetchCachedGallery","albumsUrl","withPhotos","byAlbum","normPhotos","ph","fetchYouTubeVideos","filteredYoutubeVideos","handleSelectYoutubeVideo","handleClearYoutubeVideo","handleGenerateMainImage","_settingsQ$data","_settingsQ$data2","_settingsQ$data3","handleManualYoutubeSubmit","idCandidate","vParam","parseYoutubeVideoId","pickZoneramaImage","shouldUpdateAlbumUrl","handleAlbumPhotosSelected","albumInfo","isFromExistingGallery","currentContent","photosHTML","finalAlbumUrl","_albumInfo$photos","fetchAlbumByLink","_data$albums$","filteredMatchOptions","catRaw","selectedCodes","compNorm","compAlias","toAlias","parseTime","mi","tb","da","aUpcoming","aiMut","effective","htmlGuidelines","finalPrompt","aiTitle","aiSlug","aiHtml","_e$response4","_e$response4$data","handleDeleteArticle","_e$response5","_e$response5$data","_e$response6","_e$response6$data","_e$response7","_e$response7$data","_article$id","idValue","matchBgSelected","matchBgDefault","matchHoverBg","albumLinkHasPhotosBg","albumCardBg","alreadyFeatured","oldest","_e$response9","_e$response9$data","handleListFeaturedToggle","_match_link","match_link","handleQuickTranslate","Slug","inputMode","digits","handleTitleChange","slugModified","handleSlugChange","currentIsFeatured","_e$response8","_e$response8$data","handleFeaturedToggle","_e$response0","_e$response0$data","isPersisted","isTempSelected","matchDate","isValidDate","FiVideo","FiX","AlbumPhotoPicker","_album$photos","_existingSelectedAlbu3","_existingSelectedAlbu6","TOKEN_KEY","HAS_ADMIN_KEY","_localStorage$getItem","sessionStorage","setToken","_data$hasAdmin","exists","hasAdmin","has_admin","temperature","feelsLike","wind","pressure","precipitation","chanceOfRain","chanceOfSnow","atMatchTime","weatherUnavailable","forecastNotAvailable","tooFarInFuture","matchInPast","weatherData","match_datetime","errorString","closest_hour","matchIcon","will_it_rain","chance_of_rain","will_it_snow","chance_of_snow","toIsoDate","monthNamesCs","weekdayLabelsCs","PRESETS","buildPresets","todayIso","lastNDays","getRange","thisWeek","monday","sunday","endOfWeek","next30Days","thisMonth","endOfMonth","last3Months","last12Months","thisYear","viewDate","setViewDate","draftFrom","setDraftFrom","draftTo","setDraftTo","hoverDate","setHoverDate","activePanel","setActivePanel","yearPageStart","setYearPageStart","sideBg","sideActiveBg","sideActiveColor","dayBgSelected","dayBgInRange","dayTextSelected","dayTextSubtle","triggerBg","triggerHoverBg","triggerBorderColor","rangeLabel","handleDayClick","currentRange","monthStart","monthEnd","calendarStart","calendarEnd","calendarDays","yearOptions","selectedReferenceDate","selectedMonth","daysInSelectedMonth","getDaysInMonth","headerDayLabel","headerYear","headerMonthName","CalendarIcon","orientation","subMonths","week","wi","isOutside","isSelectedStart","isSameDay","isSelectedEnd","roundedLeft","roundedRight","isWithinInterval","baseColor","setYear","setMonth","dayNum","applyDraft","nextFrom","nextTo","shade","styleBlock","cssVars","MyClubOverlay","modalBg","VideoCard","openVideo","DEFAULT_THEME","isDarkMode","faviconUrl","layout","onTeamClick","kickoffIso","dPart","tPart","formatWhen","ourGoals","oppGoals","dateObj","parsed1","parsed2","showPreview","previewBg","tipsBg","tipsBorder","secondaryText","selectBg","styleKey","ContactMap","parseMapUrl","normalizedUrl","mapyCzResult","urlObj","xParam","yParam","zParam","qParam","parseMapyCzUrl","googleMapsResult","pathMatch","placeMatch","coordMatch","dataMatch","parseGoogleMapsUrl","urlInput","setUrlInput","setParsedData","previewCoords","setPreviewCoords","FiMapPin","addressDetails","addr","display_name","road","pedestrian","footway","house_number","town","village","municipality","postcode","reverseGeocode","enrichedResult","handleImport","handleClear","MapStyleSelector","NOMINATIM_BASE_URL","REACT_APP_NOMINATIM_URL","NOMINATIM_EMAIL","REACT_APP_NOMINATIM_EMAIL","geocodeCache","HStackWithSpinner","setCoords","lon","endpoint","Accept","geocodeLocation","encodedQuery","openStreetMapUrl","googleMapsUrl","mapyCzUrl","contentRef","umamiTrackEvent","toAbsoluteUploads","_m","p2","q3","getYouTubeEmbedUrl","watchMatch","embedMatch","mutedText","linkColor","linkHoverColor","blockquoteText","blockquoteBg","InstagramGeneratorButton","frameBorder","EventLocationMap","EmbeddedPoll","_att$mime_type","showInline","setConfirm","setIsTranslating","setTranslationError","_settings$location_la","_settings$location_lo","_settings$map_zoom_le","bgMain","setContacts","selectedContact","setSelectedContact","isContactModalOpen","setIsContactModalOpen","deleteItem","setDeleteItem","contactForm","setContactForm","uploadingImage","setUploadingImage","savingSettings","setSavingSettings","compAliasMap","setCompAliasMap","loadSettings","categoriesData","facrData","namesSet","names","refreshed","clubCompetitionNames","filteredContactCategories","setNames","openContactModal","handleSettingsChange","_categories$find","FiUser","hasCoordinates","handleDeleteContact","MdSportsSoccer","WEEKDAYS_SHORT","translate","typeColor","toDateKey","setEvents","listHeaderBg","todayHighlightBg","startKey","endKey","pragueToday","dayEvents","defaultTheme","ClubThemeContext","setTheme","settingsKey","explicitPrimary","explicitSecondary","explicitAccent","explicitText","explicitLogo","explicitName","explicitBackground","getClothingAdmin","createClothing","updateClothing","deleteClothing","getStatusDisplay","FiAlertCircle","lastSavedText","getLastSavedText","apiRes","cacheRes","_s$id","fetchSponsors","trackBackendEvent","formName","articleTitle","trackMatchView","trackVideoPlay","videoTitle","trackContactSubmit","onPrev","onNext","elementProps","sent","setSent","listManualCompetitions","isManualFacrMode","REACT_APP_MANUAL_FACR_MODE","external_id","team_count","bulkCompetitionLine","setBulkCompetitionLine","matchesJson","setMatchesJson","tablesJson","setTablesJson","importingMatchesJson","setImportingMatchesJson","importingTablesJson","setImportingTablesJson","templateKind","setTemplateKind","isTemplateHelpOpen","openTemplateHelp","closeTemplateHelp","upsertMutation","_form$team_count","updateManualCompetition","createManualCompetition","deleteManualCompetition","handleDownload","getMatchesTemplateUrl","getTablesTemplateUrl","handleBulkCompetitionApply","teamCount","tokens","parseBulkCompetitionLine","_parsed$teamCount","FiUpload","imported","importManualMatchesJSON","UnorderedList","importManualMatches","importManualTables","importManualTablesJSON","table_link","fillFormFromCompetition","handleDeleteCompetition","getSortPriority","isMuzi","uNumber","extractUNumber","compareCategories","aText","bText","aPriority","bPriority","orderField","bgSize","bgPos","toggleColorMode","MoonIcon","SunIcon","getProfile","patchProfile","patchAvatar","getLeaderboard","getMyTransactions","articleRead","videosSource","videosEnabled","setVideosEnabled","isAddOpen","onOpenAdd","onCloseAdd","channelInput","setChannelInput","ytLoading","setYtLoading","ytError","setYtError","ytVideos","setYtVideos","selectedIds","setSelectedIds","autoVideos","setAutoVideos","autoLoading","setAutoLoading","autoError","setAutoError","setTitleOverrides","directUrl","setDirectUrl","didBackfill","setDidBackfill","hasChannel","ytUrl","getTitleFromUrl","missing","combinedAutoPreview","_u$split$","auto","KEY","getThumbFromUrl","_u$split$2","_titleOverrides$it$vi","_titleOverrides$it$vi2","_titleOverrides$it$vi3","_items$find$title","_items$find","addDirectLink","channel","importSelected","toggleSelect","DEFAULT_MAX_MB","onUrlImport","setFiles","uploading","setUploading","setProgress","fileInputRef","dropBg","listHoverBg","formatSize","doUpload","defaultUploadFile","handleFiles","maxBytes","validFiles","newlyUploaded","uf","handleUrlSubmit","FiUploadCloud","borderStyle","_fileInputRef$current","onDrop","_e$dataTransfer$files","onDragLeave","IconComp","FiImage","removeFile","FiLink2","_len","_key","fullBleed","tagline","fmtDate","SweepstakeWidget","joining","setJoining","playing","setPlaying","playedRef","sweepstake","winners","isLogged","iWon","myId","hasEntered","has_entered","canEnter","can_enter","visual_played_at","animation","prize_name","BannerDisplay","BlogCardsScroller","BlogSwiper","PollsWidget","GallerySection","MyUIbrixStyleEditor","MyUIbrixErrorBoundary","MatchesSlider","setNews","setMatches","setCountdown","setClubLogo","activeComp","setActiveComp","sponsorLayout","setSponsorLayout","setGalleryLabel","sponsorsTheme","setSponsorsTheme","unifiedCategory","setUnifiedCategory","heroStyle","setHeroStyle","proHeroIndex","setProHeroIndex","edgeHeroIndex","setEdgeHeroIndex","showEdgeTop","setShowEdgeTop","edgeRoleIdx","setEdgeRoleIdx","matchesTab","setMatchesTab","nextCompIdx","setNextCompIdx","nextMatchLink","setNextMatchLink","sidebarTop","setSidebarTop","setPlayers","setBanners","setFeatured","setVideos","videosRich","setVideosRich","merchItems","setMerchItems","merchEnabled","setMerchEnabled","setUpcomingEvents","activitiesLoaded","setActivitiesLoaded","setDefer","setIsEditingMode","configLoading","stylePack","requestIdleCallback","updateTop","hdr","heroFallbackArticles","upcomingCompIndices","hasUpcoming","articlesJSON","matchesJSON","matchesApiJSON","matchesPastApiJSON","_a$id","_a$title","_a$excerpt","_a$content","_a$content$slice","_a$imageUrl","_a$createdAt","_a$category$name","_a$slug","cover","publishedAt","urlSlug","seoSlug","normed","scoreOverrideMap","addScores","sc","_comps$","awayTeam","isHome","parseDT","fourteenDaysInMs","minDate","maxDate","filteredMatches","__ts","_ref28","compMatches","_m$id","_m$homeTeam","_m$awayTeam","_m$competition","_ref15","_ref16","_m$date","_ref17","_ref18","_m$time","_m$venue","_ref19","_m$isHome","_ref20","_ref21","_ref22","_ref23","_m$homeLogoURL","_ref24","_ref25","_ref26","_ref27","_m$awayLogoURL","kickoffDate","kickoff_date","kickoffTime","kickoff_time","is_home","mapMatches","_settingsJSON$homepag","_settingsJSON$homepag2","_settingsJSON$homepag3","siteName","logoURL","mappedPlayers","apiGetPlayers","apiGetSponsors","mappedBanners","apiGetBanners","top3","_a$id2","_read_time","_view_count","readTime","estimated_read_minutes","viewCount","read_count","heroKeys","regularResp","apiGetArticles","allRegular","_a$id3","_read_time2","_view_count2","nonFeatured","e_shop_url","hs","hero_style","frontpage_hero_style","sponsorPref","sponsors_layout","sponsorsLayout","sTheme","sponsors_theme","merch_module_enabled","merch_items","_m$id2","_amap$c$code4","sortedTables","getNextKickoff","_future$","getUpcomingForComp","secs","ClubHeroTopbar","fallbackArticles","_items$map$filter$sor2","effectiveIndex","prevIdx","nextIdx","handleNextMatchClick","_future$2","activeIndex","onActiveChange","contentVisibility","containIntrinsicSize","currentCompetition","currentCompetitionName","matchingStanding","hasStandingsForCurrentTab","newsVariant","showNews","showTable","_ref41","_ref42","_ref43","_ref44","_position","_ref45","_ref46","_ref47","_ref48","_ref49","ActivitiesList","zoneramaUrl","featuredOnly","standard","ordered","renderPyramid","capacities","takeRows","capIndex","cap","lastCap","generalRows","standardRows","MatchModal","replaceState","czYears","normalizeTel","_data$team","calculateAge","hasContact","getCountryFlag","translateNationality","emptyText","emptyTextFinal","seeAllLabelFinal","progressColor","getTimeRemaining","closeOnOverlayClick","venue_override","date_time_edit","score_override","origDateLocal","setOrigDateLocal","teamFilter","setTeamFilter","dateFrom","setDateFrom","dateTo","setDateTo","competitionFilter","setCompetitionFilter","sideFilter","setSideFilter","normalizedTeam","formatDisplayDate","facrClubInfo","clubNorm","clubStrip","teamMatchesClub","compAliases","competitionOptions","competitionMap","foundAlias","a1","a2","dtStr","setPageSize","setSearchParams","spTeam","spFrom","spTo","spComp","spSide","spSize","spLimit","side","visibleMatches","isDateInvalid","saveMutation","_selected$match_id","currentVenue","currentScore","facrStr","localStr","pad","drawerSize","canScrollLeft","setCanScrollLeft","canScrollRight","setCanScrollRight","showScrollHint","setShowScrollHint","lastXRef","lastTimeRef","velocityRef","animationRef","scrollRaf","updateScrollShadow","headerBg","headerText","edgeGradientLeft","edgeGradientRight","pastMatchBg","futureMatchBg","pastMatchHoverBg","futureMatchHoverBg","exportCsv","escape","handleMouseLeave","velocity","applyMomentum","timeDelta","currentX","distance","touch","handleTouchEnd","willChange","overscrollBehaviorX","touchAction","backgroundClip","dateTimeStr","dOnly","isMatchPast","emptyItem","PreviewCard","updateField","addItem","newItem","saveItem","TRANSLATE_API_URL","translateText","alternatives","titleResult","contentResult","translatedText","refreshing","setRefreshing","onAddOpen","onAddClose","setAlbumUrl","setPhotoLimit","adding","setAdding","synthesized","handleRefresh","totalPhotos","totalViews","Plus","RefreshCw","_winners$revealIndex","setVariant","confettiOn","setConfettiOn","soundOn","setSoundOn","revealIndex","setRevealIndex","currentIdx","setCurrentIdx","timerRef","wheelAngle","setWheelAngle","railRef","stripItems","setStripItems","scrollPx","setScrollPx","rouletteKey","setRouletteKey","weightingOn","setWeightingOn","speed","setSpeed","drama","setDrama","transitionMs","setTransitionMs","targetUserId","beep","createOscillator","createGain","frequency","gain","exponentialRampToValueAtTime","fireConfetti","startCycler","steps","loop","maxWarmup","decelStart","onStart","startRoulette","uniqueMap","pool","rnd","targetEntry","tailPad","rail","cardW","itemSize","dramaFactor","extra","mul","revealAll","setRevealAll","shownWinners","onFullscreen","requestFullscreen","replaceAll","flexDir","claim_status","_galleryAlbumQuery$da3","_matchLinkQuery$data","_matchLinkQuery$data2","_matchLinkQuery$data5","_matchLinkQuery$data7","_category3","_latestArticlesQuery$","_latestArticlesQuery$2","_latestArticlesQuery$3","_category7","_matchLinkQuery$data8","_matchLinkQuery$data9","_matchLinkQuery$data0","categoryNameForMatches","fromBackend","competition_alias","videoBg","textMuted","videoTitleColor","galleryBg","galleryBorder","attachmentsBg","miniTodayBg","miniHoverBg","youtubeCommentsBg","isLightboxOpen","setIsLightboxOpen","lightboxImages","setLightboxImages","lightboxIndex","setLightboxIndex","shuffleTick","setShuffleTick","opponentColors","setOpponentColors","isYoutubeOpen","setIsYoutubeOpen","umamiTrackArticleView","safeContentHTML","transformed","galleryAlbumQuery","albumId","photoIds","_payload$albums$","contentImageSources","srcs","uniq","gallerySelectedAndExtra","_galleryAlbumQuery$da","_galleryAlbumQuery$da2","albumPhotos","combinedImageSources","gallerySrcs","openLightboxAtSrc","anchor","onKey","matchLinkQuery","facrMatchQuery","_matchLinkQuery$data3","_matchLinkQuery$data4","umamiTrackMatchView","matchSnapshot","_matchLinkQuery$data6","snap","match_snapshot","_galleryAlbumQuery$da4","_galleryAlbumQuery$da5","articleBanners","sidebarBanners","relatedArticlesQuery","_category4","upcomingEventsQuery","latestArticlesQuery","allMatchesQ","catUpcomingMatches","miniMonthRef","setMiniMonthRef","miniWeeks","miniExpandedKey","setMiniExpandedKey","miniByDate","facrToDateKey","SearchX","toText","ogImageRaw","ogImage","monthParam","headline","datePublished","dateModified","mainEntityOfPage","_category5","_category6","catId","itemListElement","Clock","_category8","_category9","fm","parseFacr","dRaw","Play","_galleryAlbumQuery$da6","_galleryAlbumQuery$da7","gridRow","_relatedArticlesQuery","todayKey","_category0","ChevronLeft","umamiTrackVideoPlay","openCookieSettings","countryCodeToEmoji","setCountries","countryQuery","setCountryQuery","countrySearchRef","countrySelectRef","fuzzyScore","ti","qi","streak","filteredCountries","cca2","tryUrls","_c$name","alpha2Code","emoji","compressAndUpload","fr","readFileAsImage","maxDim","toBlob","HEIGHT_MAX","WEIGHT_MAX","dobParts","setDobParts","setDobFromDateStr","maybeSplitName","fn","updateDobPart","formatDobPreview","calculateAgeFromParts","_countrySelectRef$cur","_countrySelectRef$cur2","only","_countrySearchRef$cur","selectedIndex","onPaste","pasted","clipboardData","getData","selectionStart","selectionEnd","setSelectionRange","ln","parseYmd","part","maxDay","yy","ymd","BlogTile","publishedDateStr","fetchPriority","initialCategory","cid","categoryId","setCategoryId","qInput","setQInput","matchInput","setMatchInput","suggestBg","suggestBorder","suggestHoverBg","matchSuggestQ","matchSuggestions","_matchSuggestQ$data","listArticles","isSmUp","useMediaQuery","insertionIndex","pageTitle","pageDesc","Search","fallbackBg","fallbackText","cardBorder","setContactsData","contactsLoading","setContactsLoading","msgFromServer","hasLocation","hasContactInfo","FiPhone","categoryEntries","compNames","useCategories","tabs","hasOthers","persons","codeTranslations","nameTranslations","upperCode","lowerName","englishName","czechName","nameToCode","initialPrefs","setPrefs","codes","saveMut","unsubMut","setAll","Spacer","toggleCode","buttonOnly","fileName","dot","ext","keep","shortenName","mime","fileInfo","canPreview","FiMusic","sizeKB","sizeMB","sizeStr","about_html","_prof$points","splitName","isSaving","setIsSaving","prefsToken","setPrefsToken","loadProfile","setLoadingProf","setProf","setUsernameEdit","setLoadingRewards","setRewards","loadRewards","setTxLoading","setTxItems","setAchLoading","setAchItems","onRefresh","prefsUrl","txLoading","txItems","achLoading","achItems","winsLoading","setWinsLoading","setWins","prof","loadingProf","loadingRewards","usernameEdit","usernameEditing","setUsernameEditing","levelInfo","currentBase","nextBase","totalToL","nextInc","totalToNext","inLevel","baseNameColor","nameColor","Upload","triggerUpload","avatar_upload_unlocked","panel","absolute_url","minChildWidth","achieved_at","getUnusedFiles","getDuplicateFiles","getStorageUsage","deleteFile","fileId","force","scanAndSyncFiles","refreshFileTracking","entityType","entity_type","formatFileSize","_selectedFile$mime_ty","_deleteTarget$usage_c","mimeFilter","setMimeFilter","selectedFile","setSelectedFile","deleteTarget","setDeleteTarget","forceDelete","setForceDelete","scanResult","setScanResult","refreshResult","setRefreshResult","isBulkDeletingUnused","setIsBulkDeletingUnused","isBulkDeletingDuplicates","setIsBulkDeletingDuplicates","isUsagesOpen","onUsagesOpen","onUsagesClose","isScanResultOpen","onScanResultOpen","onScanResultClose","isRefreshResultOpen","onRefreshResultOpen","onRefreshResultClose","bgHover","hasAutoSyncedRef","allFiles","getAllFiles","unusedFiles","duplicateFiles","storageUsage","scanMutation","refreshTrackingMutation","mimeTypes","baseType","FileRow","_file$mime_type","_file$mime_type2","showUsageCount","file_path","file_size","usage_count","handleViewUsages","duplicateGroups","FiRefreshCw","used_bytes","quota_bytes","failed","toDelete","_f$usage_count","skipped","_f$usage_count2","usages","usage","_usage$entity_info","_usage$entity_info2","_usage$entity_info3","entity_info","entity_id","field_name","confirmDelete","found_files","new_files","skipped_files","orphaned_files","new_files_list","orphaned_list","articles_scanned","events_scanned","players_scanned","sponsors_scanned","contacts_scanned","teams_scanned"],"sourceRoot":""}