更新前端页面内容,将中文翻译为英文,修改了多个页面的标题、描述和按钮文本,以提升国际化支持和用户体验。同时,移除了一些未使用的代码和注释,优化了代码结构。

This commit is contained in:
wjsjwr 2025-08-11 20:40:44 +08:00
parent bc60273eca
commit 19afd6f019
9 changed files with 213 additions and 213 deletions

View File

@ -1,11 +1,11 @@
<!doctype html> <!doctype html>
<html lang="zh-CN"> <html lang="en">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" /> <link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Digital Embryo - 数字胚胎发育时空转录组图谱数据库" /> <meta name="description" content="Digital Embryo - A spatiotemporal transcriptomic atlas and database of embryonic development" />
<title>Digital Embryo | 数字胚胎发育时空转录组图谱</title> <title>Digital Embryo | Spatiotemporal transcriptomic atlas</title>
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>

View File

@ -189,15 +189,7 @@ const PointCloud: React.FC<PointCloudProps> = ({ data, isCategorical = false, au
const intersects = raycaster.intersectObject(points); const intersects = raycaster.intersectObject(points);
if (intersects.length > 0) { if (intersects.length > 0) {
const i = intersects[0].index ?? 0; // Click handling can be added here if needed
const p = data[i];
// console.log(`Clicked: x=${p.x}, y=${p.y}, z=${p.z}, value=${p.value}`);
// if (isCategorical) {
// alert(`Cell @ (${p.x.toFixed(1)}, ${p.y.toFixed(1)}, ${p.z.toFixed(1)})\nCell Type: ${p.value}`);
// } else {
// alert(`Cell @ (${p.x.toFixed(1)}, ${p.y.toFixed(1)}, ${p.z.toFixed(1)})\nExpression: ${(p.value as number).toFixed(3)}`);
// }
} }
}; };
@ -309,7 +301,7 @@ const PointCloud: React.FC<PointCloudProps> = ({ data, isCategorical = false, au
return ( return (
<div> <div>
<div style={{ fontWeight: '600', marginBottom: '10px', fontSize: '14px' }}></div> <div style={{ fontWeight: '600', marginBottom: '10px', fontSize: '14px' }}>Cell types</div>
<div> <div>
{cellTypes.map(type => { {cellTypes.map(type => {
const cellColor = colorMap.get(type); const cellColor = colorMap.get(type);
@ -339,7 +331,7 @@ const PointCloud: React.FC<PointCloudProps> = ({ data, isCategorical = false, au
// 数值数据图例 // 数值数据图例
return ( return (
<div> <div>
<div style={{ fontWeight: '600', marginBottom: '10px', fontSize: '14px' }}></div> <div style={{ fontWeight: '600', marginBottom: '10px', fontSize: '14px' }}>Expression intensity</div>
<div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}> <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>
<div style={{ <div style={{
background: 'linear-gradient(to top, hsla(180, 100%, 50%, 1.00), hsla(72, 100%, 50%, 1.00), hsla(0, 100%, 50%, 0.99))', background: 'linear-gradient(to top, hsla(180, 100%, 50%, 1.00), hsla(72, 100%, 50%, 1.00), hsla(0, 100%, 50%, 0.99))',
@ -348,8 +340,8 @@ const PointCloud: React.FC<PointCloudProps> = ({ data, isCategorical = false, au
marginBottom: '5px' marginBottom: '5px'
}} /> }} />
<div style={{ fontSize: '11px', color: '#666' }}> <div style={{ fontSize: '11px', color: '#666' }}>
<div></div> <div>High</div>
<div></div> <div>Low</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -3,32 +3,32 @@ import React from "react";
const Download: React.FC = () => { const Download: React.FC = () => {
const downloadItems = [ const downloadItems = [
{ {
title: "CS7 阶段数据", title: "CS7 stage dataset",
description: "小鼠胚胎 CS7 发育阶段的完整空间转录组数据", description: "Complete spatial transcriptomic data for mouse embryo stage CS7",
files: [ files: [
{ name: "CS7.h5ad", size: "45.2 MB", format: "AnnData" }, { name: "CS7.h5ad", size: "45.2 MB", format: "AnnData" },
{ name: "CS7_metadata.csv", size: "2.1 MB", format: "CSV" }, { name: "CS7_metadata.csv", size: "2.1 MB", format: "CSV" },
] ]
}, },
{ {
title: "CS8 阶段数据", title: "CS8 stage dataset",
description: "小鼠胚胎 CS8 发育阶段的完整空间转录组数据", description: "Complete spatial transcriptomic data for mouse embryo stage CS8",
files: [ files: [
{ name: "CS8.h5ad", size: "52.8 MB", format: "AnnData" }, { name: "CS8.h5ad", size: "52.8 MB", format: "AnnData" },
{ name: "CS8_metadata.csv", size: "2.3 MB", format: "CSV" }, { name: "CS8_metadata.csv", size: "2.3 MB", format: "CSV" },
] ]
}, },
{ {
title: "CS9 阶段数据", title: "CS9 stage dataset",
description: "小鼠胚胎 CS9 发育阶段的完整空间转录组数据", description: "Complete spatial transcriptomic data for mouse embryo stage CS9",
files: [ files: [
{ name: "CS9.h5ad", size: "61.4 MB", format: "AnnData" }, { name: "CS9.h5ad", size: "61.4 MB", format: "AnnData" },
{ name: "CS9_metadata.csv", size: "2.7 MB", format: "CSV" }, { name: "CS9_metadata.csv", size: "2.7 MB", format: "CSV" },
] ]
}, },
{ {
title: "模拟数据集", title: "Mock dataset",
description: "用于测试和开发的 3D 表达数据模拟集", description: "Synthetic 3D expression data for testing and development",
files: [ files: [
{ name: "embryo_mock_3D_expression.h5ad", size: "18.9 MB", format: "AnnData" }, { name: "embryo_mock_3D_expression.h5ad", size: "18.9 MB", format: "AnnData" },
] ]
@ -40,26 +40,26 @@ const Download: React.FC = () => {
<div className="page-header"> <div className="page-header">
<h1>Download</h1> <h1>Download</h1>
<p className="page-description"> <p className="page-description">
Processed data and metadata available for download for the research community
</p> </p>
</div> </div>
<div className="page-content"> <div className="page-content">
<div className="download-notice"> <div className="download-notice">
<h2>使</h2> <h2>Usage policy</h2>
<p> <p>
使 When downloading and using these data, please follow the policy below:
</p> </p>
<ul> <ul>
<li></li> <li>Data are for academic research use only</li>
<li>使</li> <li>If used in publications, please cite our work</li>
<li></li> <li>Redistribution of raw data is prohibited</li>
<li></li> <li>Commercial use requires separate authorization</li>
</ul> </ul>
</div> </div>
<div className="downloads-section"> <div className="downloads-section">
<h2></h2> <h2>Available downloads</h2>
<div className="download-grid"> <div className="download-grid">
{downloadItems.map((item, index) => ( {downloadItems.map((item, index) => (
<div key={index} className="download-card"> <div key={index} className="download-card">
@ -74,7 +74,7 @@ const Download: React.FC = () => {
{file.size} | {file.format} {file.size} | {file.format}
</span> </span>
</div> </div>
<button className="download-btn"></button> <button className="download-btn">Download</button>
</div> </div>
))} ))}
</div> </div>
@ -84,17 +84,17 @@ const Download: React.FC = () => {
</div> </div>
<div className="bulk-download"> <div className="bulk-download">
<h2></h2> <h2>Bulk download</h2>
<div className="bulk-options"> <div className="bulk-options">
<div className="bulk-option"> <div className="bulk-option">
<h3></h3> <h3>Full dataset</h3>
<p> 185 MB</p> <p>Download all stages' data and metadata (~185 MB)</p>
<button className="bulk-download-btn"></button> <button className="bulk-download-btn">Download all</button>
</div> </div>
<div className="bulk-option"> <div className="bulk-option">
<h3></h3> <h3>Metadata package</h3>
<p> 7 MB</p> <p>Download metadata files for all stages only (~7 MB)</p>
<button className="bulk-download-btn"></button> <button className="bulk-download-btn">Download metadata</button>
</div> </div>
</div> </div>
</div> </div>

View File

@ -83,7 +83,7 @@ const EmbryoGeneration: React.FC = () => {
<div className="page-header"> <div className="page-header">
<h1>Embryo Generation</h1> <h1>Embryo Generation</h1>
<p className="page-description"> <p className="page-description">
CS7CS8CS7.53D视图中展示 Observe cell migration and merging during embryonic development. CS7, CS8, and CS7.5 point clouds are shown in one 3D view, with an animation simulating cells converging from both sides.
</p> </p>
</div> </div>
<div className="page-content"> <div className="page-content">
@ -110,7 +110,7 @@ const EmbryoGeneration: React.FC = () => {
opacity: isAnimating || loading ? 0.6 : 1 opacity: isAnimating || loading ? 0.6 : 1
}} }}
> >
{isAnimating ? "动画中..." : "开始动画"} {isAnimating ? "Animating..." : "Start animation"}
</button> </button>
<button <button
onClick={resetAnimation} onClick={resetAnimation}
@ -125,10 +125,10 @@ const EmbryoGeneration: React.FC = () => {
opacity: loading ? 0.6 : 1 opacity: loading ? 0.6 : 1
}} }}
> >
Reset
</button> </button>
<label style={{ display: "flex", alignItems: "center", gap: "0.5rem" }}> <label style={{ display: "flex", alignItems: "center", gap: "0.5rem" }}>
: Animation speed:
<input <input
type="range" type="range"
min="0.5" min="0.5"
@ -141,7 +141,7 @@ const EmbryoGeneration: React.FC = () => {
<span>{animationSpeed}x</span> <span>{animationSpeed}x</span>
</label> </label>
<div style={{ display: "flex", alignItems: "center", gap: "0.5rem" }}> <div style={{ display: "flex", alignItems: "center", gap: "0.5rem" }}>
: {Math.round(animationProgress * 100)}% Progress: {Math.round(animationProgress * 100)}%
<div style={{ <div style={{
width: "100px", width: "100px",
height: "8px", height: "8px",
@ -166,23 +166,23 @@ const EmbryoGeneration: React.FC = () => {
animationProgress={animationProgress} animationProgress={animationProgress}
/> />
<div className="section"> <div className="section">
<h2>使</h2> <h2>User Guide</h2>
<div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(300px, 1fr))", gap: "2rem", marginTop: "1.5rem" }}> <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(300px, 1fr))", gap: "2rem", marginTop: "1.5rem" }}>
<div> <div>
<h3>🎬 </h3> <h3>🎬 Animation controls</h3>
<p>"开始动画"CS7.5使</p> <p>Click "Start animation" to watch the CS7.5 cell formation process. Adjust speed and use Reset to start over.</p>
</div> </div>
<div> <div>
<h3>🖱 </h3> <h3>🖱 Interactions</h3>
<p>3D视图中使用鼠标拖拽旋转视角</p> <p>Drag to rotate, scroll to zoom, and click data points in the 3D view to see details.</p>
</div> </div>
<div> <div>
<h3>🎨 </h3> <h3>🎨 Color encoding</h3>
<p>便</p> <p>Identical colors indicate the same cell type, making it easier to observe developmental changes.</p>
</div> </div>
<div> <div>
<h3>📊 </h3> <h3>📊 Developmental process</h3>
<p>CS7和CS8到CS7.5</p> <p>Observe the process from CS7 and CS8 to CS7.5 to understand spatial distribution changes and cell-type differentiation.</p>
</div> </div>
</div> </div>
</div> </div>
@ -375,8 +375,7 @@ const UnifiedEmbryoAnimation: React.FC<UnifiedEmbryoAnimationProps> = ({ cs7Data
// 为CS7.5的点分配起始位置从CS7和CS8的实际数据中获取 // 为CS7.5的点分配起始位置从CS7和CS8的实际数据中获取
// 基于细胞类型或颜色来分配起始位置,确保相同颜色的点从两侧出现 // 基于细胞类型或颜色来分配起始位置,确保相同颜色的点从两侧出现
const leftSourcePoints = []; // Left/right source point placeholders removed (unused)
const rightSourcePoints = [];
// 按细胞类型分组CS7和CS8数据 // 按细胞类型分组CS7和CS8数据
const cs7ByType = new Map<string, Point[]>(); const cs7ByType = new Map<string, Point[]>();

View File

@ -141,7 +141,8 @@ const GeneView: React.FC = () => {
<div className="page-header"> <div className="page-header">
<h1>Gene Expression</h1> <h1>Gene Expression</h1>
<p className="page-description"> <p className="page-description">
3D可视化探索基因在胚胎发育过程中的表达变化 View and analyze gene expression patterns and spatial distributions across developmental stages.
Explore changes during embryonic development with 3D visualizations.
</p> </p>
</div> </div>
@ -155,7 +156,7 @@ const GeneView: React.FC = () => {
marginBottom: "2rem" marginBottom: "2rem"
}}> }}>
<label> <label>
:&nbsp; Developmental stage:&nbsp;
<select <select
value={selectedStage} value={selectedStage}
onChange={(e) => { onChange={(e) => {
@ -166,33 +167,33 @@ const GeneView: React.FC = () => {
setError(""); setError("");
}} }}
> >
<option value="CS7">CS7 - </option> <option value="CS7">CS7 - Early stage</option>
<option value="CS8">CS8 - </option> <option value="CS8">CS8 - Mid stage</option>
<option value="CS9">CS9 - </option> <option value="CS9">CS9 - Late stage</option>
<option value="CS11">CS11 - </option> <option value="CS11">CS11 - Later stage</option>
<option value="CS12">CS12 - </option> <option value="CS12">CS12 - Later stage</option>
<option value="CS13">CS13 - </option> <option value="CS13">CS13 - Later stage</option>
<option value="CS14">CS14 - </option> <option value="CS14">CS14 - Later stage</option>
<option value="CS15">CS15 - </option> <option value="CS15">CS15 - Later stage</option>
<option value="CS16">CS16 - </option> <option value="CS16">CS16 - Later stage</option>
<option value="CS17">CS17 - </option> <option value="CS17">CS17 - Later stage</option>
<option value="CS18">CS18 - </option> <option value="CS18">CS18 - Later stage</option>
<option value="CS19">CS19 - </option> <option value="CS19">CS19 - Later stage</option>
<option value="CS20">CS20 - </option> <option value="CS20">CS20 - Later stage</option>
<option value="CS21">CS21 - </option> <option value="CS21">CS21 - Later stage</option>
<option value="CS22">CS22 - </option> <option value="CS22">CS22 - Later stage</option>
<option value="CS23">CS23 - </option> <option value="CS23">CS23 - Later stage</option>
</select> </select>
</label> </label>
<label htmlFor="gene-select">:</label> <label htmlFor="gene-select">Target gene:</label>
<select <select
id="gene-select" id="gene-select"
aria-label="选择基因" aria-label="Select gene"
value={gene} value={gene}
onChange={(e) => setGene(e.target.value)} onChange={(e) => setGene(e.target.value)}
> >
<option value="">-- --</option> <option value="">-- Select gene --</option>
{availableGenes.map((g) => ( {availableGenes.map((g) => (
<option key={g} value={g}> <option key={g} value={g}>
{g} {g}
@ -201,7 +202,7 @@ const GeneView: React.FC = () => {
</select> </select>
<button onClick={handleSearch} disabled={!gene || loading}> <button onClick={handleSearch} disabled={!gene || loading}>
{loading ? "加载中..." : "查询表达"} {loading ? "Loading..." : "Query expression"}
</button> </button>
</div> </div>
@ -210,8 +211,9 @@ const GeneView: React.FC = () => {
{/* 3D 可视化说明 */} {/* 3D 可视化说明 */}
<p className="flat-section-description"> <p className="flat-section-description">
{selectedStage} Below are the cell type distribution (left), the selected gene's expression pattern (middle),
and the expression distribution across cell types (right) for stage {selectedStage}.
Click any data point to view details.
</p> </p>
{/* 三可视化区域 */} {/* 三可视化区域 */}
@ -228,7 +230,7 @@ const GeneView: React.FC = () => {
> >
{/* 细胞类型可视化 */} {/* 细胞类型可视化 */}
<div className="visualization-container" style={{ width: "700px", minWidth: "700px", maxWidth: "700px" }}> <div className="visualization-container" style={{ width: "700px", minWidth: "700px", maxWidth: "700px" }}>
<h3 style={{ textAlign: "center" }}></h3> <h3 style={{ textAlign: "center" }}>Cell type distribution</h3>
{cellError && <div className="error-message">{cellError}</div>} {cellError && <div className="error-message">{cellError}</div>}
{cellData.length > 0 ? ( {cellData.length > 0 ? (
<div style={{ width: "700px", height: "100%" }}> <div style={{ width: "700px", height: "100%" }}>
@ -239,14 +241,14 @@ const GeneView: React.FC = () => {
{cellLoading ? ( {cellLoading ? (
<div> <div>
<div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🔄</div> <div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🔄</div>
<p>...</p> <p>Loading cell type data...</p>
</div> </div>
) : ( ) : (
<div> <div>
<div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🧬</div> <div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🧬</div>
<p></p> <p>Cell type distribution</p>
<p style={{ fontSize: "0.9rem", color: "var(--text-secondary)" }}> <p style={{ fontSize: "0.9rem", color: "var(--text-secondary)" }}>
{selectedStage} Stage: {selectedStage}
</p> </p>
</div> </div>
)} )}
@ -256,7 +258,7 @@ const GeneView: React.FC = () => {
{/* 基因表达可视化 */} {/* 基因表达可视化 */}
<div className="visualization-container" style={{ width: "500px", minWidth: "500px", maxWidth: "500px" }}> <div className="visualization-container" style={{ width: "500px", minWidth: "500px", maxWidth: "500px" }}>
<h3 style={{ textAlign: "center" }}></h3> <h3 style={{ textAlign: "center" }}>Gene expression pattern</h3>
{data.length > 0 ? ( {data.length > 0 ? (
<div style={{ width: "500px", height: "100%" }}> <div style={{ width: "500px", height: "100%" }}>
<PointCloud data={data} autoRotate={true} /> <PointCloud data={data} autoRotate={true} />
@ -266,14 +268,14 @@ const GeneView: React.FC = () => {
{loading ? ( {loading ? (
<div> <div>
<div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🔄</div> <div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🔄</div>
<p>...</p> <p>Loading gene expression data...</p>
</div> </div>
) : ( ) : (
<div> <div>
<div style={{ fontSize: "2rem", marginBottom: "1rem" }}>📊</div> <div style={{ fontSize: "2rem", marginBottom: "1rem" }}>📊</div>
<p></p> <p>Please select a target gene to view expression data</p>
<p style={{ fontSize: "0.9rem", color: "var(--text-secondary)" }}> <p style={{ fontSize: "0.9rem", color: "var(--text-secondary)" }}>
{selectedStage} Stage: {selectedStage}
</p> </p>
</div> </div>
)} )}
@ -283,7 +285,7 @@ const GeneView: React.FC = () => {
{/* 基因分布箱线图 */} {/* 基因分布箱线图 */}
<div className="visualization-container"> <div className="visualization-container">
<h3 style={{textAlign: "center" }}></h3> <h3 style={{textAlign: "center" }}>Gene expression distribution</h3>
{distributionData.data && distributionData.data.length > 0 ? ( {distributionData.data && distributionData.data.length > 0 ? (
<div style={{ height: "480px" }}> <div style={{ height: "480px" }}>
<ResponsiveBoxPlot <ResponsiveBoxPlot
@ -302,7 +304,7 @@ const GeneView: React.FC = () => {
tickSize: 5, tickSize: 5,
tickPadding: 12, tickPadding: 12,
tickRotation: 0, tickRotation: 0,
legend: "表达值", legend: "Expression",
legendPosition: "middle", legendPosition: "middle",
legendOffset: 60, legendOffset: 60,
format: (value: number) => value.toFixed(2), format: (value: number) => value.toFixed(2),
@ -312,7 +314,7 @@ const GeneView: React.FC = () => {
tickSize: 5, tickSize: 5,
tickPadding: 10, tickPadding: 10,
tickRotation: 0, tickRotation: 0,
legend: "细胞类型", legend: "Cell type",
legendPosition: "middle", legendPosition: "middle",
legendOffset: -120, legendOffset: -120,
format: (value: string) => value.length > 12 ? `${value.substring(0, 12)}...` : value, format: (value: string) => value.length > 12 ? `${value.substring(0, 12)}...` : value,
@ -346,14 +348,14 @@ const GeneView: React.FC = () => {
{loading ? ( {loading ? (
<div> <div>
<div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🔄</div> <div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🔄</div>
<p>...</p> <p>Loading distribution data...</p>
</div> </div>
) : ( ) : (
<div> <div>
<div style={{ fontSize: "2rem", marginBottom: "1rem" }}>📈</div> <div style={{ fontSize: "2rem", marginBottom: "1rem" }}>📈</div>
<p></p> <p>Please select a target gene to view the distribution</p>
<p style={{ fontSize: "0.9rem", color: "var(--text-secondary)" }}> <p style={{ fontSize: "0.9rem", color: "var(--text-secondary)" }}>
线 The box plot shows the expression distribution across cell types
</p> </p>
</div> </div>
)} )}
@ -363,23 +365,23 @@ const GeneView: React.FC = () => {
</div> </div>
<div className="section"> <div className="section">
<h2>使</h2> <h2>User Guide</h2>
<div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(300px, 1fr))", gap: "2rem", marginTop: "1.5rem" }}> <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(300px, 1fr))", gap: "2rem", marginTop: "1.5rem" }}>
<div> <div>
<h3>🎯 </h3> <h3>🎯 Select targets</h3>
<p></p> <p>First choose a developmental stage to load its cell type distribution, then select a gene to view its expression pattern.</p>
</div> </div>
<div> <div>
<h3>🖱 </h3> <h3>🖱 Interactions</h3>
<p>3D视图中使用鼠标拖拽旋转视角</p> <p>Drag to rotate, scroll to zoom, and click data points in the 3D views to see details.</p>
</div> </div>
<div> <div>
<h3>🎨 </h3> <h3>🎨 Color encoding</h3>
<p>便</p> <p>Left and right: identical colors indicate the same cell type for consistent comparison. Middle: colors represent expression intensity, red = high, blue = low.</p>
</div> </div>
<div> <div>
<h3>📈 线</h3> <h3>📈 Box plot interpretation</h3>
<p>线25%-75%线</p> <p>The box shows the interquartile range (25%75%), the middle line is the median, whiskers show the data range, and dots indicate outliers.</p>
</div> </div>
</div> </div>
</div> </div>

View File

@ -7,10 +7,12 @@ const HomePage: React.FC = () => {
<div className="hero-section"> <div className="hero-section">
<div className="hero-content"> <div className="hero-content">
<h1 className="hero-title">Digital Embryo</h1> <h1 className="hero-title">Digital Embryo</h1>
<h2 className="hero-subtitle"></h2> <h2 className="hero-subtitle">Spatiotemporal transcriptomic atlas of embryonic development</h2>
<p className="hero-description"> <p className="hero-description">
Digital Embryo CS7CS8CS9 The Digital Embryo database contains spatial transcriptomic data of mouse embryos
across multiple developmental stages including CS7, CS8, and CS9. We provide spatial maps of
gene expression, co-expression modules, and regulators to support long-term research on
mammalian development.
</p> </p>
</div> </div>
</div> </div>
@ -22,7 +24,8 @@ const HomePage: React.FC = () => {
<div className="feature-icon">🧬</div> <div className="feature-icon">🧬</div>
<h3 className="feature-title">Spatial clustering</h3> <h3 className="feature-title">Spatial clustering</h3>
<p className="feature-description"> <p className="feature-description">
- Spatial clustering search annotations, gene expression, co-expression modules,
and regulators within each embryo section.
</p> </p>
</Link> </Link>
</div> </div>
@ -32,7 +35,8 @@ const HomePage: React.FC = () => {
<div className="feature-icon">📊</div> <div className="feature-icon">📊</div>
<h3 className="feature-title">Gene Expression</h3> <h3 className="feature-title">Gene Expression</h3>
<p className="feature-description"> <p className="feature-description">
- Gene expression view and analyze expression patterns and spatial distributions
across developmental stages.
</p> </p>
</Link> </Link>
</div> </div>
@ -42,7 +46,7 @@ const HomePage: React.FC = () => {
<div className="feature-icon">🔬</div> <div className="feature-icon">🔬</div>
<h3 className="feature-title">Resource</h3> <h3 className="feature-title">Resource</h3>
<p className="feature-description"> <p className="feature-description">
- Resources raw datasets and analysis software for the research community.
</p> </p>
</Link> </Link>
</div> </div>
@ -52,7 +56,7 @@ const HomePage: React.FC = () => {
<div className="feature-icon"></div> <div className="feature-icon"></div>
<h3 className="feature-title">Download</h3> <h3 className="feature-title">Download</h3>
<p className="feature-description"> <p className="feature-description">
- Downloads processed data and metadata for the research community.
</p> </p>
</Link> </Link>
</div> </div>
@ -61,38 +65,39 @@ const HomePage: React.FC = () => {
<div className="info-section"> <div className="info-section">
<div className="info-content"> <div className="info-content">
<h3></h3> <h3>Database details</h3>
<p> <p>
Digital Embryo CS7~CS8~CS9~ The Digital Embryo database contains high-resolution spatial transcriptomic data of mouse
embryos at multiple stages including CS7 (early), CS8 (mid), and CS9 (late). Using advanced
spatial transcriptomics, we reveal cell-resolution spatial patterns of gene expression to
support the study of molecular mechanisms in embryonic development.
</p> </p>
<div className="statistics"> <div className="statistics">
<div className="stat-item"> <div className="stat-item">
<span className="stat-number">3</span> <span className="stat-number">3</span>
<span className="stat-label"></span> <span className="stat-label">Developmental stages</span>
</div> </div>
<div className="stat-item"> <div className="stat-item">
<span className="stat-number">1000+</span> <span className="stat-number">1000+</span>
<span className="stat-label"></span> <span className="stat-label">Genes</span>
</div> </div>
<div className="stat-item"> <div className="stat-item">
<span className="stat-number">10000+</span> <span className="stat-number">10000+</span>
<span className="stat-label"></span> <span className="stat-label">Cells</span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div className="citation-section"> <div className="citation-section">
<h3></h3> <h3>How to cite</h3>
<div className="citation-box"> <div className="citation-box">
<p> <p>
Digital Embryo: A spatiotemporal transcriptomic atlas of mouse embryogenesis Digital Embryo: A spatiotemporal transcriptomic atlas of mouse embryogenesis
using advanced spatial transcriptomics. <em>Development</em>, 2024. using advanced spatial transcriptomics. <em>Development</em>, 2024.
</p> </p>
<button className="copy-citation-btn"></button> <button className="copy-citation-btn">Copy citation</button>
</div> </div>
</div> </div>
</div> </div>

View File

@ -6,65 +6,65 @@ const Resource: React.FC = () => {
<div className="page-header"> <div className="page-header">
<h1>Resource</h1> <h1>Resource</h1>
<p className="page-description"> <p className="page-description">
Raw data and analysis software resources for the research community
</p> </p>
</div> </div>
<div className="page-content"> <div className="page-content">
<div className="section"> <div className="section">
<h2></h2> <h2>Data resources</h2>
<div className="resource-grid"> <div className="resource-grid">
<div className="resource-card"> <div className="resource-card">
<h3></h3> <h3>Raw data</h3>
<p> H5AD H5 </p> <p>Complete spatial transcriptomic sequencing data in H5AD and H5 formats.</p>
<ul> <ul>
<li>CS7 (CS7.h5ad)</li> <li>CS7 stage data (CS7.h5ad)</li>
<li>CS8 (CS8.h5ad)</li> <li>CS8 stage data (CS8.h5ad)</li>
<li>CS9 (CS9.h5ad)</li> <li>CS9 stage data (CS9.h5ad)</li>
</ul> </ul>
</div> </div>
<div className="resource-card"> <div className="resource-card">
<h3></h3> <h3>Processed data</h3>
<p></p> <p>Quality-controlled, normalized, and dimension-reduced data ready for downstream analyses.</p>
<ul> <ul>
<li></li> <li>Gene expression matrix</li>
<li></li> <li>Cell type annotations</li>
<li></li> <li>Spatial coordinate information</li>
</ul> </ul>
</div> </div>
</div> </div>
</div> </div>
<div className="section"> <div className="section">
<h2></h2> <h2>Software tools</h2>
<div className="software-grid"> <div className="software-grid">
<div className="software-card"> <div className="software-card">
<h3></h3> <h3>Data processing pipeline</h3>
<p></p> <p>A complete workflow for spatial transcriptomics, including preprocessing, QC, clustering, and visualization.</p>
<div className="software-links"> <div className="software-links">
<a href="#" className="software-link">GitHub </a> <a href="#" className="software-link">GitHub repository</a>
<a href="#" className="software-link">使</a> <a href="#" className="software-link">Documentation</a>
</div> </div>
</div> </div>
<div className="software-card"> <div className="software-card">
<h3></h3> <h3>Visualization tools</h3>
<p> Three.js 3D </p> <p>Three.js-based 3D visualization tools for interactive exploration of spatial expression patterns.</p>
<div className="software-links"> <div className="software-links">
<a href="#" className="software-link">线</a> <a href="#" className="software-link">Online tool</a>
<a href="#" className="software-link">API </a> <a href="#" className="software-link">API docs</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div className="section"> <div className="section">
<h2></h2> <h2>Support</h2>
<div className="support-info"> <div className="support-info">
<p>使</p> <p>If you encounter issues using the data or software, contact us via:</p>
<ul> <ul>
<li>Email: support@digital-embryo.org</li> <li>Email: support@digital-embryo.org</li>
<li>GitHub Issues: 提交技术问题和功能请求</li> <li>GitHub Issues: submit technical issues and feature requests</li>
<li>文档中心: 查看详细的使用指南</li> <li>Docs Center: see detailed user guides</li>
</ul> </ul>
</div> </div>
</div> </div>

View File

@ -6,39 +6,39 @@ const SpatialClustering: React.FC = () => {
<div className="page-header"> <div className="page-header">
<h1>Spatial clustering</h1> <h1>Spatial clustering</h1>
<p className="page-description"> <p className="page-description">
- Spatial clustering analysis search annotations, gene expression, co-expression modules, and regulators in each embryo section
</p> </p>
</div> </div>
<div className="page-content"> <div className="page-content">
<div className="section"> <div className="section">
<h2></h2> <h2>Clustering features</h2>
<div className="clustering-features"> <div className="clustering-features">
<div className="cluster-card"> <div className="cluster-card">
<h3></h3> <h3>Cell type annotation</h3>
<p></p> <p>Automatically identify and annotate cell types based on expression profiles and spatial coordinates.</p>
</div> </div>
<div className="cluster-card"> <div className="cluster-card">
<h3></h3> <h3>Gene co-expression modules</h3>
<p></p> <p>Identify modules of co-expressed genes within the same spatial regions to reveal functional networks.</p>
</div> </div>
<div className="cluster-card"> <div className="cluster-card">
<h3></h3> <h3>Spatial regulators</h3>
<p></p> <p>Analyze spatially specific transcriptional regulation networks to understand tissue formation mechanisms.</p>
</div> </div>
</div> </div>
</div> </div>
<div className="section"> <div className="section">
<h2></h2> <h2>Interactive exploration</h2>
<div className="interactive-notice"> <div className="interactive-notice">
<p>🚧 ...</p> <p>🚧 The interactive spatial clustering tool is under development...</p>
<p></p> <p>Coming soon:</p>
<ul> <ul>
<li></li> <li>Real-time clustering parameter tuning</li>
<li></li> <li>Multiple clustering algorithms</li>
<li></li> <li>Cluster result visualization</li>
<li></li> <li>Differential gene analysis</li>
</ul> </ul>
</div> </div>
</div> </div>

View File

@ -312,18 +312,19 @@ const TemporalAnalysis: React.FC = () => {
return ( return (
<div className="page-container"> <div className="page-container">
<div className="page-header"> <div className="page-header">
<h1></h1> <h1>Temporal Analysis</h1>
<p className="page-description"> <p className="page-description">
Compare cell type distributions across stages to analyze changes and evolutionary patterns during embryonic development.
</p> </p>
</div> </div>
<div className="page-content"> <div className="page-content">
{/* 第一部分:三个发育阶段的细胞类型分布 */} {/* 第一部分:三个发育阶段的细胞类型分布 */}
<div className="section"> <div className="section">
<h2></h2> <h2>Stage comparison</h2>
<p className="flat-section-description"> <p className="flat-section-description">
CS7CS8CS9三个发育阶段的细胞类型3D分布图 The three 3D views below show cell type distributions for CS7, CS8, and CS9.
Compare spatial distributions to observe changes over development.
</p> </p>
<div <div
@ -339,7 +340,7 @@ const TemporalAnalysis: React.FC = () => {
> >
{/* CS7阶段细胞类型分布 */} {/* CS7阶段细胞类型分布 */}
<div className="visualization-container"> <div className="visualization-container">
<h3 style={{ marginBottom: "1rem", textAlign: "center" }}>CS7 - </h3> <h3 style={{ marginBottom: "1rem", textAlign: "center" }}>CS7 - Early developmental stage</h3>
{errorCS7 && <div className="error-message">{errorCS7}</div>} {errorCS7 && <div className="error-message">{errorCS7}</div>}
{cellDataCS7.length > 0 ? ( {cellDataCS7.length > 0 ? (
<PointCloud data={cellDataCS7} isCategorical={true} /> <PointCloud data={cellDataCS7} isCategorical={true} />
@ -348,14 +349,14 @@ const TemporalAnalysis: React.FC = () => {
{loadingCS7 ? ( {loadingCS7 ? (
<div> <div>
<div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🔄</div> <div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🔄</div>
<p>CS7数据...</p> <p>Loading CS7 data...</p>
</div> </div>
) : ( ) : (
<div> <div>
<div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🧬</div> <div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🧬</div>
<p>CS7阶段细胞类型分布</p> <p>CS7 cell type distribution</p>
<p style={{ fontSize: "0.9rem", color: "var(--text-secondary)" }}> <p style={{ fontSize: "0.9rem", color: "var(--text-secondary)" }}>
Early developmental stage
</p> </p>
</div> </div>
)} )}
@ -365,7 +366,7 @@ const TemporalAnalysis: React.FC = () => {
{/* CS8阶段细胞类型分布 */} {/* CS8阶段细胞类型分布 */}
<div className="visualization-container"> <div className="visualization-container">
<h3 style={{ marginBottom: "1rem", textAlign: "center" }}>CS8 - </h3> <h3 style={{ marginBottom: "1rem", textAlign: "center" }}>CS8 - Mid developmental stage</h3>
{errorCS8 && <div className="error-message">{errorCS8}</div>} {errorCS8 && <div className="error-message">{errorCS8}</div>}
{cellDataCS8.length > 0 ? ( {cellDataCS8.length > 0 ? (
<PointCloud data={cellDataCS8} isCategorical={true} /> <PointCloud data={cellDataCS8} isCategorical={true} />
@ -374,14 +375,14 @@ const TemporalAnalysis: React.FC = () => {
{loadingCS8 ? ( {loadingCS8 ? (
<div> <div>
<div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🔄</div> <div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🔄</div>
<p>CS8数据...</p> <p>Loading CS8 data...</p>
</div> </div>
) : ( ) : (
<div> <div>
<div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🧬</div> <div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🧬</div>
<p>CS8阶段细胞类型分布</p> <p>CS8 cell type distribution</p>
<p style={{ fontSize: "0.9rem", color: "var(--text-secondary)" }}> <p style={{ fontSize: "0.9rem", color: "var(--text-secondary)" }}>
Mid developmental stage
</p> </p>
</div> </div>
)} )}
@ -391,7 +392,7 @@ const TemporalAnalysis: React.FC = () => {
{/* CS9阶段细胞类型分布 */} {/* CS9阶段细胞类型分布 */}
<div className="visualization-container"> <div className="visualization-container">
<h3 style={{ marginBottom: "1rem", textAlign: "center" }}>CS9 - </h3> <h3 style={{ marginBottom: "1rem", textAlign: "center" }}>CS9 - Late developmental stage</h3>
{errorCS9 && <div className="error-message">{errorCS9}</div>} {errorCS9 && <div className="error-message">{errorCS9}</div>}
{cellDataCS9.length > 0 ? ( {cellDataCS9.length > 0 ? (
<PointCloud data={cellDataCS9} isCategorical={true} /> <PointCloud data={cellDataCS9} isCategorical={true} />
@ -400,14 +401,14 @@ const TemporalAnalysis: React.FC = () => {
{loadingCS9 ? ( {loadingCS9 ? (
<div> <div>
<div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🔄</div> <div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🔄</div>
<p>CS9数据...</p> <p>Loading CS9 data...</p>
</div> </div>
) : ( ) : (
<div> <div>
<div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🧬</div> <div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🧬</div>
<p>CS9阶段细胞类型分布</p> <p>CS9 cell type distribution</p>
<p style={{ fontSize: "0.9rem", color: "var(--text-secondary)" }}> <p style={{ fontSize: "0.9rem", color: "var(--text-secondary)" }}>
Late developmental stage
</p> </p>
</div> </div>
)} )}
@ -419,9 +420,10 @@ const TemporalAnalysis: React.FC = () => {
{/* 第二部分和第三部分:并排显示 */} {/* 第二部分和第三部分:并排显示 */}
<div className="section"> <div className="section">
<h2></h2> <h2>Flow and gene timeline</h2>
<p className="flat-section-description"> <p className="flat-section-description">
线 The Sankey diagram (left) shows cell type flows across stages; the line chart (right)
shows the proportion changes of the selected gene across cell types.
</p> </p>
<div <div
@ -434,7 +436,7 @@ const TemporalAnalysis: React.FC = () => {
> >
{/* 桑基图部分 */} {/* 桑基图部分 */}
<div className="visualization-container"> <div className="visualization-container">
<h3 style={{ marginBottom: "1rem", textAlign: "center" }}></h3> <h3 style={{ marginBottom: "1rem", textAlign: "center" }}>Cell type flow diagram</h3>
<div style={{ width: "100%", height: "500px", position: "relative" }}> <div style={{ width: "100%", height: "500px", position: "relative" }}>
{sankeyData.nodes.length > 0 && sankeyData.links.length > 0 ? ( {sankeyData.nodes.length > 0 && sankeyData.links.length > 0 ? (
<> <>
@ -466,7 +468,7 @@ const TemporalAnalysis: React.FC = () => {
legends={[]} legends={[]}
motionConfig="gentle" motionConfig="gentle"
/> />
{/* 发育阶段标签行 */} {/* Stage labels */}
<div <div
style={{ style={{
position: "absolute", position: "absolute",
@ -482,13 +484,13 @@ const TemporalAnalysis: React.FC = () => {
}} }}
> >
<div style={{ textAlign: "left", flex: 1, paddingLeft: "20px" }}> <div style={{ textAlign: "left", flex: 1, paddingLeft: "20px" }}>
CS7 - CS7 - Early
</div> </div>
<div style={{ textAlign: "center", flex: 1 }}> <div style={{ textAlign: "center", flex: 1 }}>
CS8 - CS8 - Mid
</div> </div>
<div style={{ textAlign: "right", flex: 1, paddingRight: "20px" }}> <div style={{ textAlign: "right", flex: 1, paddingRight: "20px" }}>
CS9 - CS9 - Late
</div> </div>
</div> </div>
</> </>
@ -497,12 +499,12 @@ const TemporalAnalysis: React.FC = () => {
{sankeyLoading || loadingCS7 || loadingCS8 || loadingCS9 ? ( {sankeyLoading || loadingCS7 || loadingCS8 || loadingCS9 ? (
<div> <div>
<div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🔄</div> <div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🔄</div>
<p>...</p> <p>Building flow diagram...</p>
</div> </div>
) : ( ) : (
<div> <div>
<div style={{ fontSize: "2rem", marginBottom: "1rem" }}>📊</div> <div style={{ fontSize: "2rem", marginBottom: "1rem" }}>📊</div>
<p></p> <p>Waiting for data</p>
</div> </div>
)} )}
</div> </div>
@ -512,7 +514,7 @@ const TemporalAnalysis: React.FC = () => {
{/* 基因时序分析部分 */} {/* 基因时序分析部分 */}
<div className="visualization-container"> <div className="visualization-container">
<h3 style={{ marginBottom: "1rem", textAlign: "center" }}></h3> <h3 style={{ marginBottom: "1rem", textAlign: "center" }}>Gene temporal analysis</h3>
<div style={{ display: "flex", justifyContent: "center", alignItems: "center", marginBottom: "1rem" }}> <div style={{ display: "flex", justifyContent: "center", alignItems: "center", marginBottom: "1rem" }}>
<select <select
value={selectedGene} value={selectedGene}
@ -522,10 +524,10 @@ const TemporalAnalysis: React.FC = () => {
fetchTemporalAnalysis(e.target.value); fetchTemporalAnalysis(e.target.value);
} }
}} }}
title="选择基因进行时序分析" title="Select a gene for temporal analysis"
style={{ padding: "0.5rem", borderRadius: "0.3rem", border: "1px solid #ccc", fontSize: "0.9rem" }} style={{ padding: "0.5rem", borderRadius: "0.3rem", border: "1px solid #ccc", fontSize: "0.9rem" }}
> >
<option value=""></option> <option value="">Please select a gene</option>
{availableGenes.map((gene) => ( {availableGenes.map((gene) => (
<option key={gene} value={gene}> <option key={gene} value={gene}>
{gene} {gene}
@ -538,7 +540,7 @@ const TemporalAnalysis: React.FC = () => {
{temporalLoading ? ( {temporalLoading ? (
<div className="no-data-message"> <div className="no-data-message">
<div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🔄</div> <div style={{ fontSize: "2rem", marginBottom: "1rem" }}>🔄</div>
<p>...</p> <p>Loading temporal data...</p>
</div> </div>
) : temporalError ? ( ) : temporalError ? (
<div className="error-message">{temporalError}</div> <div className="error-message">{temporalError}</div>
@ -561,7 +563,7 @@ const TemporalAnalysis: React.FC = () => {
tickSize: 5, tickSize: 5,
tickPadding: 5, tickPadding: 5,
tickRotation: 0, tickRotation: 0,
legend: '发育阶段', legend: 'Developmental stage',
legendPosition: 'middle', legendPosition: 'middle',
legendOffset: 40 legendOffset: 40
}} }}
@ -569,7 +571,7 @@ const TemporalAnalysis: React.FC = () => {
tickSize: 5, tickSize: 5,
tickPadding: 5, tickPadding: 5,
tickRotation: 0, tickRotation: 0,
legend: '占比 (%)', legend: 'Proportion (%)',
legendPosition: 'middle', legendPosition: 'middle',
legendOffset: -50 legendOffset: -50
}} }}
@ -611,7 +613,7 @@ const TemporalAnalysis: React.FC = () => {
) : ( ) : (
<div className="no-data-message"> <div className="no-data-message">
<div style={{ fontSize: "2rem", marginBottom: "1rem" }}>📊</div> <div style={{ fontSize: "2rem", marginBottom: "1rem" }}>📊</div>
<p></p> <p>Please select a gene to view temporal changes</p>
</div> </div>
)} )}
</div> </div>
@ -620,39 +622,39 @@ const TemporalAnalysis: React.FC = () => {
</div> </div>
<div className="section"> <div className="section">
<h2>使</h2> <h2>User Guide</h2>
<div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(300px, 1fr))", gap: "2rem", marginTop: "1.5rem" }}> <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(300px, 1fr))", gap: "2rem", marginTop: "1.5rem" }}>
<div> <div>
<h3>📅 </h3> <h3>📅 Time-series comparison</h3>
<p>3D图分别展示CS7CS8CS9三个发育阶段的细胞类型分布</p> <p>The three 3D views for CS7, CS8, and CS9 allow intuitive observation of how cell types change over time.</p>
</div> </div>
<div> <div>
<h3>🌊 </h3> <h3>🌊 Interpreting the Sankey diagram</h3>
<p>线便</p> <p>Node size reflects proportions; links show continuity of the same cell type across stages. Colors are consistent to aid tracking.</p>
</div> </div>
<div> <div>
<h3>📊 </h3> <h3>📊 Gene temporal analysis</h3>
<p></p> <p>After selecting a gene, the line chart shows how its proportion changes across cell types, revealing expression dynamics during development.</p>
</div> </div>
<div> <div>
<h3>🖱 </h3> <h3>🖱 Interactions</h3>
<p>3D视图中使用鼠标拖拽旋转视角</p> <p>Rotate with drag, zoom with scroll, click data points for details. Hover over the Sankey and line charts to see exact values.</p>
</div> </div>
<div> <div>
<h3>🎨 </h3> <h3>🎨 Color encoding</h3>
<p>便</p> <p>Identical colors denote the same cell type across charts to make it easy to track changes and flows.</p>
</div> </div>
<div> <div>
<h3>🔍 </h3> <h3>🔍 Developmental pattern identification</h3>
<p></p> <p>Compare stages and genes to identify emergence, disappearance, migration, and differentiation of cell types and their expression dynamics.</p>
</div> </div>
<div> <div>
<h3>📈 </h3> <h3>📈 Percentage analysis</h3>
<p></p> <p>Percentages indicate relative abundance of cell types per stage, helping interpret dynamic composition changes.</p>
</div> </div>
<div> <div>
<h3>🧬 </h3> <h3>🧬 Gene selection strategy</h3>
<p>SOX2NANOG等</p> <p>Select development-related genes (e.g., SOX2, NANOG) to observe expression changes and cell-type specificity during embryogenesis.</p>
</div> </div>
</div> </div>
</div> </div>