Update deps
This commit is contained in:
parent
7ad5b66856
commit
ec29631c44
7 changed files with 58 additions and 19 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -8,3 +8,4 @@ tfl_journey_client
|
|||
server-rs/target
|
||||
.task
|
||||
data
|
||||
frontend/public/assets
|
||||
|
|
|
|||
17
CLAUDE.md
17
CLAUDE.md
|
|
@ -15,11 +15,14 @@ All commands use [Task](https://taskfile.dev) runner. Python uses `uv run`. Fron
|
|||
```bash
|
||||
# Development servers
|
||||
task dev:server # Rust backend on :8001 (cargo run --release)
|
||||
task dev:frontend # Webpack dev server on :3000 (proxies /api to :8001)
|
||||
task dev:frontend # Webpack dev server on :3001 (proxies /api to :8001)
|
||||
|
||||
# Data pipeline
|
||||
task prepare # Build wide.parquet from all pre-downloaded sources
|
||||
|
||||
# Assets
|
||||
task download:map-assets # Download font glyphs + twemoji PNGs into frontend/public/assets/
|
||||
|
||||
# Quality
|
||||
task lint # Lint all: Python (ruff) + TypeScript (ESLint+Prettier) + Rust (clippy+fmt)
|
||||
task format # Auto-fix formatting for all languages
|
||||
|
|
@ -130,10 +133,10 @@ React 18 + TypeScript. deck.gl `H3HexagonLayer` over MapLibre GL. TailwindCSS. N
|
|||
- `POSTCODE_ZOOM_THRESHOLD = 15`: below 15 shows H3 hexagons, at/above 15 shows postcode polygons
|
||||
- Viewport bounds computed via `getBoundsFromViewState()` in `map-utils.ts` — uses Web Mercator math with **TILE_SIZE=512** (MapLibre/deck.gl convention, NOT 256)
|
||||
- Properties pane uses feature names from API response (human-readable), not hardcoded field names
|
||||
- Proxy: dev server on :3000 proxies `/api` to :8001; also handles VS Code `/proxy/PORT` patterns
|
||||
- Proxy: dev server on :3001 proxies `/api` to :8001; also handles VS Code `/proxy/PORT` patterns
|
||||
|
||||
**Shared UI Components (`frontend/src/components/ui/`):**
|
||||
- `Icons.tsx` — Central icon library (CloseIcon, InfoIcon, EyeIcon, PlusIcon, ChevronIcon, FilterIcon, LightbulbIcon). All icons accept `className` prop for sizing.
|
||||
- `icons/` — One file per icon (CloseIcon, InfoIcon, EyeIcon, PlusIcon, ChevronIcon, FilterIcon, LightbulbIcon, DownloadIcon, MapPinIcon, CheckIcon, ClipboardIcon, SunIcon, MoonIcon, SpinnerIcon). All accept `className` prop. **Never inline SVGs** — always extract to this folder.
|
||||
- `IconButton.tsx` — Reusable icon button wrapper with consistent hover states. Accepts `active` prop for teal highlight.
|
||||
- `SearchInput.tsx` — Styled search input with dark mode support. Used in Filters, POIPane, PropertiesPane.
|
||||
- `PaneHeader.tsx` — Reusable pane header with title, optional subtitle, info button, and close button.
|
||||
|
|
@ -221,9 +224,11 @@ Every UI element must use the correct token from this table. Do not invent new p
|
|||
- Deck.gl postcode labels (RGB arrays): `[220,220,220,220]` text / `[30,30,30,200]` outline in dark; inverse in light.
|
||||
|
||||
**Map basemaps:**
|
||||
- Light: `https://basemaps.cartocdn.com/gl/voyager-gl-style/style.json`
|
||||
- Dark: `https://basemaps.cartocdn.com/gl/dark-matter-gl-style/style.json`
|
||||
- `handleMapLoad` must only apply label/water tweaks in light mode. Dark Matter has good defaults.
|
||||
- Self-hosted Protomaps tiles served from PMTiles via `/api/tiles/{z}/{x}/{y}`
|
||||
- Style built by `@protomaps/basemaps` library with `namedFlavor(theme)` for light/dark
|
||||
- Font glyphs and twemoji PNGs served locally from `frontend/public/assets/` (no external CDN deps at runtime)
|
||||
- `CopyWebpackPlugin` copies `frontend/public/` → `dist/` on build; Rust `ServeDir` fallback serves them in prod
|
||||
- Download assets with `task download:map-assets` (script: `scripts/download_map_assets.py`)
|
||||
|
||||
**HomePage (landing page):**
|
||||
- Page bg: `bg-warm-50 dark:bg-warm-900`
|
||||
|
|
|
|||
30
frontend/package-lock.json
generated
30
frontend/package-lock.json
generated
|
|
@ -17,6 +17,7 @@
|
|||
"@radix-ui/react-select": "^2.0.0",
|
||||
"@radix-ui/react-slider": "^1.1.0",
|
||||
"maplibre-gl": "^4.0.0",
|
||||
"pocketbase": "^0.26.8",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-map-gl": "^7.1.0"
|
||||
|
|
@ -33,6 +34,7 @@
|
|||
"@typescript-eslint/parser": "^7.0.0",
|
||||
"autoprefixer": "^10.4.0",
|
||||
"babel-loader": "^10.0.0",
|
||||
"copy-webpack-plugin": "^13.0.1",
|
||||
"css-loader": "^7.0.0",
|
||||
"eslint": "^8.57.0",
|
||||
"eslint-plugin-react": "^7.34.0",
|
||||
|
|
@ -6136,6 +6138,29 @@
|
|||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/copy-webpack-plugin": {
|
||||
"version": "13.0.1",
|
||||
"resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-13.0.1.tgz",
|
||||
"integrity": "sha512-J+YV3WfhY6W/Xf9h+J1znYuqTye2xkBUIGyTPWuBAT27qajBa5mR4f8WBmfDY3YjRftT2kqZZiLi1qf0H+UOFw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"glob-parent": "^6.0.1",
|
||||
"normalize-path": "^3.0.0",
|
||||
"schema-utils": "^4.2.0",
|
||||
"serialize-javascript": "^6.0.2",
|
||||
"tinyglobby": "^0.2.12"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 18.12.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/webpack"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"webpack": "^5.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/core-assert": {
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/core-assert/-/core-assert-0.2.1.tgz",
|
||||
|
|
@ -10726,6 +10751,11 @@
|
|||
"node": ">=16.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/pocketbase": {
|
||||
"version": "0.26.8",
|
||||
"resolved": "https://registry.npmjs.org/pocketbase/-/pocketbase-0.26.8.tgz",
|
||||
"integrity": "sha512-aQ/ewvS7ncvAE8wxoW10iAZu6ElgbeFpBhKPnCfvRovNzm2gW8u/sQNPGN6vNgVEagz44kK//C61oKjfa+7Low=="
|
||||
},
|
||||
"node_modules/possible-typed-array-names": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
"name": "property-map-frontend",
|
||||
"version": "1.0.0",
|
||||
"scripts": {
|
||||
"dev": "webpack serve --mode development --port 3000",
|
||||
"dev": "webpack serve --mode development --port 3001",
|
||||
"build": "webpack --mode production && node scripts/prerender.mjs",
|
||||
"build:no-prerender": "webpack --mode production",
|
||||
"prerender": "node scripts/prerender.mjs",
|
||||
|
|
@ -22,6 +22,7 @@
|
|||
"@radix-ui/react-select": "^2.0.0",
|
||||
"@radix-ui/react-slider": "^1.1.0",
|
||||
"maplibre-gl": "^4.0.0",
|
||||
"pocketbase": "^0.26.8",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-map-gl": "^7.1.0"
|
||||
|
|
@ -38,6 +39,7 @@
|
|||
"@typescript-eslint/parser": "^7.0.0",
|
||||
"autoprefixer": "^10.4.0",
|
||||
"babel-loader": "^10.0.0",
|
||||
"copy-webpack-plugin": "^13.0.1",
|
||||
"css-loader": "^7.0.0",
|
||||
"eslint": "^8.57.0",
|
||||
"eslint-plugin-react": "^7.34.0",
|
||||
|
|
|
|||
|
|
@ -50,5 +50,5 @@ module.exports = {
|
|||
},
|
||||
},
|
||||
},
|
||||
plugins: [require('tailwindcss-animate')],
|
||||
plugins: [],
|
||||
};
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ dependencies = [
|
|||
"shapely>=2.0.0",
|
||||
"rasterio>=1.5.0",
|
||||
"pyproj>=3.7.2",
|
||||
"pyshp>=2.3.0",
|
||||
]
|
||||
|
||||
[tool.uv]
|
||||
|
|
|
|||
22
uv.lock
generated
22
uv.lock
generated
|
|
@ -1122,15 +1122,6 @@ wheels = [
|
|||
{ url = "https://files.pythonhosted.org/packages/6b/2b/55d980cfa2c93bd40ff4c290bf824d792bd41d2fe3487b07707559071760/numpy-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7b6b5e28bbd47b7532698e5db2fe1db693d84b58c254e4389d99a27bb9b8f6b", size = 18330053, upload-time = "2026-01-10T06:44:34.617Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "odfpy"
|
||||
version = "1.4.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "defusedxml", marker = "python_full_version < '3.14' and sys_platform == 'linux'" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/97/73/8ade73f6749177003f7ce3304f524774adda96e6aaab30ea79fd8fda7934/odfpy-1.4.1.tar.gz", hash = "sha256:db766a6e59c5103212f3cc92ec8dd50a0f3a02790233ed0b52148b70d3c438ec", size = 717045, upload-time = "2020-01-18T16:55:48.852Z" }
|
||||
|
||||
[[package]]
|
||||
name = "osmium"
|
||||
version = "4.2.0"
|
||||
|
|
@ -1355,13 +1346,13 @@ dependencies = [
|
|||
{ name = "jupyter", marker = "python_full_version < '3.14' and sys_platform == 'linux'" },
|
||||
{ name = "matplotlib", marker = "python_full_version < '3.14' and sys_platform == 'linux'" },
|
||||
{ name = "numpy", marker = "python_full_version < '3.14' and sys_platform == 'linux'" },
|
||||
{ name = "odfpy", marker = "python_full_version < '3.14' and sys_platform == 'linux'" },
|
||||
{ name = "osmium", marker = "python_full_version < '3.14' and sys_platform == 'linux'" },
|
||||
{ name = "pandas", marker = "python_full_version < '3.14' and sys_platform == 'linux'" },
|
||||
{ name = "plotly", marker = "python_full_version < '3.14' and sys_platform == 'linux'" },
|
||||
{ name = "polars", marker = "python_full_version < '3.14' and sys_platform == 'linux'" },
|
||||
{ name = "pyarrow", marker = "python_full_version < '3.14' and sys_platform == 'linux'" },
|
||||
{ name = "pyproj", marker = "python_full_version < '3.14' and sys_platform == 'linux'" },
|
||||
{ name = "pyshp", marker = "python_full_version < '3.14' and sys_platform == 'linux'" },
|
||||
{ name = "python-dateutil", marker = "python_full_version < '3.14' and sys_platform == 'linux'" },
|
||||
{ name = "rasterio", marker = "python_full_version < '3.14' and sys_platform == 'linux'" },
|
||||
{ name = "scipy", marker = "python_full_version < '3.14' and sys_platform == 'linux'" },
|
||||
|
|
@ -1386,13 +1377,13 @@ requires-dist = [
|
|||
{ name = "jupyter", specifier = ">=1.0.0" },
|
||||
{ name = "matplotlib", specifier = ">=3.10.8" },
|
||||
{ name = "numpy", specifier = ">=1.26.0" },
|
||||
{ name = "odfpy", specifier = ">=1.4.1" },
|
||||
{ name = "osmium", specifier = ">=4.0.0" },
|
||||
{ name = "pandas", specifier = ">=2.0.0" },
|
||||
{ name = "plotly", specifier = ">=6.5.2" },
|
||||
{ name = "polars", specifier = ">=1.37.1" },
|
||||
{ name = "pyarrow", specifier = ">=15.0.0" },
|
||||
{ name = "pyproj", specifier = ">=3.7.2" },
|
||||
{ name = "pyshp", specifier = ">=2.3.0" },
|
||||
{ name = "python-dateutil", specifier = ">=2.8.0" },
|
||||
{ name = "rasterio", specifier = ">=1.5.0" },
|
||||
{ name = "scipy", specifier = ">=1.17.0" },
|
||||
|
|
@ -1528,6 +1519,15 @@ wheels = [
|
|||
{ url = "https://files.pythonhosted.org/packages/42/fb/538a4d2df695980e2dde5c04d965fbdd1fe8c20a3194dc4aaa3952a4d1be/pyproj-3.7.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:47d87db2d2c436c5fd0409b34d70bb6cdb875cca2ebe7a9d1c442367b0ab8d59", size = 10895724, upload-time = "2025-08-14T12:05:35.465Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pyshp"
|
||||
version = "3.0.3"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/8c/20/8b07bae73aaa0c3f5a2683ba6e23b46e977e2d33a88126d56bbcc2d135cd/pyshp-3.0.3.tar.gz", hash = "sha256:bf4678b13dd53578ed87669676a2fffeccbcded1ec8ff9cafb36d1b660f4b305", size = 2192568, upload-time = "2025-11-28T17:47:31.616Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/82/06/cad54e8ce758bd836ee5411691cbd49efeb9cc611b374670fce299519334/pyshp-3.0.3-py3-none-any.whl", hash = "sha256:28c8fac8c0c25bb0fecbbfd10ead7f319c2ff2f3b0b44a94f22bd2c93510ad42", size = 58465, upload-time = "2025-11-28T17:47:30.328Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pytest"
|
||||
version = "9.0.2"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue