# lintaojlu/submarine_cable_information architecture

> Architecture diagram of the GitHub repository lintaojlu/submarine_cable_information, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-06-20). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/lintaojlu/submarine_cable_information
- Repository: https://github.com/lintaojlu/submarine_cable_information

## Overview

1. This repository is a single RedwoodJS web application, not a full client/server app. The architecture is dominated by a static data-driven frontend that renders TeleGeography’s submarine cable map from files in `web/public`.

2. The primary “data layer” is the `web/public/api/v3` tree. It contains prebuilt JSON resources for cables, landing points, countries, suppliers, statuses, ready-for-service years, and search/config metadata. These files are served as static assets from the same origin and are the app’s effective backend.

3. Two GeoJSON datasets are the core map inputs:
   - `web/public/api/v3/cable/cable-geo.json` for cable routes
   - `web/public/api/v3/landing-point/landing-point-geo.json` for landing stations  
   The README explains these were exported from Illustrator/MAPublisher, so the runtime app consumes curated geography rather than querying a live spatial service.

4. `web/src/modules/SubmarineCableMap` is the main visualization subsystem. It is the map engine that likely loads the GeoJSON, draws routes and landing points, and reacts to filters/selections. `ZoomControl` is a supporting map-specific UI component.

5. Application routing is centered in `web/src/Routes.js` and `web/src/App.js`. The app is organized into page-level views for the major lookup dimensions: `HomePage`, `SubmarineCablePage`, `LandingPointPage`, `CountryPage`, `SupplierPage`, `StatusPage`, `ReadyForServicePage`, `MultiselectPage`, plus error handling pages.

6. Shared state is split into three React contexts:
   - `MapContext` for map viewport/interaction state
   - `ResultsContext` for selected results and filtering/output state
   - `SearchContext` for search and multi-select query state  
   These contexts are the main in-app data flow mechanism connecting the map, search, and result panels.

7. The “results/search” experience is a second major subsystem beside the map. Components like `Search`, `Multiselect`, `SelectionList`, `ResultsHeader`, `LandingPointList`, `SubmarineCableList`, `SupplierList`, and `SelectAnotherCable` work together to let users filter the dataset and browse entity lists.

8. Presentation is layered through reusable layouts:
   - `AppLayout` provides the general shell
   - `ResultsLayout` is used for filtered/detail-result views  
   Shared chrome components such as `Header`, `Navigation`, `Share`, `Sponsors`, `About`, and `LastUpdated` sit around the main content and make the app feel like a content product rather than a generic dashboard.

9. The repository is content-heavy and largely static at runtime. Individual entity pages almost certainly render from the JSON documents under `web/public/api/v3/*`, rather than calling external APIs. That means the main data flow is: static JSON → page/context state → map and lists.

10. The `search.json` and the directory-based entity JSON files imply client-side lookup/indexing. In architecture terms, search is not a remote service; it is a static dataset that the frontend can read and transform locally.

11. Styling/build tooling is standard RedwoodJS frontend infrastructure: Babel, Webpack, PostCSS, Tailwind, Jest, Prettier, and Redwood configuration files. These affect how the app is built and tested, but they do not add extra runtime services.

12. From a diagram perspective, the key boundary is between the static public data package and the interactive React app. Everything user-facing flows from those JSON assets into the route/page layer, through contexts, and into the map, lists, and detail views.

Main entry points: [`web/src/layouts/ResultsLayout/ResultsLayout.js`](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/layouts/ResultsLayout/ResultsLayout.js) (Results shell), [`web/src/Routes.js`](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/Routes.js) (Routes), [`web/src/modules/SubmarineCableMap/SubmarineCableMap.js`](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/modules/SubmarineCableMap/SubmarineCableMap.js) (Cable map), [`web/src/layouts/AppLayout/AppLayout.js`](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/layouts/AppLayout/AppLayout.js) (App shell)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_g_public_data["Static data"]
  node_n_data_cable_geo["Cable routes<br/>geojson dataset<br/>[cable-geo.json]"]
  node_n_data_landing_geo["Landing points<br/>geojson dataset"]
  node_n_data_search["Search index<br/>static index<br/>[search.json]"]
  node_n_data_config["Config<br/>metadata<br/>[config.json]"]
  node_n_data_country["Countries<br/>entity dataset"]
  node_n_data_cable["Cables<br/>entity dataset"]
  node_n_data_landing["Landings<br/>entity dataset"]
  node_n_data_status["Statuses<br/>lookup dataset"]
  node_n_data_rfs["RFS years<br/>lookup dataset"]
  node_n_data_supplier["Suppliers<br/>lookup dataset"]
