From 9f889404dee8d58b88732c6422d9c8a18a92f299 Mon Sep 17 00:00:00 2001
From: Christophe Avenel
Date: Mon, 12 Oct 2026 08:58:56 +0200
Subject: [PATCH 1/2] feat: add TissUUmaps 3 links and sections to the gallery
A gallery project now takes either `project`, a TissUUmaps project file, or
`link`, the address of an older TissUUmaps 3 project. The gallery shows the
two kinds in separate sections. The data fields are optional for links,
since the old projects do not state a data license.
The card image now opens the project page, like the title; only the button
opens TissUUmaps.
---
docusaurus.config.ts | 2 +-
gallery/README.md | 2 +
.../pages/GalleryListPage/ProjectCard.tsx | 43 ++++++++++--
.../pages/GalleryListPage/index.tsx | 47 +++++++++++--
.../pages/GalleryListPage/styles.module.css | 17 ++++-
.../pages/GalleryProjectPage/index.tsx | 20 +++---
src/gallery.ts | 69 +++++++++++++------
7 files changed, 151 insertions(+), 49 deletions(-)
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index 594b512..269cc22 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -99,7 +99,7 @@ const config: Config = {
routeBasePath: "gallery",
blogTitle: "Gallery",
blogDescription:
- "Example projects. Each one opens directly in TissUUmaps, in your browser.",
+ "Example projects made with TissUUmaps, to open in your browser.",
blogListComponent: "@site/src/components/pages/GalleryListPage",
blogTagsPostsComponent: "@site/src/components/pages/GalleryListPage",
blogPostComponent: "@site/src/components/pages/GalleryProjectPage",
diff --git a/gallery/README.md b/gallery/README.md
index c66441f..63d8288 100644
--- a/gallery/README.md
+++ b/gallery/README.md
@@ -23,4 +23,6 @@ Every folder here is one project of the Gallery page of the website. Folders sta
| `data_url` | Where the data comes from |
| `data_license` | The license of the data, for example `CC BY 4.0` |
+The gallery has two sections: TissUUmaps 4 projects, then older TissUUmaps 3 projects. For a TissUUmaps 3 project, replace `project` with `link`, the address of the project on its own server. The data fields are optional for these: remove all three, or keep all three.
+
The text below the fields is optional. It appears on the project's own page and can use [Markdown](https://www.markdownguide.org/basic-syntax/): paragraphs, **bold**, links, lists and images.
diff --git a/src/components/pages/GalleryListPage/ProjectCard.tsx b/src/components/pages/GalleryListPage/ProjectCard.tsx
index 5083eac..d05e26a 100644
--- a/src/components/pages/GalleryListPage/ProjectCard.tsx
+++ b/src/components/pages/GalleryListPage/ProjectCard.tsx
@@ -13,20 +13,17 @@ export function ProjectCard({
}): ReactNode {
return (
-
+
-
+
{project.title}
{project.description}
-
- Data: {project.dataProvider},{" "}
- {project.dataLicense}
-
- Open in TissUUmaps
+
+
);
@@ -47,3 +44,35 @@ export function ProjectTags({
);
}
+
+/** The data source line; an empty one keeps the card's button at the bottom */
+export function ProjectSource({
+ project,
+ className,
+}: {
+ project: GalleryProject;
+ className?: string;
+}): ReactNode {
+ return (
+
+ {project.data && (
+ <>
+ Data: {project.data.provider},{" "}
+ {project.data.license}
+ >
+ )}
+
+ );
+}
+
+export function ProjectButton({
+ project,
+}: {
+ project: GalleryProject;
+}): ReactNode {
+ return (
+
+ {project.version === 3 ? "Open in TissUUmaps 3" : "Open in TissUUmaps"}
+
+ );
+}
diff --git a/src/components/pages/GalleryListPage/index.tsx b/src/components/pages/GalleryListPage/index.tsx
index 46d5d0b..7740033 100644
--- a/src/components/pages/GalleryListPage/index.tsx
+++ b/src/components/pages/GalleryListPage/index.tsx
@@ -10,6 +10,21 @@ import { readGalleryProject } from "../../../gallery";
import { ProjectCard } from "./ProjectCard";
import styles from "./styles.module.css";
+// The gallery sections: TissUUmaps project files first, then links to older
+// TissUUmaps 3 projects
+const sections = [
+ {
+ version: 4,
+ title: "TissUUmaps 4 projects",
+ lead: "Each one opens directly in TissUUmaps, in your browser.",
+ },
+ {
+ version: 3,
+ title: "TissUUmaps 3 projects",
+ lead: "Older projects made with TissUUmaps 3.",
+ },
+] as const;
+
// The gallery is the blog plugin's content (see docusaurus.config.ts), listed
// as cards; the same page lists the projects with one tag
export default function GalleryListPage(
@@ -42,13 +57,31 @@ export default function GalleryListPage(
-
-
- {projects.map((project) => (
-
- ))}
-
-
+
+ {sections.map(({ version, title, lead }) => {
+ const sectionProjects = projects.filter(
+ (project) => project.version === version,
+ );
+ return (
+ sectionProjects.length > 0 && (
+
+
+ {title}
+
+ {lead}
+
+ {sectionProjects.map((project) => (
+
+ ))}
+
+
+ )
+ );
+ })}
+
);
diff --git a/src/components/pages/GalleryListPage/styles.module.css b/src/components/pages/GalleryListPage/styles.module.css
index a6e9c7d..beea522 100644
--- a/src/components/pages/GalleryListPage/styles.module.css
+++ b/src/components/pages/GalleryListPage/styles.module.css
@@ -35,6 +35,19 @@
max-width: 1280px;
}
+.band > .container + .container {
+ margin-top: 4rem;
+}
+
+.sectionTitle {
+ margin-bottom: 0.5rem;
+ font-size: 2rem;
+}
+
+.sectionLead {
+ margin-bottom: 2rem;
+}
+
.grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
@@ -77,12 +90,12 @@
padding: 1.25rem 1.5rem 1.5rem;
}
-.body h2 {
+.body h3 {
margin-bottom: 0.5rem;
font-size: 1.3rem;
}
-.body h2 a {
+.body h3 a {
color: inherit;
}
diff --git a/src/components/pages/GalleryProjectPage/index.tsx b/src/components/pages/GalleryProjectPage/index.tsx
index 99a43a7..6d313be 100644
--- a/src/components/pages/GalleryProjectPage/index.tsx
+++ b/src/components/pages/GalleryProjectPage/index.tsx
@@ -6,8 +6,11 @@ import MDXContent from "@theme/MDXContent";
import type { ReactNode } from "react";
import { readGalleryProject } from "../../../gallery";
-import { Button } from "../../markdown/Button";
-import { ProjectTags } from "../GalleryListPage/ProjectCard";
+import {
+ ProjectButton,
+ ProjectSource,
+ ProjectTags,
+} from "../GalleryListPage/ProjectCard";
import styles from "./styles.module.css";
// The own page of a gallery project: its card details and the Markdown text
@@ -23,20 +26,17 @@ export default function GalleryProjectPage({ content }: Props): ReactNode {
← Gallery
-
-
-
+
{project.title}
{project.description}
-
- Data: {project.dataProvider}
- , {project.dataLicense}
-
-
Open in TissUUmaps
+ {project.data && (
+
+ )}
+
diff --git a/src/gallery.ts b/src/gallery.ts
index 60f6c4d..b988f51 100644
--- a/src/gallery.ts
+++ b/src/gallery.ts
@@ -9,30 +9,34 @@ const galleryAppUrl = "pathname:///app/";
/** A gallery project, read from the front matter of its Markdown file */
export interface GalleryProject {
+ /**
+ * A TissUUmaps project file (`project`), or a link to an older TissUUmaps 3
+ * project on its own server (`link`)
+ */
+ version: 4 | 3;
title: string;
description: string;
/** URL of the screenshot */
image: string;
- /** URL that opens the project in TissUUmaps */
+ /** URL that opens the project */
appUrl: string;
/** URL of the project's own page */
pageUrl: string;
tags: { label: string; permalink: string }[];
- dataProvider: string;
- dataUrl: string;
- dataLicense: string;
+ /** Where the data comes from; TissUUmaps 3 projects can leave it out */
+ data: { provider: string; url: string; license: string } | undefined;
editUrl: string | undefined;
}
-const requiredFields = [
- "title",
- "description",
- "image",
- "project",
- "data_provider",
- "data_url",
- "data_license",
-] as const;
+type Field =
+ | "title"
+ | "description"
+ | "image"
+ | "project"
+ | "link"
+ | "data_provider"
+ | "data_url"
+ | "data_license";
/**
* Reads a gallery project from its blog post content
@@ -45,25 +49,46 @@ const requiredFields = [
export function readGalleryProject(content: Content): GalleryProject {
const { frontMatter, assets, metadata } = content;
const fields = frontMatter as Record;
- for (const field of requiredFields) {
- if (typeof fields[field] !== "string" || fields[field] === "") {
+ const has = (name: Field) =>
+ typeof fields[name] === "string" && fields[name] !== "";
+ const field = (name: Field) => {
+ if (!has(name)) {
throw new Error(
- `Gallery project ${metadata.source}: the field "${field}" is missing`,
+ `Gallery project ${metadata.source}: the field "${name}" is missing`,
);
}
+ return fields[name] as string;
+ };
+ if (has("project") && has("link")) {
+ throw new Error(
+ `Gallery project ${metadata.source}: use either "project" or "link", not both`,
+ );
}
- const field = (name: (typeof requiredFields)[number]) =>
- fields[name] as string;
+ const version = has("link") ? 3 : 4;
+ // TissUUmaps 3 projects can leave out the data fields, but not only some
+ const hasData =
+ version === 4 ||
+ has("data_provider") ||
+ has("data_url") ||
+ has("data_license");
return {
+ version,
title: field("title"),
description: field("description"),
image: assets.image ?? field("image"),
- appUrl: `${galleryAppUrl}?project=${encodeURIComponent(field("project"))}`,
+ appUrl:
+ version === 3
+ ? field("link")
+ : `${galleryAppUrl}?project=${encodeURIComponent(field("project"))}`,
pageUrl: metadata.permalink,
tags: metadata.tags.map(({ label, permalink }) => ({ label, permalink })),
- dataProvider: field("data_provider"),
- dataUrl: field("data_url"),
- dataLicense: field("data_license"),
+ data: hasData
+ ? {
+ provider: field("data_provider"),
+ url: field("data_url"),
+ license: field("data_license"),
+ }
+ : undefined,
editUrl: metadata.editUrl,
};
}
From 949593937b4ea6aed795186b8d65eff2425494b9 Mon Sep 17 00:00:00 2001
From: Christophe Avenel
Date: Mon, 12 Oct 2026 08:58:58 +0200
Subject: [PATCH 2/2] feat: add the TissUUmaps 3 gallery projects
The seven projects of the TissUUmaps 3 gallery, with their screenshots
cropped to 16:10. The folder dates keep the order of the old gallery.
---
gallery/2024-01-31-prostate-cancer/index.md | 13 +++++++++++++
.../2024-01-31-prostate-cancer/thumbnail.jpg | Bin 0 -> 41304 bytes
gallery/2024-02-01-spage2vec/index.md | 16 ++++++++++++++++
gallery/2024-02-01-spage2vec/thumbnail.jpg | Bin 0 -> 128635 bytes
gallery/2024-02-02-mouse-brain/index.md | 17 +++++++++++++++++
gallery/2024-02-02-mouse-brain/thumbnail.jpg | Bin 0 -> 92154 bytes
gallery/2024-02-03-lung-cell-atlas/index.md | 18 ++++++++++++++++++
.../2024-02-03-lung-cell-atlas/thumbnail.jpg | Bin 0 -> 62896 bytes
gallery/2024-02-04-human-heart/index.md | 13 +++++++++++++
gallery/2024-02-04-human-heart/thumbnail.jpg | Bin 0 -> 97448 bytes
gallery/2024-02-05-depicter/index.md | 17 +++++++++++++++++
gallery/2024-02-05-depicter/thumbnail.jpg | Bin 0 -> 76503 bytes
gallery/2024-02-06-points2regions/index.md | 15 +++++++++++++++
.../2024-02-06-points2regions/thumbnail.jpg | Bin 0 -> 115069 bytes
14 files changed, 109 insertions(+)
create mode 100644 gallery/2024-01-31-prostate-cancer/index.md
create mode 100644 gallery/2024-01-31-prostate-cancer/thumbnail.jpg
create mode 100644 gallery/2024-02-01-spage2vec/index.md
create mode 100644 gallery/2024-02-01-spage2vec/thumbnail.jpg
create mode 100644 gallery/2024-02-02-mouse-brain/index.md
create mode 100644 gallery/2024-02-02-mouse-brain/thumbnail.jpg
create mode 100644 gallery/2024-02-03-lung-cell-atlas/index.md
create mode 100644 gallery/2024-02-03-lung-cell-atlas/thumbnail.jpg
create mode 100644 gallery/2024-02-04-human-heart/index.md
create mode 100644 gallery/2024-02-04-human-heart/thumbnail.jpg
create mode 100644 gallery/2024-02-05-depicter/index.md
create mode 100644 gallery/2024-02-05-depicter/thumbnail.jpg
create mode 100644 gallery/2024-02-06-points2regions/index.md
create mode 100644 gallery/2024-02-06-points2regions/thumbnail.jpg
diff --git a/gallery/2024-01-31-prostate-cancer/index.md b/gallery/2024-01-31-prostate-cancer/index.md
new file mode 100644
index 0000000..75d8507
--- /dev/null
+++ b/gallery/2024-01-31-prostate-cancer/index.md
@@ -0,0 +1,13 @@
+---
+title: Prostate cancer grading
+description: Full-resolution digitized prostate biopsies with AI-based detection, localisation and Gleason grading of prostate cancer.
+image: ./thumbnail.jpg
+link: https://sthlm3-2020.serve.scilifelab.se/
+tags: [Histology, H&E, Deep learning]
+---
+
+More and more prostate biopsies, and a worldwide shortage of urological pathologists, strain pathology departments. Grading also varies a lot between and within observers, which can lead to over- and undertreatment. This artificial intelligence system detects, localises and grades prostate cancer with clinically acceptable accuracy. The viewer shows examples of full-resolution digitized biopsies and their AI-based grading.
+
+[Open the overview of all sample datasets](https://sthlm3-2020.serve.scilifelab.se/).
+
+Publication: P. Ström, K. Kartasalo, H. Olsson, L. Solorzano et al. Artificial intelligence for diagnosis and grading of prostate cancer in biopsies: a population-based, diagnostic study. _The Lancet Oncology_, 21(2), 222–232, 2020. [doi:10.1016/S1470-2045(19)30738-7]()
diff --git a/gallery/2024-01-31-prostate-cancer/thumbnail.jpg b/gallery/2024-01-31-prostate-cancer/thumbnail.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b27db06c3d1b2af71390a41e303472d4d5ee462f
GIT binary patch
literal 41304
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
L7c?O9`#1l8ZhjXK
literal 0
HcmV?d00001
diff --git a/gallery/2024-02-01-spage2vec/index.md b/gallery/2024-02-01-spage2vec/index.md
new file mode 100644
index 0000000..b35ce7a
--- /dev/null
+++ b/gallery/2024-02-01-spage2vec/index.md
@@ -0,0 +1,16 @@
+---
+title: Spage2vec
+description: Unsupervised representation of localized spatial gene expression signatures, on in situ sequencing, osmFISH and MERFISH data.
+image: ./thumbnail.jpg
+link: https://tissuumaps-demo.serve.scilifelab.se/web/spage2vec/index.html
+tags: [In situ sequencing, osmFISH, MERFISH]
+---
+
+Spage2vec is an unsupervised, segmentation-free approach to the spatial transcriptomic diversity of complex tissues, at subcellular resolution. It represents the spatial transcriptomic landscape of a tissue sample as a graph, and uses graph representation learning to create a lower-dimensional representation of local gene expression. These viewers show the spage2vec signatures of four datasets. We thank Mats Nilsson, Sten Linnarsson and Xiaowei Zhuang for making their datasets publicly available.
+
+- [In situ sequencing, mouse brain hippocampal area CA1](https://tissuumaps-demo.serve.scilifelab.se/Spage2vec_ISS_Qian_et_al.tmap). Data: X. Qian et al., _Nature Methods_, 2020. [doi:10.1038/s41592-019-0631-4](https://doi.org/10.1038/s41592-019-0631-4)
+- [osmFISH, mouse brain somatosensory cortex](https://tissuumaps-demo.serve.scilifelab.se/Spage2vec_osmFISH_Codeluppi_et_al.tmap). Data: S. Codeluppi et al., _Nature Methods_, 2018. [doi:10.1038/s41592-018-0175-z](https://doi.org/10.1038/s41592-018-0175-z)
+- [MERFISH, mouse brain hypothalamic preoptic area](https://tissuumaps-demo.serve.scilifelab.se/Spage2vec_MERFISH_Moffitt_et_al.tmap). Data: J. R. Moffitt et al., _Science_, 2018. [doi:10.1126/science.aau5324](https://doi.org/10.1126/science.aau5324)
+- [MERFISH, human fibroblast cells (IMR90)](https://tissuumaps-demo.serve.scilifelab.se/Spage2vec_MERFISH_Chen_et_al_2015.tmap). Data: K. H. Chen et al., _Science_, 2015. [doi:10.1126/science.aaa6090](https://doi.org/10.1126/science.aaa6090)
+
+The spatial gene expression data is available on [Zenodo](https://doi.org/10.5281/zenodo.3897401), and the code to reproduce the results and figures [also on Zenodo](https://doi.org/10.5281/zenodo.4030404).
diff --git a/gallery/2024-02-01-spage2vec/thumbnail.jpg b/gallery/2024-02-01-spage2vec/thumbnail.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..8baba89668a9daa7bc83d5c8940355dfbb2f3867
GIT binary patch
literal 128635
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
z34