Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
7bc36cd
feat(web): Paper tokens in Tailwind, design-system removed, contrast …
malinfossum Sep 9, 2026
26713cc
feat(web): light-first theme init with system fallback and a theme to…
malinfossum Sep 9, 2026
01a26c9
feat(web): self-host Fraunces and Figtree with a vendoring script and…
malinfossum Sep 9, 2026
7de4f85
feat(api): seed the national emergency numbers 110, 112 and 113
malinfossum Sep 9, 2026
0011e81
feat(web): emergency line constants pinned to the seed rows
malinfossum Sep 9, 2026
9bbf84e
feat(web): landing route, results at /sok, legacy redirect, arrival f…
malinfossum Sep 9, 2026
20e5102
fix(web): clear arrival-focus pending flag on any settled state, not …
malinfossum Sep 9, 2026
ba008fa
feat(web): acute strip, sticky header with theme toggle, footer
malinfossum Sep 9, 2026
8eee730
feat(web): landing page with search-first hero, category chips, trust…
malinfossum Sep 9, 2026
5eea92a
fix(i18n): remove false claim that all emergency numbers reach the sa…
malinfossum Sep 9, 2026
8dd94c8
feat(web): municipality combobox on react-aria-components and a filte…
malinfossum Sep 9, 2026
73092cf
fix(web): declare the municipality list pre-filtered to react-aria
malinfossum Sep 9, 2026
468d7f0
fix(web): keep the municipality filter clearable, synced and in Norwe…
malinfossum Sep 9, 2026
edb7639
feat(web): card hierarchy with a call-first action row, skeleton load…
malinfossum Sep 9, 2026
dcce0f8
fix(web): demote catalog error heading to h2 when another state renders
malinfossum Sep 9, 2026
83d5981
feat(web): detail page with the call button as hero and a stateful ba…
malinfossum Sep 9, 2026
cb96843
fix(web): give the missing-resource state a real h1 and stop test sta…
malinfossum Sep 9, 2026
7dad4ed
feat(web): restyled empty, error and not-found states with axe covera…
malinfossum Sep 9, 2026
209cd55
feat(web): lazy-load results and detail routes, measure and document …
malinfossum Sep 9, 2026
6b28e6b
fix(web): reserve height for sok's filter sidebar and loading skeleto…
malinfossum Sep 9, 2026
bdf1e94
fix(web): 44px emergency tap targets and no reserved gap above the ou…
malinfossum Sep 9, 2026
38210ea
fix(web): next verification pass is 2027-02-17, not 2026-02-17
malinfossum Sep 9, 2026
40e40ce
fix(web): name the combobox toggle by its action and drop the dead pi…
malinfossum Sep 9, 2026
ac4a56d
test(web): pin the fallback numbers and category slugs to the seed, g…
malinfossum Sep 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,8 @@
# platform default (CRLF on Windows, per api/.editorconfig).
* text=auto
web/** text=auto eol=lf

# The vendored fonts under web/public/fonts/ are the first binary files under web/. text=auto
# is a heuristic that normally leaves woff2 alone, but a heuristic is the wrong guarantee for
# files whose corruption would only surface at deploy, so I mark them binary explicitly.
web/public/fonts/*.woff2 binary
20 changes: 16 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,14 @@ The full audit trail is in [docs/verification/](docs/verification/). Phone numbe
belonging to named individuals are never published, and shelters that withhold their
address for safety are listed without one by design. Every row is re-verified against its
source every six months, and the date shown as "Sist bekreftet" is the date of that check.
The four numbers on the acute strip live in `web/src/services/emergency.ts` as constants
(the landing page fetches nothing) and are re-verified in the same six-month pass as the
rows; a test keeps them identical to seed rows 3 and 23–25.

## Stack

- API: ASP.NET Core (.NET 10), EF Core, PostgreSQL 17
- Web: React, TypeScript, Vite
- Web: React 19, TypeScript, Vite, Tailwind v4, react-aria-components
- Hosting (planned): Azure

## API
Expand All @@ -53,9 +56,13 @@ application logs record result counts, never search terms.

## Web

Unified search across name, category and municipality, with suggestions and a national
toggle. Details on the shift from fastlege to legevakt after hours, when a service's own
opening hours are known. Bilingual throughout, built for keyboard access, and built mobile-first.
The landing page is search-first: one box, nine category chips, and no data fetched until
you act on it. Above every page sits an acute strip with the four emergency numbers as
hardcoded constants, not a fetch, so it works even if the API is down. Unified search across
name, category and municipality, with suggestions and a national toggle. Details on the
shift from fastlege to legevakt after hours, when a service's own opening hours are known.
Bilingual throughout, built for keyboard access, and built mobile-first. Lighthouse ≥ 95 on
the simulated phone is part of the definition of done; the measured numbers are in each PR.

## Run locally

Expand All @@ -79,6 +86,11 @@ standard local development setup (`localhost`, `postgres`/`postgres`); override
`VARDE_TEST_PG` environment variable. The web dev server expects the API at
`http://localhost:5005` by default (`VITE_API_URL` to override).

Fraunces and Figtree are vendored into `web/public/fonts/`, so `npm install` is enough for a
normal checkout. Only run `npm run fonts` if you bump the `@fontsource/*` package versions —
it re-copies the woff2 files from `node_modules` and a drift test catches a checkout that
forgets to.

## Deployment

Varde deploys automatically on merge to `main`: the frontend to **Azure Static Web Apps**
Expand Down
Loading
Loading