Update deps

This commit is contained in:
Andras Schmelczer 2026-02-07 19:07:18 +00:00
parent 7ad5b66856
commit ec29631c44
7 changed files with 58 additions and 19 deletions

1
.gitignore vendored
View file

@ -8,3 +8,4 @@ tfl_journey_client
server-rs/target
.task
data
frontend/public/assets

View file

@ -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`

View file

@ -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",

View file

@ -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",

View file

@ -50,5 +50,5 @@ module.exports = {
},
},
},
plugins: [require('tailwindcss-animate')],
plugins: [],
};

View file

@ -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
View file

@ -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"