%%{init: { 'theme': 'forest', 'flowchart': { 'curve': 'linear' }, 'themeCSS': '.edgePath path { stroke-dasharray: 6 4; animation: dash 16s linear infinite; } @keyframes dash { to { stroke-dashoffset: -1000; } }' }}%% flowchart LR classDef svc fill:#e0f2fe,stroke:#0284c7,color:#0c4a6e; classDef admin fill:#dcfce7,stroke:#16a34a,color:#065f46; classDef pub fill:#f1f5f9,stroke:#334155,color:#0f172a; classDef core fill:#ede9fe,stroke:#7c3aed,color:#4c1d95; api_core["services/api.ts (Axios core)"]:::core subgraph Services direction TB s_settings[settings.ts]:::svc s_page_elements[pageElements.ts]:::svc s_articles[articles.ts]:::svc s_players[players.ts]:::svc s_sponsors[sponsors.ts]:::svc s_banners[banners.ts]:::svc s_comp_alias[competitionAliases.ts]:::svc s_events[eventService.ts]:::svc s_setup[setup.ts]:::svc s_engagement[engagement.ts]:::svc s_action[actionLog.ts]:::svc s_facr[facr/facrApi.ts]:::svc s_files[files.ts]:::svc s_image[imageProcessing.ts]:::svc s_shortlinks[shortlinks.ts]:::svc s_scoreboard[scoreboard.ts]:::svc s_youtube[youtube.ts]:::svc s_zonerama[zonerama.ts]:::svc s_errors[errors.ts]:::svc s_contactInfo[contactInfo.ts]:::svc s_public[public.ts]:::svc s_editor[editorController.ts]:::svc end subgraph AdminAPIs direction TB s_admin_comments[admin/comments.ts]:::admin s_admin_msgs[admin/contactMessages.ts]:::admin s_admin_eng[admin/engagement.ts]:::admin s_admin_news[admin/newsletter.ts]:::admin s_admin_prefetch[admin/prefetch.ts]:::admin s_admin_matches[adminMatches.ts]:::admin end api_core --> Services api_core --> AdminAPIs subgraph PublicEndpoints["Representative public endpoints"] direction TB e_articles["/articles, /articles/slug/:slug, /articles/:id"]:::pub e_featured["/articles/featured"]:::pub e_players["/players, /players/:id"]:::pub e_teams["/teams, /teams/:id"]:::pub e_scores["/matches, /standings, /matches/history"]:::pub e_gallery["/gallery/albums, /gallery/albums/:id"]:::pub e_youtube["/youtube/videos"]:::pub e_settings["/settings"]:::pub e_scoreboard_pub["/scoreboard, /scoreboard/sponsors, /scoreboard/qr"]:::pub e_contact["/contact"]:::pub e_short_pub["/shortlinks/public"]:::pub e_polls["/polls, /polls/:id, /polls/:id/vote, /polls/:id/results"]:::pub end %% Map key services to endpoints s_articles --> e_articles s_articles --> e_featured s_players --> e_players s_settings --> e_settings s_page_elements --> e_settings s_comp_alias --> e_scores s_events --> e_scores s_zonerama --> e_gallery s_youtube --> e_youtube s_scoreboard --> e_scoreboard_pub s_contactInfo --> e_contact s_shortlinks --> e_short_pub s_public --> e_settings subgraph AdminEndpoints["Representative admin endpoints"] direction TB a_settings["/admin/settings"]:::admin a_files["/admin/files"]:::admin a_nav["/admin/navigation, /admin/social-links"]:::admin a_comments["/admin/comments"]:::admin a_msgs["/admin/contact-messages"]:::admin a_news["/admin/newsletter"]:::admin a_matches["/admin/matches"]:::admin a_sweep["/admin/sweepstakes"]:::admin a_scoreboard["/admin/scoreboard"]:::admin a_shortlinks["/admin/shortlinks"]:::admin end s_admin_comments --> a_comments s_admin_msgs --> a_msgs s_admin_eng --> a_settings s_admin_news --> a_news s_admin_prefetch --> a_settings s_admin_matches --> a_matches s_files --> a_files s_navigation[navigation.ts]:::svc --> a_nav s_shortlinks --> a_shortlinks s_scoreboard --> a_scoreboard