wrongmove/frontend
Viktor Barzin fad834c20b ui: harden a11y, plurals, NaN guards, map viewport persistence
Surgical UX/a11y fixes layered on top of the team's UI redesign,
keeping the teal palette and FilterBar architecture intact.

- TaskIndicator: NaN-safe progressPercentage (Number.isFinite +
  clamp 0..100). No more "NaN%" when a task posts undefined progress.
- StreamingProgressBar: same NaN guard on the inline width calc.
- StatsBar: pluralize listings ("1 listing" / "30 listings"), drop
  the duplicated "Avg:" label (now "Avg price" / "<n>/m²" / "Size"),
  tabular-nums on every numeric.
- FilterPanel furnishing pills: aria-pressed + data-state for
  screen readers and tests.
- ListView sort buttons: aria-pressed + aria-sort
  (ascending/descending/none); listing count pluralizes
  ("1 property" / "N properties") with tabular-nums.
- Map: only fitBounds the FIRST time data loads (hasFittedOnceRef).
  The previous lastDataLengthRef-based gate refit when results
  went N → 0 → M, blowing away the user's pan/zoom.

Verified: tsc --noEmit clean, 125/125 vitest specs pass.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 18:52:49 +00:00
..
public Move hexgrid heatmap computation to Web Worker 2026-02-22 15:04:37 +00:00
src ui: harden a11y, plurals, NaN guards, map viewport persistence 2026-05-10 18:52:49 +00:00
.dockerignore Expand frontend .dockerignore to exclude build artifacts 2026-02-21 19:51:04 +00:00
.env.sample Flatten repo structure: move crawler/ to root, remove vqa/ and immoweb/ 2026-02-07 23:01:20 +00:00
.gitignore Flatten repo structure: move crawler/ to root, remove vqa/ and immoweb/ 2026-02-07 23:01:20 +00:00
Caddyfile.dev Flatten repo structure: move crawler/ to root, remove vqa/ and immoweb/ 2026-02-07 23:01:20 +00:00
components.json Flatten repo structure: move crawler/ to root, remove vqa/ and immoweb/ 2026-02-07 23:01:20 +00:00
Dockerfile Parallelize frontend tests in Drone pipeline with 4 shards 2026-02-21 21:02:22 +00:00
eslint.config.js Flatten repo structure: move crawler/ to root, remove vqa/ and immoweb/ 2026-02-07 23:01:20 +00:00
index.html Move hexgrid heatmap computation to Web Worker 2026-02-22 15:04:37 +00:00
nginx.conf Fix stale browser cache after redeployment with proper nginx cache headers 2026-02-08 22:51:11 +00:00
package-lock.json chore: add react-router-dom dependency for URL-based navigation 2026-02-28 15:58:39 +00:00
package.json chore: add react-router-dom dependency for URL-based navigation 2026-02-28 15:58:39 +00:00
README.md Flatten repo structure: move crawler/ to root, remove vqa/ and immoweb/ 2026-02-07 23:01:20 +00:00
start.sh Flatten repo structure: move crawler/ to root, remove vqa/ and immoweb/ 2026-02-07 23:01:20 +00:00
tsconfig.app.json Move hexgrid heatmap computation to Web Worker 2026-02-22 15:04:37 +00:00
tsconfig.app.tsbuildinfo fix: remove unused imports flagged by TypeScript 2026-02-28 16:23:36 +00:00
tsconfig.json Flatten repo structure: move crawler/ to root, remove vqa/ and immoweb/ 2026-02-07 23:01:20 +00:00
tsconfig.node.json Remove JS obfuscator that broke Mapbox GL map rendering 2026-02-08 22:47:01 +00:00
tsconfig.node.tsbuildinfo Flatten repo structure: move crawler/ to root, remove vqa/ and immoweb/ 2026-02-07 23:01:20 +00:00
vite.config.ts Remove JS obfuscator that broke Mapbox GL map rendering 2026-02-08 22:47:01 +00:00
vitest.config.ts Fix frontend CI pipeline OOM kills and test timeouts 2026-02-17 21:46:29 +00:00

React + TypeScript + Vite

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:

Expanding the ESLint configuration

If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:

export default tseslint.config({
  extends: [
    // Remove ...tseslint.configs.recommended and replace with this
    ...tseslint.configs.recommendedTypeChecked,
    // Alternatively, use this for stricter rules
    ...tseslint.configs.strictTypeChecked,
    // Optionally, add this for stylistic rules
    ...tseslint.configs.stylisticTypeChecked,
  ],
  languageOptions: {
    // other options...
    parserOptions: {
      project: ['./tsconfig.node.json', './tsconfig.app.json'],
      tsconfigRootDir: import.meta.dirname,
    },
  },
})

You can also install eslint-plugin-react-x and eslint-plugin-react-dom for React-specific lint rules:

// eslint.config.js
import reactX from 'eslint-plugin-react-x'
import reactDom from 'eslint-plugin-react-dom'

export default tseslint.config({
  plugins: {
    // Add the react-x and react-dom plugins
    'react-x': reactX,
    'react-dom': reactDom,
  },
  rules: {
    // other rules...
    // Enable its recommended typescript rules
    ...reactX.configs['recommended-typescript'].rules,
    ...reactDom.configs.recommended.rules,
  },
})