%%{init: { 'theme': 'base', 'securityLevel': 'loose', 'flowchart': { 'curve': 'linear', 'useMaxWidth': true, 'nodeSpacing': 36, 'rankSpacing': 48 }, 'themeVariables': { 'primaryColor': '#0b5cff', 'primaryTextColor': '#ffffff', 'lineColor': '#64748b', 'tertiaryColor': '#f8fafc', 'fontSize': '12px' }, 'themeCSS': '.edgePath path { stroke-opacity: .6; } .cluster rect { rx:8; ry:8; }' }}%% flowchart TB classDef route stroke:#2563eb,fill:#eff6ff,color:#1e3a8a,stroke-width:1px; classDef page stroke:#0ea5e9,fill:#e0f7ff,color:#0b5cff,stroke-width:1px; classDef layout stroke:#6b7280,fill:#f8fafc,color:#111827,stroke-width:1px; classDef component stroke:#94a3b8,fill:#f1f5f9,color:#111827,stroke-width:1px; classDef svc stroke:#22c55e,fill:#ecfdf5,color:#065f46,stroke-width:1px; classDef adminsvc stroke:#16a34a,fill:#dcfce7,color:#064e3b,stroke-width:1px; classDef hook stroke:#f97316,fill:#fff7ed,color:#9a3412,stroke-width:1px; classDef ctx stroke:#8b5cf6,fill:#f5f3ff,color:#4c1d95,stroke-width:1px; classDef guard stroke:#ef4444,fill:#fef2f2,color:#991b1b,stroke-width:1px; classDef ext stroke:#a855f7,fill:#faf5ff,color:#6b21a8,stroke-width:1px; classDef infra stroke:#0f766e,fill:#ecfeff,color:#155e75,stroke-width:1px; classDef legacy stroke-dasharray:3 3,stroke:#9ca3af,fill:#fafafa,color:#6b7280; %% Routing & Guards subgraph ROUTING [Routing] direction TB pr_admin[ProtectedRoute requiredRole=admin]:::guard pr_editor[ProtectedRoute requiredRole=editor]:::guard subgraph ROUTES [Admin Routes] direction TB r_admin["/admin"]:::route r_docs["/admin/docs"]:::route r_about["/admin/o-klubu"]:::route r_videos["/admin/videa"]:::route r_gallery["/admin/galerie"]:::route r_merch["/admin/obleceni"]:::route r_sponsors["/admin/sponzori"]:::route r_matches["/admin/zapasy"]:::route r_players["/admin/hraci"]:::route r_teams["/admin/tymy"]:::route r_users["/admin/uzivatele"]:::route r_banners["/admin/bannery"]:::route r_messages["/admin/zpravy"]:::route r_settings["/admin/nastaveni"]:::route r_newsletter["/admin/newsletter"]:::route r_polls["/admin/ankety"]:::route r_aliases["/admin/aliasy-soutezi"]:::route r_prefetch["/admin/prefetch"]:::route r_reset["/admin/users/send-reset"]:::route r_score["/admin/scoreboard"]:::route r_score_remote["/admin/scoreboard/remote"]:::route r_analytics["/admin/analytika"]:::route r_shortlinks["/admin/shortlinks"]:::route r_files["/admin/soubory"]:::route r_contacts["/admin/kontakty"]:::route r_nav["/admin/navigace"]:::route r_comments["/admin/komentare"]:::route r_engagement["/admin/engagement"]:::route r_sweep["/admin/sweepstakes"]:::route r_sweep_visual["/admin/sweepstakes/:id/visual"]:::route r_articles["/admin/clanky"]:::route r_activities["/admin/aktivity"]:::route end pr_admin --> r_admin pr_admin --> r_docs pr_admin --> r_about pr_admin --> r_videos pr_admin --> r_gallery pr_admin --> r_merch pr_admin --> r_sponsors pr_admin --> r_matches pr_admin --> r_players pr_admin --> r_teams pr_admin --> r_users pr_admin --> r_banners pr_admin --> r_messages pr_admin --> r_settings pr_admin --> r_newsletter pr_admin --> r_polls pr_admin --> r_aliases pr_admin --> r_prefetch pr_admin --> r_reset pr_admin --> r_score pr_admin --> r_score_remote pr_admin --> r_analytics pr_admin --> r_shortlinks pr_admin --> r_files pr_admin --> r_contacts pr_admin --> r_nav pr_admin --> r_comments pr_admin --> r_engagement pr_admin --> r_sweep pr_admin --> r_sweep_visual pr_editor --> r_articles pr_editor --> r_activities end %% Admin UI Shell subgraph UI [Admin UI Shell] direction TB layout[AdminLayout]:::layout sidebar[AdminSidebar]:::component header[AdminHeader]:::component search[AdminSearchModal]:::component support[AdminSupportButton]:::component auth[AuthContext]:::ctx ups[usePublicSettings]:::hook layout --> sidebar layout --> header layout --> search layout --> support layout --> auth layout --> ups end %% Common Admin Hooks subgraph HOOKS [Common Admin Hooks] direction TB h_adminTable[useAdminTable]:::hook h_autoSave[useAutoSave]:::hook end %% Admin Pages (each includes AdminLayout) subgraph PAGES [Admin Pages] direction TB p_dashboard[AdminDashboardPage]:::page p_docs[AdminDocsPage]:::page p_about[AboutAdminPage]:::page p_videos[AdminVideosPage]:::page p_gallery[GalleryAdminPage]:::page p_merch[AdminMerchPage]:::page p_sponsors[SponsorsAdminPage]:::page p_matches[MatchesAdminPage]:::page p_players[PlayersAdminPage]:::page p_teams[TeamsAdminPage]:::page p_users[UsersAdminPage]:::page p_banners[BannersAdminPage]:::page p_messages[MessagesAdminPage]:::page p_settings[SettingsAdminPage]:::page p_newsletter[NewsletterAdminPage]:::page p_polls[PollsAdminPage]:::page p_aliases[CompetitionAliasesAdminPage]:::page p_prefetch[PrefetchAdminPage]:::page p_reset[AdminResetPasswordPage]:::page p_score[ScoreboardAdminPage]:::page p_score_remote[MobileScoreboardControlPage]:::page p_analytics[AnalyticsAdminPage]:::page p_shortlinks[ShortlinksAdminPage]:::page p_files[FilesAdminPage]:::page p_contacts[ContactsAdminPage]:::page p_nav[NavigationAdminPage]:::page p_comments[CommentsAdminPage]:::page p_engagement[EngagementAdminPage]:::page p_sweep[SweepstakesAdminPage]:::page p_sweep_visual[SweepstakeVisualPage]:::page p_articles[ArticlesAdminPage]:::page p_activities[AdminActivitiesPage]:::page %% Unrouted/Legacy admin pages present in codebase p_devdocs[DevDocsPage]:::legacy p_media[MediaAdminPage]:::legacy p_standings[StandingsAdminPage]:::legacy p_errors[ErrorsAdminPage]:::legacy p_docs_old[AdminDocsPage_Old]:::legacy p_dash_legacy[DashboardPage]:::legacy end %% Route -> Page wiring r_admin --> p_dashboard r_docs --> p_docs r_about --> p_about r_videos --> p_videos r_gallery --> p_gallery r_merch --> p_merch r_sponsors --> p_sponsors r_matches --> p_matches r_players --> p_players r_teams --> p_teams r_users --> p_users r_banners --> p_banners r_messages --> p_messages r_settings --> p_settings r_newsletter --> p_newsletter r_polls --> p_polls r_aliases --> p_aliases r_prefetch --> p_prefetch r_reset --> p_reset r_score --> p_score r_score_remote --> p_score_remote r_analytics --> p_analytics r_shortlinks --> p_shortlinks r_files --> p_files r_contacts --> p_contacts r_nav --> p_nav r_comments --> p_comments r_engagement --> p_engagement r_sweep --> p_sweep r_sweep_visual --> p_sweep_visual r_articles --> p_articles r_activities --> p_activities %% Pages include AdminLayout p_dashboard --> layout p_docs --> layout p_about --> layout p_videos --> layout p_gallery --> layout p_merch --> layout p_sponsors --> layout p_matches --> layout p_players --> layout p_teams --> layout p_users --> layout p_banners --> layout p_messages --> layout p_settings --> layout p_newsletter --> layout p_polls --> layout p_aliases --> layout p_prefetch --> layout p_reset --> layout p_score --> layout p_score_remote --> layout p_analytics --> layout p_shortlinks --> layout p_files --> layout p_contacts --> layout p_nav --> layout p_comments --> layout p_engagement --> layout p_sweep --> layout p_sweep_visual --> layout p_articles --> layout p_activities --> layout %% Services subgraph SERVICES [Service Layer] direction TB s_api["api.ts (Axios + interceptors)"]:::infra s_settings[settings.ts]:::svc s_setup[setup.ts]:::svc s_seo[seo.ts]:::svc s_articles[articles.ts]:::svc s_files[files.ts]:::svc s_navigation[navigation.ts]:::svc s_players[players.ts]:::svc s_polls[polls.ts]:::svc s_shortlinks[shortlinks.ts]:::svc s_banners[banners.ts]:::svc s_clothing[clothing.ts]:::svc s_contacts[contactInfo.ts]:::svc s_comments_pub[comments.ts]:::svc s_events[eventService.ts]:::svc s_image[imageProcessing.ts]:::svc s_scoreboard[scoreboard.ts]:::svc s_sweep[sweepstakes.ts]:::svc s_youtube[youtube.ts]:::svc s_zonerama[zonerama.ts]:::svc s_analytics[analyticsService.ts]:::svc s_errors[errors.ts]:::svc s_facr_cache[facr/cache.ts]:::svc s_facr_api[facr/facrApi.ts]:::svc s_ai[ai.ts]:::svc subgraph ADMIN_APIs [Admin API Modules] direction TB s_admin_comments[admin/comments.ts]:::adminsvc s_admin_msgs[admin/contactMessages.ts]:::adminsvc s_admin_eng[admin/engagement.ts]:::adminsvc s_admin_news[admin/newsletter.ts]:::adminsvc s_admin_prefetch[admin/prefetch.ts]:::adminsvc s_admin_matches[adminMatches.ts]:::adminsvc end end %% External/Integrations subgraph EXTERNAL [External Systems] direction TB x_facr[FAČR API]:::ext x_youtube[YouTube]:::ext x_zonerama[Zonerama]:::ext x_logoapi[logoapi.sportcreative.eu]:::ext x_sportlogos[sportlogos.tdvorak.dev]:::ext x_smtp[SMTP / Email]:::ext x_errrev[Error Review Service]:::ext end %% Infra s_api -->|interceptors, auth, csrf| s_api %% Service <-> External mappings s_youtube --> x_youtube s_zonerama --> x_zonerama s_facr_api --> x_facr s_scoreboard --> x_logoapi s_scoreboard --> x_sportlogos s_admin_news --> x_smtp s_settings --> x_errrev %% Page -> Service dependencies p_dashboard --> s_analytics p_dashboard --> s_facr_cache p_dashboard --> s_api p_docs --> s_api p_about --> s_settings p_about --> s_articles p_about --> s_api p_about --> s_ai p_videos --> s_settings p_videos --> s_admin_prefetch p_videos --> s_youtube p_gallery --> s_api p_gallery --> s_zonerama p_merch --> s_clothing p_sponsors --> s_sponsors p_sponsors --> s_articles p_matches --> s_admin_matches p_matches --> s_settings p_matches --> s_facr_cache p_matches --> s_facr_api p_matches --> s_comp_alias p_players --> s_players p_players --> s_image p_players --> s_articles p_teams --> s_admin_matches p_teams --> s_image p_teams --> s_facr_api p_teams --> s_scoreboard p_users --> s_admin_eng p_users --> s_api p_banners --> s_banners p_banners --> s_articles p_messages --> s_admin_msgs p_settings --> s_settings p_settings --> s_seo p_settings --> s_admin_prefetch p_settings --> s_articles p_newsletter --> s_admin_news p_newsletter --> s_settings p_polls --> s_polls p_polls --> s_categories p_polls --> s_events p_polls --> s_articles p_polls --> s_players p_aliases --> s_comp_alias p_aliases --> s_api p_prefetch --> s_admin_prefetch p_prefetch --> s_api p_reset --> s_api p_score --> s_scoreboard p_score --> s_sponsors p_score_remote --> s_scoreboard p_analytics --> s_analytics p_shortlinks --> s_shortlinks p_files --> s_files p_files --> s_api p_contacts --> s_contacts p_contacts --> s_settings p_contacts --> s_image p_contacts --> s_facr_cache p_nav --> s_navigation p_comments --> s_admin_comments p_comments --> s_comments_pub p_comments --> s_articles p_comments --> s_events p_comments --> s_youtube p_comments --> s_admin_eng p_engagement --> s_admin_eng p_sweep --> s_sweep p_sweep --> s_articles p_sweep_visual --> s_sweep p_sweep_visual --> s_settings p_articles --> s_articles p_articles --> s_youtube p_articles --> s_shortlinks p_articles --> s_zonerama p_articles --> s_settings p_articles --> s_facr_api p_articles --> s_events p_articles --> h_autoSave p_articles --> s_ai p_activities --> s_events p_activities --> s_articles p_activities --> s_youtube p_activities --> s_settings p_activities --> s_shortlinks p_activities --> s_facr_api p_activities --> h_autoSave %% Missing simple aliases for a few symbols referenced above s_sponsors[sponsors.ts]:::svc s_categories[categories.ts]:::svc s_comp_alias[competitionAliases.ts]:::svc %% Legacy pages light mappings p_errors --> s_errors p_errors --> s_settings p_media --> s_files p_media --> s_image p_standings --> s_facr_cache %% UI / Guards dependencies sidebar --> s_navigation sidebar --> s_events sidebar --> s_settings pr_admin --> s_setup pr_editor --> s_setup %% Notes: %% - All admin pages render AdminLayout which composes Sidebar, Header, Search modal and Support button. %% - Guards: routes under /admin require admin unless explicitly editor-accessible (/admin/clanky, /admin/aktivity). %% - Services use Axios instance with interceptors (api.ts), many pages use React Query for data fetching.