// Mosaic site โ SOURCES directory page
// Exports: SourcesPage
const SrcTable = ({ rows }) => (
{["Source", "Owner / parent", "Ownership", "Founded", "Country"].map((h, i) => (
{h}
))}
{rows.map((r, i) => (
{FAVS[r.f].n}
{r.k}
{r.o}
{r.t}
{r.y}
{r.c}
))}
);
const SourcesPage = () => {
// One flat table โ the filter chips do the grouping, no section headings.
const all = [
...SOURCE_DIR.outlets.map((r) => ({ ...r, g: "outlets" })),
...SOURCE_DIR.independent.map((r) => ({ ...r, g: "independent" })),
...SOURCE_DIR.youtube.map((r) => ({ ...r, g: "youtube" })),
...SOURCE_DIR.international.map((r) => ({ ...r, g: "international" })),
];
const [filter, setFilter] = React.useState("all");
const rows = filter === "all" ? all : all.filter((r) => r.g === filter);
return (
Source directory ยท who owns what
Sources
Verifiable ownership facts only โ no bias or quality ratings here. Where a source leans is shown
per story in each topic's source map, based on what it actually published. Compiled from the Media
Ownership Monitor (RSF/Freedom Network), Wikipedia and reporting. Last checked Jun 2026.
setFilter("all")}>All
{[["outlets", "Outlets"], ["independent", "Independent"], ["youtube", "YouTube"], ["international", "International"]].map(([k, label]) => (
setFilter(k)}>{label}
))}
);
};
Object.assign(window, { SourcesPage });