fix: correct typo and extract shared Notice component

Fix typo "Arrangemtns" to "Arrangements" in figure captions
for all 16 TE*.json dataset files.

Extract a reusable Notice component from Contact and News pages
to avoid duplicated inline notice markup.

Replace react-helmet-async with @dr.pogodin/react-helmet.

Add VS Code workspace config and cspell dictionary.
This commit is contained in:
2026-06-11 00:59:27 +09:00
parent d73f4ef2b9
commit 3f684a90b4
32 changed files with 175 additions and 83 deletions
+1 -2
View File
@@ -23,8 +23,7 @@ dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
#.vscode
.idea
.DS_Store
*.suo
+16
View File
@@ -0,0 +1,16 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "chrome",
"request": "launch",
"name": "Launch Chrome against localhost",
"url": "http://localhost:5173",
"webRoot": "${workspaceFolder}",
"preLaunchTask": "npm: dev"
}
]
}
+38
View File
@@ -0,0 +1,38 @@
{
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.biome": "explicit"
},
"[css]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[javascript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[javascriptreact]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[json]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[jsonc]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescriptreact]": {
"editor.defaultFormatter": "biomejs.biome"
},
// Extensions - Biome
// - see: biome.json
// Exteions - cSpell
// - see: .cspell.json
// Extensions - ESLint
"eslint.enable": false,
// Extensions - HTML
"html.format.wrapLineLength": 0,
// Extentions - Typescript
"javascript.updateImportsOnFileMove.enabled": "always",
"typescript.updateImportsOnFileMove.enabled": "always"
}
+20
View File
@@ -0,0 +1,20 @@
{
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "dev",
"isBackground": true,
"problemMatcher": {
"owner": "custom",
"pattern": { "regexp": "^$" },
"background": {
"activeOnStart": true,
"beginsPattern": ".*",
"endsPattern": "Local:"
}
},
"label": "npm: dev"
}
]
}
+33
View File
@@ -0,0 +1,33 @@
{
"version": "0.2",
"language": "en,en-GB",
"words": [
"Aergic",
"astrocytes",
"celloc",
"Ebina",
"Flpe",
"geometory",
"glutamatergic",
"Hioki",
"Hirosawa",
"Imayoshi",
"Kameda",
"Kaneko",
"Kimura",
"NOWEBGL",
"pogodin",
"RIKEN",
"Saitama",
"SDCN",
"Sohya",
"Tadaharu",
"Teppei",
"Tsumoto",
"VGAT",
"Wako",
"webgl",
"Yanagawa"
],
"ignorePaths": ["dist", "node_modules", "package-lock.json"]
}
+1 -1
View File
@@ -7,7 +7,7 @@
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="CelLoc-3D is a database of the 3D arrangement of neocortical cells (gultamatargic/excitatory, GABAergic/inhibitory and/or astrocytes) identified in vivo in layer 2/3 of the primary visual cortex of the mouse by two-photon imaging."
content="CelLoc-3D is a database of the 3D arrangement of neocortical cells (glutamatergic/excitatory, GABAergic/inhibitory and/or astrocytes) identified in vivo in layer 2/3 of the primary visual cortex of the mouse by two-photon imaging."
/>
<link rel="manifest" href="/manifest.json" />
<title>CelLoc3D Server</title>
+26 -51
View File
@@ -1,19 +1,19 @@
{
"name": "celloc3d",
"version": "3.0.0",
"version": "3.0.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "celloc3d",
"version": "3.0.0",
"version": "3.0.1",
"dependencies": {
"@dr.pogodin/react-helmet": "^3.2.2",
"@reduxjs/toolkit": "^2.12.0",
"ky": "^2.0.2",
"react": "^19.2.7",
"react-dom": "^19.2.7",
"react-ga4": "^3.0.1",
"react-helmet-async": "^3.0.0",
"react-redux": "^9.3.0",
"react-router-dom": "^7.17.0",
"redux": "^5.0.1",
@@ -233,7 +233,6 @@
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz",
"integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -457,6 +456,19 @@
"dev": true,
"license": "Apache-2.0"
},
"node_modules/@dr.pogodin/react-helmet": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/@dr.pogodin/react-helmet/-/react-helmet-3.2.2.tgz",
"integrity": "sha512-ejHvL56wsjNRfzOWvBzBXZXKCls2beMIf63Cz1yEMi5OFfsdBQHEiy0ux6665qzPXXAqHws4tnnWRiA/fpaQBg==",
"license": "Apache-2.0",
"dependencies": {
"@babel/runtime": "^7.29.2",
"react-compiler-runtime": "^1.0.0"
},
"peerDependencies": {
"react": "19"
}
},
"node_modules/@emnapi/core": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
@@ -2100,15 +2112,6 @@
"node": ">=0.8.19"
}
},
"node_modules/invariant": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
"integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
"license": "MIT",
"dependencies": {
"loose-envify": "^1.0.0"
}
},
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -2143,6 +2146,7 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true,
"license": "MIT"
},
"node_modules/jsesc": {
@@ -2505,18 +2509,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"license": "MIT",
"dependencies": {
"js-tokens": "^3.0.0 || ^4.0.0"
},
"bin": {
"loose-envify": "cli.js"
}
},
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -2741,6 +2733,15 @@
"node": ">=0.10.0"
}
},
"node_modules/react-compiler-runtime": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/react-compiler-runtime/-/react-compiler-runtime-1.0.0.tgz",
"integrity": "sha512-rRfjYv66HlG8896yPUDONgKzG5BxZD1nV9U6rkm+7VCuvQc903C4MjcoZR4zPw53IKSOX9wMQVpA1IAbRtzQ7w==",
"license": "MIT",
"peerDependencies": {
"react": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^0.0.0-experimental"
}
},
"node_modules/react-dom": {
"version": "19.2.7",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz",
@@ -2753,32 +2754,12 @@
"react": "^19.2.7"
}
},
"node_modules/react-fast-compare": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
"integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==",
"license": "MIT"
},
"node_modules/react-ga4": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/react-ga4/-/react-ga4-3.0.1.tgz",
"integrity": "sha512-GyCc01bSheWXjzGDyHsXMOqk/SP5Cf/JrcJTg4hcpKx4eeSwaJKpJUc+ipF4ffLTZkmabmf3ZGBv4OKHTXNXyA==",
"license": "MIT"
},
"node_modules/react-helmet-async": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-3.0.0.tgz",
"integrity": "sha512-nA3IEZfXiclgrz4KLxAhqJqIfFDuvzQwlKwpdmzZIuC1KNSghDEIXmyU0TKtbM+NafnkICcwx8CECFrZ/sL/1w==",
"license": "Apache-2.0",
"dependencies": {
"invariant": "^2.2.4",
"react-fast-compare": "^3.2.2",
"shallowequal": "^1.1.0"
},
"peerDependencies": {
"react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
@@ -2924,12 +2905,6 @@
"integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
"license": "MIT"
},
"node_modules/shallowequal": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
"integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==",
"license": "MIT"
},
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "celloc3d",
"version": "3.0.0",
"version": "3.0.1",
"private": true,
"type": "module",
"scripts": {
@@ -12,12 +12,12 @@
"preview": "vite preview"
},
"dependencies": {
"@dr.pogodin/react-helmet": "^3.2.2",
"@reduxjs/toolkit": "^2.12.0",
"ky": "^2.0.2",
"react": "^19.2.7",
"react-dom": "^19.2.7",
"react-ga4": "^3.0.1",
"react-helmet-async": "^3.0.0",
"react-redux": "^9.3.0",
"react-router-dom": "^7.17.0",
"redux": "^5.0.1",
+1 -1
View File
@@ -3,7 +3,7 @@
"author": "Ebina, T., Sohya, K., Imayoshi, I., Yin, S.T., Kimura, R., Yanagawa, Y., Kameda, H., Hioki, H., Kaneko, T., and Tsumoto, T.",
"figure": {
"file": "\/data\/TE0001.png",
"caption": "3D Arrangemtns of cells in TE0001"
"caption": "3D Arrangements of cells in TE0001"
},
"download": "\/data\/TE0001.dat",
"view": "\/data\/TE0001\/viewer",
+1 -1
View File
@@ -3,7 +3,7 @@
"author": "Ebina, T., Sohya, K., Imayoshi, I., Yin, S.T., Kimura, R., Yanagawa, Y., Kameda, H., Hioki, H., Kaneko, T., and Tsumoto, T.",
"figure": {
"file": "\/data\/TE0002.png",
"caption": "3D Arrangemtns of cells in TE0002"
"caption": "3D Arrangements of cells in TE0002"
},
"download": "\/data\/TE0002.dat",
"view": "\/data\/TE0002\/viewer",
+1 -1
View File
@@ -3,7 +3,7 @@
"author": "Ebina, T., Sohya, K., Imayoshi, I., Yin, S.T., Kimura, R., Yanagawa, Y., Kameda, H., Hioki, H., Kaneko, T., and Tsumoto, T.",
"figure": {
"file": "\/data\/TE0003.png",
"caption": "3D Arrangemtns of cells in TE0003"
"caption": "3D Arrangements of cells in TE0003"
},
"download": "\/data\/TE0003.dat",
"view": "\/data\/TE0003\/viewer",
+1 -1
View File
@@ -3,7 +3,7 @@
"author": "Ebina, T., Sohya, K., Imayoshi, I., Yin, S.T., Kimura, R., Yanagawa, Y., Kameda, H., Hioki, H., Kaneko, T., and Tsumoto, T.",
"figure": {
"file": "\/data\/TE0004.png",
"caption": "3D Arrangemtns of cells in TE0004"
"caption": "3D Arrangements of cells in TE0004"
},
"download": "\/data\/TE0004.dat",
"view": "\/data\/TE0004\/viewer",
+1 -1
View File
@@ -3,7 +3,7 @@
"author": "Ebina, T., Sohya, K., Imayoshi, I., Yin, S.T., Kimura, R., Yanagawa, Y., Kameda, H., Hioki, H., Kaneko, T., and Tsumoto, T.",
"figure": {
"file": "\/data\/TE0005.png",
"caption": "3D Arrangemtns of cells in TE0005"
"caption": "3D Arrangements of cells in TE0005"
},
"download": "\/data\/TE0005.dat",
"view": "\/data\/TE0005\/viewer",
+1 -1
View File
@@ -3,7 +3,7 @@
"author": "Ebina, T., Sohya, K., Imayoshi, I., Yin, S.T., Kimura, R., Yanagawa, Y., Kameda, H., Hioki, H., Kaneko, T., and Tsumoto, T.",
"figure": {
"file": "\/data\/TE0006.png",
"caption": "3D Arrangemtns of cells in TE0006"
"caption": "3D Arrangements of cells in TE0006"
},
"download": "\/data\/TE0006.dat",
"view": "\/data\/TE0006\/viewer",
+1 -1
View File
@@ -3,7 +3,7 @@
"author": "Ebina, T., Sohya, K., Imayoshi, I., Yin, S.T., Kimura, R., Yanagawa, Y., Kameda, H., Hioki, H., Kaneko, T., and Tsumoto, T.",
"figure": {
"file": "\/data\/TE0007.png",
"caption": "3D Arrangemtns of cells in TE0007"
"caption": "3D Arrangements of cells in TE0007"
},
"download": "\/data\/TE0007.dat",
"view": "\/data\/TE0007\/viewer",
+1 -1
View File
@@ -3,7 +3,7 @@
"author": "Ebina, T., Sohya, K., Imayoshi, I., Yin, S.T., Kimura, R., Yanagawa, Y., Kameda, H., Hioki, H., Kaneko, T., and Tsumoto, T.",
"figure": {
"file": "\/data\/TE0008.png",
"caption": "3D Arrangemtns of cells in TE0008"
"caption": "3D Arrangements of cells in TE0008"
},
"download": "\/data\/TE0008.dat",
"view": "\/data\/TE0008\/viewer",
+1 -1
View File
@@ -3,7 +3,7 @@
"author": "Ebina, T., Sohya, K., Imayoshi, I., Yin, S.T., Kimura, R., Yanagawa, Y., Kameda, H., Hioki, H., Kaneko, T., and Tsumoto, T.",
"figure": {
"file": "\/data\/TE0009.png",
"caption": "3D Arrangemtns of cells in TE0009"
"caption": "3D Arrangements of cells in TE0009"
},
"download": "\/data\/TE0009.dat",
"view": "\/data\/TE0009\/viewer",
+1 -1
View File
@@ -3,7 +3,7 @@
"author": "Ebina, T., Sohya, K., Imayoshi, I., Yin, S.T., Kimura, R., Yanagawa, Y., Kameda, H., Hioki, H., Kaneko, T., and Tsumoto, T.",
"figure": {
"file": "\/data\/TE0010.png",
"caption": "3D Arrangemtns of cells in TE0010"
"caption": "3D Arrangements of cells in TE0010"
},
"download": "\/data\/TE0010.dat",
"view": "\/data\/TE0010\/viewer",
+1 -1
View File
@@ -3,7 +3,7 @@
"author": "Ebina, T., Sohya, K., Imayoshi, I., Yin, S.T., Kimura, R., Yanagawa, Y., Kameda, H., Hioki, H., Kaneko, T., and Tsumoto, T.",
"figure": {
"file": "\/data\/TE0011.png",
"caption": "3D Arrangemtns of cells in TE0011"
"caption": "3D Arrangements of cells in TE0011"
},
"download": "\/data\/TE0011.dat",
"view": "\/data\/TE0011\/viewer",
+1 -1
View File
@@ -3,7 +3,7 @@
"author": "Ebina, T., Sohya, K., Imayoshi, I., Yin, S.T., Kimura, R., Yanagawa, Y., Kameda, H., Hioki, H., Kaneko, T., and Tsumoto, T.",
"figure": {
"file": "\/data\/TE0012.png",
"caption": "3D Arrangemtns of cells in TE0012"
"caption": "3D Arrangements of cells in TE0012"
},
"download": "\/data\/TE0012.dat",
"view": "\/data\/TE0012\/viewer",
+1 -1
View File
@@ -3,7 +3,7 @@
"author": "Ebina, T., Sohya, K., Imayoshi, I., Yin, S.T., Kimura, R., Yanagawa, Y., Kameda, H., Hioki, H., Kaneko, T., and Tsumoto, T.",
"figure": {
"file": "\/data\/TE0013.png",
"caption": "3D Arrangemtns of cells in TE0013"
"caption": "3D Arrangements of cells in TE0013"
},
"download": "\/data\/TE0013.dat",
"view": "\/data\/TE0013\/viewer",
+1 -1
View File
@@ -3,7 +3,7 @@
"author": "Ebina, T., Sohya, K., Imayoshi, I., Yin, S.T., Kimura, R., Yanagawa, Y., Kameda, H., Hioki, H., Kaneko, T., and Tsumoto, T.",
"figure": {
"file": "\/data\/TE0014.png",
"caption": "3D Arrangemtns of cells in TE0014"
"caption": "3D Arrangements of cells in TE0014"
},
"download": "\/data\/TE0014.dat",
"view": "\/data\/TE0014\/viewer",
+1 -1
View File
@@ -3,7 +3,7 @@
"author": "Ebina, T., Sohya, K., Imayoshi, I., Yin, S.T., Kimura, R., Yanagawa, Y., Kameda, H., Hioki, H., Kaneko, T., and Tsumoto, T.",
"figure": {
"file": "\/data\/TE0015.png",
"caption": "3D Arrangemtns of cells in TE0015"
"caption": "3D Arrangements of cells in TE0015"
},
"download": "\/data\/TE0015.dat",
"view": "\/data\/TE0015\/viewer",
+1 -1
View File
@@ -3,7 +3,7 @@
"author": "Ebina, T., Sohya, K., Imayoshi, I., Yin, S.T., Kimura, R., Yanagawa, Y., Kameda, H., Hioki, H., Kaneko, T., and Tsumoto, T.",
"figure": {
"file": "\/data\/TE0016.png",
"caption": "3D Arrangemtns of cells in TE0016"
"caption": "3D Arrangements of cells in TE0016"
},
"download": "\/data\/TE0016.dat",
"view": "\/data\/TE0016\/viewer",
-4
View File
@@ -7,10 +7,6 @@
.contact p {
margin: 5px 0 15px 15px;
}
.notice {
margin: 10px 0 20px;
color: #ff0000;
}
.note {
margin-left: 15px;
font-style: italic;
+2 -3
View File
@@ -1,6 +1,7 @@
import type React from 'react';
import { useEffect } from 'react';
import { useAppDispatch } from '../../app/hooks';
import Notice from '../notice/Notice';
import { setTitle } from '../page-title/pageTitleSlice';
import styles from './Contact.module.css';
@@ -11,9 +12,7 @@ const Contact: React.FC = () => {
}, [dispatch]);
return (
<div className={styles.contact}>
<section className={styles.notice}>
Notice: This site has been archived since May 2019 and is no longer updated.
</section>
<Notice />
<h4>CelLoc-3D is managed by Teppei Ebina and Tadaharu Tsumoto</h4>
<p>
Laboratory for cortical circuit plasticity
+2 -2
View File
@@ -1,8 +1,8 @@
.news {
margin: 10px;
margin: 20px;
}
.item {
margin: 0 10px 10px 10px;
margin: 0 0 10px 0;
}
.item:after {
content: ".";
+2
View File
@@ -3,6 +3,7 @@ import { useEffect } from 'react';
import { useAppDispatch } from '../../app/hooks';
import JsonNews_ from '../../assets/news.json';
import nl2br from '../../utils/nl2br';
import Notice from '../notice/Notice';
import { setTitle } from '../page-title/pageTitleSlice';
import styles from './News.module.css';
@@ -23,6 +24,7 @@ const News: React.FC = () => {
return (
<div className={styles.news}>
<Notice />
{JsonNews.map((item, key) => {
return (
// biome-ignore lint/suspicious/noArrayIndexKey: static JSON data
+4
View File
@@ -0,0 +1,4 @@
.notice {
margin: 10px 0 20px;
color: #ff0000;
}
+10
View File
@@ -0,0 +1,10 @@
import type React from 'react';
import styles from './Notice.module.css';
const Notice: React.FC = () => {
return (
<section className={styles.notice}>This site has been archived since May 2019 and is no longer updated.</section>
);
};
export default Notice;
+1 -1
View File
@@ -1,5 +1,5 @@
import { Helmet } from '@dr.pogodin/react-helmet';
import type React from 'react';
import { Helmet } from 'react-helmet-async';
import { useAppSelector } from '../../app/hooks';
import styles from './PageTitle.module.css';
import { selectPageTitle } from './pageTitleSlice';
+1 -1
View File
@@ -1,6 +1,6 @@
import { HelmetProvider } from '@dr.pogodin/react-helmet';
import React from 'react';
import ReactDOM from 'react-dom/client';
import { HelmetProvider } from 'react-helmet-async';
import { Provider } from 'react-redux';
import App from './App';
import { store } from './app/store';