end

subgraph group_g_app_shell["App shell"]
  node_n_app["App<br/>redwood entry<br/>[App.js]"]
  node_n_routes["Routes<br/>router<br/>[Routes.js]"]
  node_n_layout["App shell<br/>layout<br/>[AppLayout.js]"]
  node_n_results_layout["Results shell<br/>layout<br/>[ResultsLayout.js]"]
  node_n_header["Header<br/>chrome<br/>[Header.js]"]
  node_n_navigation["Navigation<br/>chrome<br/>[Navigation.js]"]
  node_n_search_ctx(("Search state<br/>react context<br/>[SearchContext.js]"))
  node_n_results_ctx(("Results state<br/>react context<br/>[ResultsContext.js]"))
  node_n_map_ctx(("Map state<br/>react context<br/>[MapContext.js]"))
end

subgraph group_g_map["Map engine"]
  node_n_map["Cable map<br/>visualization"]
  node_n_zoom["Zoom control<br/>map ui<br/>[ZoomControl.js]"]
end

subgraph group_g_browse["Browse and search"]
  node_n_search["Search<br/>[Search.js]"]
  node_n_multiselect["Multiselect<br/>filter ui<br/>[Multiselect.js]"]
  node_n_selection["Selection list<br/>result ui<br/>[SelectionList.js]"]
  node_n_results_header["Results header<br/>result ui<br/>[ResultsHeader.js]"]
  node_n_cable_list["Cable list<br/>entity list"]
  node_n_landing_list["Landing list<br/>entity list"]
  node_n_supplier_list["Supplier list<br/>entity list<br/>[SupplierList.js]"]
end

subgraph group_g_pages["Entity pages"]
  node_n_home["Home<br/>page<br/>[HomePage.js]"]
  node_n_cable_page["Cable page"]
  node_n_landing_page["Landing page"]
  node_n_country_page["Country page<br/>[CountryPage.js]"]
  node_n_supplier_page["Supplier page<br/>[SupplierPage.js]"]
  node_n_status_page["Status page<br/>[StatusPage.js]"]
end

node_n_app -->|"mounts"| node_n_routes
node_n_app -->|"wraps"| node_n_layout
node_n_layout -->|"includes"| node_n_header
node_n_layout -->|"includes"| node_n_navigation
node_n_routes -->|"routes to"| node_n_home
node_n_routes -->|"routes to"| node_n_cable_page
node_n_routes -->|"routes to"| node_n_landing_page
node_n_routes -->|"routes to"| node_n_country_page
node_n_routes -->|"routes to"| node_n_supplier_page
node_n_routes -->|"routes to"| node_n_status_page
node_n_routes -->|"uses"| node_n_results_layout
node_n_home -->|"renders"| node_n_map
node_n_cable_page -->|"uses"| node_n_results_layout
node_n_landing_page -->|"uses"| node_n_results_layout
node_n_country_page -->|"uses"| node_n_results_layout
node_n_supplier_page -->|"uses"| node_n_results_layout
node_n_status_page -->|"uses"| node_n_results_layout
node_n_results_layout -->|"includes"| node_n_results_header
node_n_results_layout -->|"includes"| node_n_selection
node_n_results_layout -->|"includes"| node_n_cable_list
node_n_results_layout -->|"includes"| node_n_landing_list
node_n_results_layout -->|"includes"| node_n_supplier_list
node_n_search -->|"reads/writes"| node_n_search_ctx
node_n_multiselect -->|"reads/writes"| node_n_search_ctx
node_n_selection -->|"reads/writes"| node_n_results_ctx
node_n_results_header -->|"reads"| node_n_results_ctx
node_n_map -->|"reads/writes"| node_n_map_ctx
node_n_map -->|"reads"| node_n_results_ctx
node_n_map -->|"reads"| node_n_search_ctx
node_n_map -->|"loads"| node_n_data_cable_geo
node_n_map -->|"loads"| node_n_data_landing_geo
node_n_map -->|"includes"| node_n_zoom
node_n_search -->|"loads"| node_n_data_search
node_n_multiselect -->|"loads"| node_n_data_config
node_n_cable_page -->|"loads"| node_n_data_cable
node_n_landing_page -->|"loads"| node_n_data_landing
node_n_country_page -->|"loads"| node_n_data_country
node_n_supplier_page -->|"loads"| node_n_data_supplier
node_n_status_page -->|"loads"| node_n_data_status
node_n_home -->|"loads"| node_n_data_config
node_n_results_layout -->|"loads"| node_n_data_rfs

click node_n_app "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/App.js"
click node_n_routes "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/Routes.js"
click node_n_layout "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/layouts/AppLayout/AppLayout.js"
click node_n_results_layout "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/layouts/ResultsLayout/ResultsLayout.js"
click node_n_header "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/Header/Header.js"
click node_n_navigation "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/Navigation/Navigation.js"
click node_n_search_ctx "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/contexts/SearchContext/SearchContext.js"
click node_n_results_ctx "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/contexts/ResultsContext/ResultsContext.js"
click node_n_map_ctx "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/contexts/MapContext/MapContext.js"
click node_n_map "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/modules/SubmarineCableMap/SubmarineCableMap.js"
click node_n_zoom "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/ZoomControl/ZoomControl.js"
click node_n_search "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/Search/Search.js"
click node_n_multiselect "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/Multiselect/Multiselect.js"
click node_n_selection "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/SelectionList/SelectionList.js"
click node_n_results_header "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/ResultsHeader/ResultsHeader.js"
click node_n_cable_list "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/SubmarineCableList/SubmarineCableList.js"
click node_n_landing_list "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/LandingPointList/LandingPointList.js"
click node_n_supplier_list "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/SupplierList/SupplierList.js"
click node_n_data_cable_geo "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/public/api/v3/cable/cable-geo.json"
click node_n_data_landing_geo "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/public/api/v3/landing-point/landing-point-geo.json"
click node_n_data_search "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/public/api/v3/search.json"
click node_n_data_config "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/public/api/v3/config.json"
click node_n_data_country "https://github.com/lintaojlu/submarine_cable_information/tree/master/web/public/api/v3/country"
click node_n_data_cable "https://github.com/lintaojlu/submarine_cable_information/tree/master/web/public/api/v3/cable"
click node_n_data_landing "https://github.com/lintaojlu/submarine_cable_information/tree/master/web/public/api/v3/landing-point"
click node_n_data_status "https://github.com/lintaojlu/submarine_cable_information/tree/master/web/public/api/v3/status"
click node_n_data_rfs "https://github.com/lintaojlu/submarine_cable_information/tree/master/web/public/api/v3/ready-for-service"
click node_n_data_supplier "https://github.com/lintaojlu/submarine_cable_information/tree/master/web/public/api/v3/supplier"
click node_n_home "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/pages/HomePage/HomePage.js"
click node_n_cable_page "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/pages/SubmarineCablePage/SubmarineCablePage.js"
click node_n_landing_page "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/pages/LandingPointPage/LandingPointPage.js"
click node_n_country_page "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/pages/CountryPage/CountryPage.js"
click node_n_supplier_page "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/pages/SupplierPage/SupplierPage.js"
click node_n_status_page "https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/pages/StatusPage/StatusPage.js"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_n_data_cable_geo,node_n_data_landing_geo,node_n_data_search,node_n_data_config,node_n_data_country,node_n_data_cable,node_n_data_landing,node_n_data_status,node_n_data_rfs,node_n_data_supplier toneBlue
class node_n_app,node_n_routes,node_n_layout,node_n_results_layout,node_n_header,node_n_navigation,node_n_search_ctx,node_n_results_ctx,node_n_map_ctx toneAmber
class node_n_map,node_n_zoom toneMint
class node_n_search,node_n_multiselect,node_n_selection,node_n_results_header,node_n_cable_list,node_n_landing_list,node_n_supplier_list toneRose
class node_n_home,node_n_cable_page,node_n_landing_page,node_n_country_page,node_n_supplier_page,node_n_status_page toneIndigo
```

## Components

### Static data

Prebuilt JSON datasets served from web/public and consumed as the app's effective backend.

- [Cable routes](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/public/api/v3/cable/cable-geo.json): geojson dataset · Curated route geometry for submarine cable paths. · `web/public/api/v3/cable/cable-geo.json`
- [Landing points](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/public/api/v3/landing-point/landing-point-geo.json): geojson dataset · Curated geometry for landing station points. · `web/public/api/v3/landing-point/landing-point-geo.json`
- [Search index](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/public/api/v3/search.json): static index · Client-side search metadata and lookup index. · `web/public/api/v3/search.json`
- [Config](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/public/api/v3/config.json): metadata · Application configuration and dataset metadata. · `web/public/api/v3/config.json`
- [Countries](https://github.com/lintaojlu/submarine_cable_information/tree/master/web/public/api/v3/country): entity dataset · Per-country JSON resources. · `web/public/api/v3/country`
- [Cables](https://github.com/lintaojlu/submarine_cable_information/tree/master/web/public/api/v3/cable): entity dataset · Per-cable JSON resources. · `web/public/api/v3/cable`
- [Landings](https://github.com/lintaojlu/submarine_cable_information/tree/master/web/public/api/v3/landing-point): entity dataset · Per-landing-point JSON resources. · `web/public/api/v3/landing-point`
- [Statuses](https://github.com/lintaojlu/submarine_cable_information/tree/master/web/public/api/v3/status): lookup dataset · Status lookup resources such as in-service and planned. · `web/public/api/v3/status`
- [RFS years](https://github.com/lintaojlu/submarine_cable_information/tree/master/web/public/api/v3/ready-for-service): lookup dataset · Ready-for-service year buckets. · `web/public/api/v3/ready-for-service`
- [Suppliers](https://github.com/lintaojlu/submarine_cable_information/tree/master/web/public/api/v3/supplier): lookup dataset · Supplier lookup resources. · `web/public/api/v3/supplier`

### App shell

RedwoodJS entrypoints, routing, layouts, and shared chrome.

- [App](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/App.js): redwood entry · Top-level application composition and providers. · `web/src/App.js`
- [Routes](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/Routes.js): router · Route definitions and page wiring. · `web/src/Routes.js`
- [App shell](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/layouts/AppLayout/AppLayout.js): layout · Global page chrome and application framing. · `web/src/layouts/AppLayout/AppLayout.js`
- [Results shell](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/layouts/ResultsLayout/ResultsLayout.js): layout · Layout for filtered and detail-result views. · `web/src/layouts/ResultsLayout/ResultsLayout.js`
- [Header](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/Header/Header.js): chrome · Top-level branding and navigation entry point. · `web/src/components/Header/Header.js`
- [Navigation](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/Navigation/Navigation.js): chrome · Primary site navigation. · `web/src/components/Navigation/Navigation.js`
- [Search state](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/contexts/SearchContext/SearchContext.js): react context · Search and multiselect query state. · `web/src/contexts/SearchContext/SearchContext.js`
- [Results state](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/contexts/ResultsContext/ResultsContext.js): react context · Selected results and filtering/output state. · `web/src/contexts/ResultsContext/ResultsContext.js`
- [Map state](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/contexts/MapContext/MapContext.js): react context · Viewport and map interaction state. · `web/src/contexts/MapContext/MapContext.js`

### Map engine

The submarine cable visualization subsystem and its viewport controls.

- [Cable map](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/modules/SubmarineCableMap/SubmarineCableMap.js): visualization · Main map renderer for routes, landing points, and selection reactions. · `web/src/modules/SubmarineCableMap/SubmarineCableMap.js`
- [Zoom control](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/ZoomControl/ZoomControl.js): map ui · Map-specific zoom interaction control. · `web/src/components/ZoomControl/ZoomControl.js`

### Browse and search

Filtering, selection, and list-based result exploration.

- [Search](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/Search/Search.js): search ui · Dataset search interface. · `web/src/components/Search/Search.js`
- [Multiselect](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/Multiselect/Multiselect.js): filter ui · Multi-entity selection and query builder. · `web/src/components/Multiselect/Multiselect.js`
- [Selection list](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/SelectionList/SelectionList.js): result ui · Current selected items and removals. · `web/src/components/SelectionList/SelectionList.js`
- [Results header](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/ResultsHeader/ResultsHeader.js): result ui · Controls and summary for result views. · `web/src/components/ResultsHeader/ResultsHeader.js`
- [Cable list](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/SubmarineCableList/SubmarineCableList.js): entity list · Browseable list of submarine cables. · `web/src/components/SubmarineCableList/SubmarineCableList.js`
- [Landing list](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/LandingPointList/LandingPointList.js): entity list · Browseable list of landing points. · `web/src/components/LandingPointList/LandingPointList.js`
- [Supplier list](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/components/SupplierList/SupplierList.js): entity list · Browseable list of suppliers. · `web/src/components/SupplierList/SupplierList.js`

### Entity pages

Route-level views for the major lookup dimensions and error states.

- [Home](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/pages/HomePage/HomePage.js): page · Landing page and main entry into the map/product experience. · `web/src/pages/HomePage/HomePage.js`
- [Cable page](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/pages/SubmarineCablePage/SubmarineCablePage.js): page · Cable detail and browsing view. · `web/src/pages/SubmarineCablePage/SubmarineCablePage.js`
- [Landing page](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/pages/LandingPointPage/LandingPointPage.js): page · Landing point detail and browsing view. · `web/src/pages/LandingPointPage/LandingPointPage.js`
- [Country page](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/pages/CountryPage/CountryPage.js): page · Country detail and browsing view. · `web/src/pages/CountryPage/CountryPage.js`
- [Supplier page](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/pages/SupplierPage/SupplierPage.js): page · Supplier detail and browsing view. · `web/src/pages/SupplierPage/SupplierPage.js`
- [Status page](https://github.com/lintaojlu/submarine_cable_information/blob/master/web/src/pages/StatusPage/StatusPage.js): page · Status-based browsing view. · `web/src/pages/StatusPage/StatusPage.js`

## Connections

- App → Routes: mounts · App composition hands off to route wiring.
- App → App shell: wraps · Global shell frames the routed content.
- App shell → Header: includes · Shell renders header chrome.
- App shell → Navigation: includes · Shell renders primary navigation.
- Routes → Home: routes to · Home is a primary entry page.
- Routes → Cable page: routes to · Cable detail route.
- Routes → Landing page: routes to · Landing point detail route.
- Routes → Country page: routes to · Country route.
- Routes → Supplier page: routes to · Supplier route.
- Routes → Status page: routes to · Status route.
- Routes → Results shell: uses · Filtered/detail routes share the results layout.
- Home → Cable map: renders · Home centers the interactive cable map.
- Cable page → Results shell: uses · Cable detail view uses the results shell.
- Landing page → Results shell: uses · Landing point detail view uses the results shell.
- Country page → Results shell: uses · Country detail view uses the results shell.
- Supplier page → Results shell: uses · Supplier detail view uses the results shell.
- Status page → Results shell: uses · Status browsing view uses the results shell.
- Results shell → Results header: includes · Result shell provides summary and controls.
- Results shell → Selection list: includes · Selected items panel is part of result views.
- Results shell → Cable list: includes · Cable browsing is part of result views.
- Results shell → Landing list: includes · Landing browsing is part of result views.
- Results shell → Supplier list: includes · Supplier browsing is part of result views.
- Search → Search state: reads/writes · Search UI drives query state.
- Multiselect → Search state: reads/writes · Multiselect UI shares query state.
- Selection list → Results state: reads/writes · Selection management updates results state.
- Results header → Results state: reads · Header summarizes filtered result state.
- Cable map → Map state: reads/writes · Map engine owns viewport and interaction state.
- Cable map → Results state: reads · Map reacts to selections and filter output.
- Cable map → Search state: reads · Map can respond to search/multiselect state.
- Cable map → Cable routes: loads · Cable geometry is a primary map input.
- Cable map → Landing points: loads · Landing point geometry is a primary map input.
- Cable map → Zoom control: includes · Map engine uses the zoom control.
- Search → Search index: loads · Search UI uses the static search index.
- Multiselect → Config: loads · Filtering behavior uses dataset metadata.
- Cable page → Cables: loads · Cable pages render from static cable JSON.
- Landing page → Landings: loads · Landing pages render from static landing-point JSON.
- Country page → Countries: loads · Country pages render from static country JSON.
- Supplier page → Suppliers: loads · Supplier pages render from static supplier JSON.
- Status page → Statuses: loads · Status pages render from static status JSON.
- Home → Config: loads · Home page uses application metadata.
- Results shell → RFS years: loads · Results views can use ready-for-service buckets.
