Commit graph

90 commits

Author SHA1 Message Date
ecbb12f39d Beads: utsett bok (#8 F-Droid-metadata) på ubestemt tid
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FrDGDmN2WAXvNPS85rWJGK
2026-08-17 13:39:35 +02:00
da677b27c7 Bump versjon til v1.11.1 (versionCode 19) v1.11.1
Feilrettingsutgivelse: romnr som autoritativ ID (#15) med Room v2 /
IndexedDB v2, som også retter duplikatrad og tapt markørhøylysing etter
«Oppdater data» på Android.

- versionCode 18 → 19, versionName 1.11.0 → 1.11.1
- User-Agent Tilfluktsrom/1.11.1
- fastlane changelogs/19.txt (en/nb/nn)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FrDGDmN2WAXvNPS85rWJGK
2026-08-17 13:34:54 +02:00
c3ab73c915 Gjør romnr til autoritativ tilfluktsrom-ID (Room-PK og IndexedDB-key)
Produktbeslutning (Forgejo #15): romnr — DSBs romnummer — er den
autoritative IDen. lokalId regenereres av Geonorge ved hver eksport og
beholdes bare som informasjonsfelt; det skal aldri sammenlignes eller
nøkles på. Utredningen mot Geonorge/DSB droppes.

Dette retter også en reell feil på Android: etter «Oppdater data» holdt
selectedShelter det gamle objektet med utdatert lokalId, så
rebuildShelterList() la til en duplikatrad med «utenfor nærområdet»-
badge for et rom som var blant de nærmeste, og markørhøylysingen mistet
målet (markørkartet var nøklet på nye lokalId-er).

Android:
- Shelter: @PrimaryKey romnr; lokalId vanlig kolonne
- ShelterDatabase: versjon 2 + fallbackToDestructiveMigration() — tabellen
  er ren cache som reseedes fra asset når den er tom
- Parsere (GeoJSON + bundled): krever romnr > 0, lokalId valgfri
- MainActivity: markørkart Map<Int, Marker>, høylysing og
  isSelectedAmongNearest/indexOfFirst på romnr
- ShelterListAdapter: DiffUtil areItemsTheSame på romnr

PWA:
- shelter-db.ts: DB_VERSION 2, keyPath 'romnr', upgrade sletter og
  gjenoppretter store ved oldVersion < 2
- map-view.ts: _shelterRomnr i stedet for _shelterLokalId
- types.ts: dokumentert identitet; fetch-shelters.ts hopper over
  features uten romnr (speiler Android-parseren)

ARCHITECTURE.md: nytt avsnitt «Shelter identity — romnr is authoritative»,
felt-tabell, valideringsregel og IndexedDB-skjema oppdatert.

Verifisert: emulator med v1.10.2-DB → migrering til v2 + reseed (556 rom);
velg rad 2 → Oppdater → ingen duplikatrad, valg og høylysing beholdt.
Playwright: seedet v1-IndexedDB → app oppgraderer til v2 (keyPath romnr,
556 poster, get(1681) treffer), dyplenke og markør OK.

Forgejo: #15

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FrDGDmN2WAXvNPS85rWJGK
2026-08-17 13:30:25 +02:00
5b463f0ca6 Beads: lukk jvn (#5 kapasitetsfilter) som wontfix
Kapasitetstallene er ikke sikre nok til å ha denne typen verdi, og i en
krisesituasjon er det umulig å vite hvor mange ledige plasser det er.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FrDGDmN2WAXvNPS85rWJGK
2026-08-17 13:20:15 +02:00
fc82d88835 Bump versjon til v1.11.0 (versionCode 18) v1.11.0
Ny funksjon (åpne i kartapp) pluss fire feilrettinger siden v1.10.2:
- Android: kartapp-knapp med geo:-intent (#2), desimalkomma i
  delingstekst (#20), hybrid dyplenke-liste med badge (#13/#18),
  synlig posisjonspil (#16)
- PWA: hybrid dyplenke-liste med badge (#17), dyplenker ved kald
  førstelast (#19)

- versionCode 17 → 18, versionName 1.10.2 → 1.11.0
- User-Agent Tilfluktsrom/1.11.0
- fastlane changelogs/18.txt (en/nb/nn, ≤500 tegn)
- README + full_description: «Åpne i kartapp» i funksjonslista

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FrDGDmN2WAXvNPS85rWJGK
2026-08-17 13:11:57 +02:00
32af7e04c4 Fiks desimalkomma i delingsteksten sin geo:-URI ved norsk locale
share_body brukte %3$.6f/%4$.6f, og Resources.getString() formaterer med
ressurs-locale — nb/nn gir desimalkomma, så delingsteksten inneholdt
"geo:59,918829,10,734887" (ugyldig URI) og en tvetydig koordinatlinje.
Bekreftet med jshell (Formatter + Locale nb) og på emulator.

Fiks: shareShelter() pre-formaterer lat/lon med Locale.US og sender dem
som %3$s/%4$s. Samme regel som openInMapApp() (daf8b62). PWA-en var
ikke rammet (toFixed er locale-uavhengig).

Verifisert i delingsarket på emulator (nb): "geo:59.918829,10.734887".

Forgejo: #20

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FrDGDmN2WAXvNPS85rWJGK
2026-08-17 13:02:18 +02:00
daf8b62d39 Åpne valgt tilfluktsrom i ekstern kartapp for gangvei
Ny knapp (ic_directions) ved siden av del-knappen i bunnarket. Fyrer
ACTION_VIEW med geo:lat,lon?q=lat,lon(Tilfluktsrom – adresse), som
håndteres av enhver installert kartapp — inkludert offline-kapable
OsmAnd/Organic Maps, viktig ved degradert nett. Ingen vendor-URL-er.

- Koordinater formateres med Locale.US så norsk systemspråk ikke gir
  desimalkomma i URI-en
- Fallback: ActivityNotFoundException → koordinater kopieres til
  klippebordet + Toast (navigate_no_map_app). startActivity+catch brukes
  framfor resolveActivity() for å slippe <queries> (pakkesynlighet API 30+)
- Strenger action_navigate / navigate_no_map_app i en/nb/nn
- 48dp berøringsflate og contentDescription som de andre ikonknappene

Verifisert på emulator (Pixel 6 API 35): trykk → START ACTION_VIEW
geo: → Google Maps åpnes.

Forgejo: #2

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FrDGDmN2WAXvNPS85rWJGK
2026-08-17 13:00:23 +02:00
2a0c9b49ce PWA: absolutte stier så dyplenker virker ved kald førstelast
shelter-repository.ts hentet './data/shelters.json' relativt. Under
/shelter/{romnr} løses det til /shelter/data/shelters.json; SPA-fallback
svarer med index.html (200 text/html), response.json() kaster,
refreshData() returnerer false og loadData() avbryter før
handleDeepLink() — førstegangsbesøkende via delt lenke fikk «Fant ikke
tilfluktsrommet» og tom liste.

Samme rotårsak i index.html (manifest.webmanifest, icons/icon-192.png)
og i manifestet (start_url/scope ".", icons "icons/…"): under en
dyplenke-rute ble manifestet index.html og «legg til på startskjerm»
uteble.

- shelter-repository.ts: `${import.meta.env.BASE_URL}data/shelters.json`
- index.html: /manifest.webmanifest, /icons/icon-192.png
- manifest.webmanifest: start_url "/", scope "/", icons "/icons/…"

Verifisert i ny Playwright-kontekst (tom IndexedDB): /shelter/1681 laster
/data/shelters.json (200 application/json), lista fylles og rommet velges.

Forgejo: #19

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FrDGDmN2WAXvNPS85rWJGK
2026-08-17 12:50:56 +02:00
6a50d86266 PWA: vis dyplenket tilfluktsrom nederst i lista med badge (hybrid)
Speiler Android-fiksen i 1fb9f14/337e9b9. Når en dyplenke eller
markørtap velger et tilfluktsrom utenfor de N nærmeste, ble det tidligere
unshift-et inn på indeks 0 og framstod som nærmest — uten forklaring.

Nå:
- app.ts: push i stedet for unshift på begge steder, valgt indeks = siste;
  ny modultilstand outsideNearestRomnr og renderShelterList()-helper
- shelter-list.ts: updateList() tar outsideNearestRomnr, tegner badge på
  den raden, prefikser badge-teksten i aria-label (samme rekkefølge som
  contentDescription i ShelterListAdapter.kt) og scrollIntoView() til
  valgt rad (auto i stedet for smooth ved prefers-reduced-motion)
- main.css: .shelter-item-badge med #BF360C (= warning_bg på Android,
  ~5.6:1 mot hvit → WCAG 2.2 AA SC 1.4.3)
- i18n en/nb/nn: shelter_outside_nearest_badge

Verifisert i Chromium (Playwright): posisjon Oslo, dyplenke /shelter/1681
(Vardø) → tre nærmeste først, fjerde rad med badge, selected og
aria-label "Selected (outside nearest). Kaigaten 8 …, 1487.1 km …".

Forgejo: #17

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FrDGDmN2WAXvNPS85rWJGK
2026-08-17 12:48:41 +02:00
5365c99bf5 Initial baseline for scheduled romnr-stabilitet-sjekk
Generert lokalt fra Geonorge-eksporten 2026-04-30: 556 tilfluktsrom,
hver med {lokalId, sha256(easting, northing, plasser, adresse)}.

Brukes av den ukentlige remote-routinen
(trig_01CjSBymeghmUfXFZ9QR7oGE, mandag 08:00 Oslo) som diff-grunnlag.
Når DSB legger til/fjerner/flytter tilfluktsrom, vil routinen sende et
Gmail-utkast med diff og oppdatert snapshot — etter triage commiter
brukeren ny baseline manuelt.

Bakgrunn: Forgejo-issue #15 / beads tilfluktsrom-jmv.
2026-04-30 13:37:02 +02:00
890ea96ed8 Beads: defer jmv (Geonorge lokalId-utredning) til 2026-10-30
Praktisk konsekvens er løst — delingslenker bruker romnr. Resterende
arbeid er kommunikasjon mot Geonorge/DSB, ikke kritisk.
2026-04-30 13:16:44 +02:00
337e9b96c2 Bytt badge-bakgrunn til warning_bg for WCAG 2.2 AA-kontrast
Hvit fet 11sp tekst på shelter_primary (#FF6B35) gav ~2.84:1 kontrast,
under SC 1.4.3-terskelen på 4.5:1 for normaltekst (og marginalt under
3:1 for large text). warning_bg (#BF360C) er allerede dokumentert i
colors.xml med ~5.5:1 mot hvit.

Forgejo: #18
2026-04-29 16:55:15 +02:00
3f0c958b98 Beads: speil Android badge-kontrast-saken (#18 / 7zc) 2026-04-29 16:54:06 +02:00
40da1dfd6c Beads: speil PWA-saken (#17 / efo) 2026-04-29 16:52:24 +02:00
1fb9f14ad4 Vis dyplenket tilfluktsrom i lista, selv utenfor topp-3 (hybrid)
Når en dyplenke (eller markørtap) velger et tilfluktsrom som ikke er
blant de N nærmeste, blir det nå appendet til bunnpanelets liste med
et tydelig "Valgt – utenfor nærområdet"-badge, og lista scroller til
den valgte raden. Hvis valget er innenfor topp-N, scrollelementet
fortsatt synes — løser begge symptomene som rapporten pekte på.

Endringer:
- Ny ShelterListItem(swd, isOutsideNearest)-wrapper i adapteren
- ShelterListAdapter: viser badge + a11y-suffiks når isOutsideNearest=true
- item_shelter.xml: badge-TextView (orange bakgrunn, hvit tekst, gone som default)
- MainActivity: rebuildShelterList()-helper bygger top-N + maybe-appended,
  smoothScrollToPosition(selectedIdx) sikrer synlig markering
- Strings i en/nb/nn

Forgejo: #13
2026-04-29 16:49:28 +02:00
b31537df2c Beads: oppdater issues.jsonl etter at #16 (5vc) er lukket
Speiler statusendringen fra Dolt-databasen til snapshot-filen i git.
2026-04-29 16:15:36 +02:00
d2291a2d35 Fiks usynlig retningspil for brukerlokasjon på lyse kart
OSMDroid sin MyLocationNewOverlay brukte stock hvit person- og pil-
bitmap, som forsvant på lyse tiles (snø, sand, lyse OSM-temaer). Bytter
inn appens orange tema med hvit halo og myk skygge — silhuetten holder
≥3:1 kontrast (WCAG 2.2 AA, ikke-tekstlig innhold) mot både lyse og
mørke underlag.

- ic_user_dot.xml: stillestående (orange dot, hvit ring)
- ic_user_arrow.xml: i bevegelse (orange chevron, hvit kontur)
- drawableToBitmap-helper konverterer vector → Bitmap for OSMDroid
- setPersonAnchor/setDirectionAnchor (0.5, 0.5) sentrerer rotasjon

Forgejo: #16
2026-04-29 16:14:53 +02:00
91dd89c03d Verktøyoppsett: beads-issuetracker, AGENTS.md og Claude-innstillinger
Initialiserer beads (bd) som lokalt issue-spor med Dolt-historikk, og
legger til AGENTS.md + .claude/settings.json for konsistent agent-oppsett
på tvers av økter. Forgejo forblir kanonisk for offentlig samarbeid;
beads speiler issuene lokalt for AI-agent-bruk.

Endringer:
- .beads/: konfig, hooks, og initial issues.jsonl (11 saker speilet fra Forgejo, #1 og #7 lukket)
- .gitignore: ekskluder .dolt/, *.db og .beads-credential-key
- AGENTS.md: agentvennlig oppsummering av prosjektkonvensjoner
- CLAUDE.md: beads-integrasjonsblokk + sesjonsavslutningsprotokoll
- .claude/settings.json: Claude Code-innstillinger for prosjektet

Holder fdroid/-katalogen utenfor — F-Droid-distribusjon er pauset.
2026-04-29 16:03:50 +02:00
fbe8e53141 Om-dialog: lenker til Geonorge kartkatalog og DSB produktark
Legg til klikkbare lenker under "Datakilder" i Om-dialogen så brukarar
kan finne metadata, oppdateringsfrekvens og kvalitetsinfo om
tilfluktsrom-datasettet direkte hjå kjeldene.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 17:00:23 +02:00
83d406a6aa Bump versjon til v1.10.2 (versionCode 17) v1.10.2
PWA-utgivelse: synleg del-ikon og deferred autoupdate. Ingen
funksjonelle endringar i Android-koden — versjonsmetadata følgjer
PWA-en for samkøyrde utgivingsmerke.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 16:28:38 +02:00
c603e81b2a PWA: synleg del-ikon og ekte autoupdate utan å avbryte aktiv bruk
- Bytt del-knappen frå tekstpila ↪ til ein innebygd Material-stil
  SVG (20×20). Den førre Unicode-pila vart teikna mykje mindre enn
  ℹ og ↻ av dei fleste fontar — no har alle tre ikona same visuelle
  vekt på tvers av nettlesarar og operativsystem.
- Lagt til ein controllerchange-lyttar som utløyser ein omlasting
  *neste* gong appen vert lagt i bakgrunnen (visibilityState ===
  'hidden'), ikkje umiddelbart. Slik tek nye distribusjonar effekt
  utan brukarinngrep, men utan å rive vekk skjermen midt i ein
  tilfluktsromnavigering. registerType: 'autoUpdate' åleine sørgjer
  for at den nye SW-en skipWaiting + clientsClaim, men det reload-ar
  ikkje den allereie køyrande JavaScripten — denne lyttaren stettar
  det utan å bryte noregisseringsflyt.

Påverkar ikkje fråkopla bruk: omlasting skjer berre etter at ein ny
SW har vorte aktivert, og ein ny SW kan berre installerast medan
nettverket er tilgjengeleg. Sjølve omlastinga løyser alle ressursar
frå presjekken og fungerer fråkopla.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 16:28:31 +02:00
948625b777 Bump versjon til v1.10.1 (versionCode 16) v1.10.1
Punktutgivelse med stabile djuplenker (romnr i staden for lokalId),
PWA-deling, og fiks for hengande oppdater-knapp og gjentatt
kart-bufferspørsmål.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 16:11:34 +02:00
3d6f8f362e Stabile djuplenker og fleire bruksforbetringar
- Bytt djuplenkjenøkkel frå lokalId til romnr fordi Geonorge
  regenererer lokalId-UUID-en på kvar eksport (556/556 endra på sju
  dagar), medan romnr er DSB sin stabile rom-nummer-nøkkel. Dokumentert
  i ARCHITECTURE.md.
- PWA: ny del-knapp som genererer same HTTPS-djuplenke som Android-appen
  (Web Share API med utklippstavle-fallback).
- PWA: vald tilfluktsrom overlever no posisjonsoppdateringar og
  manuell dataoppdatering — sporast på romnr i staden for lista.
- Android: kart-bufferspørsmålet dukkar berre opp éin gong per økt
  ("Hopp over" sit), og forceRefresh viser lasteoverlegg + hindrar
  samtidige refresh-kall.
- i18n.ts: vakta DOM-skriving slik at vitest køyrer utan jsdom.
- Oppdatert pakka tilfluktsromdata frå Geonorge.

Refs #15

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 16:11:28 +02:00
87ac698d55 Legg til fastlane-endringslogg for v1.10.0
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 13:47:17 +02:00
262fafe9e0 Bump versjon til v1.10.0 (versionCode 15) v1.10.0
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 13:27:35 +02:00
42c28df102 PWA: iOS-hjemskjermhint, kompass-feilmelding og zoom-fiks
- Fjern maximum-scale/user-scalable på viewport slik at siden kan
  zoomes (WCAG 1.4.4). Leaflet håndterer gestikk på kartet selv.
- Legg til Apple-meta-tagger for standalone-modus og statuslinje.
- Vis engangsbanner på iOS Safari om å legge til på hjemskjerm,
  siden iOS ikke støtter beforeinstallprompt.
- Gi tydelig statusmelding når bruker avslår kompasstilgang i
  stedet for å stille reversere til kartmodus.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 13:22:21 +02:00
f0c4a1f5b4 Actionable banner når posisjon ikke er tilgjengelig
Tidligere sto statusteksten igjen på «Venter på GPS…» uansett om
årsaken var manglende tillatelse, avslåtte stedstjenester eller
bare at GPS-en ikke hadde fått fix ennå. For en nødsituasjonsapp
er det en reell feilmodus: brukeren får ingen hint om hva som kan
gjøres for å finne nærmeste tilfluktsrom.

Ny noLocationBanner plasseres øverst i innholdsområdet (rett under
statuslinjen) slik at den ikke kolliderer med de flytende
handlingsknappene over bunnarket, og viser én av tre tilstander:

1. Tillatelse avslått eller ikke gitt — «Posisjonstilgang
   nødvendig for å finne nærmeste tilfluktsrom. Du kan også
   trykke på et merke i kartet.» + «Gi tilgang» som åpner
   ACTION_APPLICATION_DETAILS_SETTINGS.
2. Tillatelse gitt, men stedstjenester slått av — «Stedstjenester
   er slått av. Aktiver dem eller velg et tilfluktsrom fra
   kartet.» + «Aktiver» som åpner ACTION_LOCATION_SOURCE_SETTINGS.
3. Begge OK — banner er skjult og den eksisterende «Venter på
   GPS…»-teksten gjelder.

Helperen updateLocationStatusBanner() kalles fra loadData(),
permission-result-kallbacket og onResume(), slik at banneret
oppdaterer seg både ved appstart, umiddelbart etter avslag, og
når brukeren kommer tilbake fra systeminnstillingene.
AlertDialog-en ved permanent avslag er fjernet til fordel for det
ikke-modale banneret, som lar brukeren fortsatt pan-ne kartet og
velge tilfluktsrom manuelt. Toasten på mykt avslag er beholdt som
en kort bekreftelse. API-nivå-fallbacket bruker
LocationManager.isLocationEnabled på API 28+, isProviderEnabled
for GPS/Network på API 26–27.

Verifisert på emulator i alle fire tilstander (avslag → App
Settings, tjeneste-av → Posisjonsinnstillinger, gjenopprettet).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 10:32:02 +02:00
7ce0827e9f Fjern utdatert notis om 24-timers GPS-utløp i README
Linjen under «Sikkerhet» beskrev 24-timers-grensen på
widget_prefs-cachen som ble fjernet sammen med widgeten i
forrige commit. Appen persisterer nå ikke GPS-posisjon
overhodet, så linjen er erstattet med «GPS-posisjon lagres
ikke — den brukes bare i minnet mens appen er i bruk», som
samsvarer med den allerede oppdaterte teksten i
about_stored_body.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 10:02:14 +02:00
0743eac9dd Fjern hjemmeskjerm-widget
Widgeten har vært en vedlikeholdskostnad uten et klart produktformål:
den duplikerte lokasjonslogikken fra hovedappen, kunne vise inntil
24 timer gammel GPS-posisjon uten alderindikator, og krevde en egen
WorkManager-periodisk oppdatering. Den strategiske vurderingen
(2026-04-17) konkluderte med at den samme nytten kan leveres via
app-åpning eller en lettere mekanisme senere, og at flaten bør
krympes før pitch mot offentlig sektor.

Denne endringen fjerner widget/-pakken for begge flavors
(standard + fdroid), AppWidgetProvider-mottakeren i manifestet,
WidgetUpdateWorker, androidx.work:work-runtime-ktx-avhengigheten,
widget_prefs SharedPreferences-lagringen i MainActivity, samt
widget_*-strenger og linjen om «for hjemmeskjerm-widgeten» i
about-dialogen. Dokumentasjonen i CLAUDE.md, ARCHITECTURE.md,
README.md, STANDING_ON_SHOULDERS.md og fastlane-beskrivelsene
er justert tilsvarende. Historiske changelogs (v3, v5, v6, v7)
er bevisst urørt — de beskriver korrekt hva som ble levert i
de versjonene.

Eksisterende widget-plasseringer på brukernes hjemmeskjerm
forsvinner automatisk neste gang appen oppdateres; Android
fjerner foreldreløse provider-komponenter uten migreringskode.
Begge debug-flavors bygger rent etter endringen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 09:57:45 +02:00
4e6c03c301 Bump versjon til v1.9.1 (versionCode 14) v1.9.1
Patch-utgave som inneholder rettelsen av N-indikatoren i
kompassvisningen. User-Agent og «Dato for siste gjennomgang» i
ACCESSIBILITY.md oppdatert i samsvar.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 19:13:56 +02:00
1303a74d25 Fiks klipping av N-indikator i kompassvisning
Nordindikatoren («N»-merket) ble plassert på en sirkel med radius
min(w,h) * 0,54 fra senter. I stående kompassvisning er dette
bredere enn viewporten, så indikatoren havnet utenfor skjermen når
brukeren vendte omtrent 90° eller 270°.

Ny hjelpefunksjon clampIndicatorRadius finner avstanden fra
sentrum til nærmeste viewport-kant i nordretningen, og klamper
radiusen slik at hele «N»-etiketten holder seg innenfor rammen
uansett rotasjonsvinkel. Seks nye unittester dekker
grensetilfeller, inkludert en sweep over alle 360° som fanget opp
en float-presisjonsartefakt ved 240°.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 19:13:27 +02:00
0efb599b8c Bump versjon til v1.9.0 (versionCode 13) v1.9.0
Publiserer a11y-utbedringene fra forrige commit. User-Agent i
ShelterRepository er oppdatert til å matche versjonen.

I ACCESSIBILITY.md er de fire utbedrede WCAG-avvikene flyttet
fra §3.1 til et nytt §7 Historikk under versjon 1.9.0. §3.1
slår nå fast at ingen gjenværende avvik er identifisert utover
§3.2 (uforholdsmessig byrde på Leaflet-kartet). Uutilsynet/Digdir
er bekreftet som riktig tilsynsmyndighet.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 19:05:46 +02:00
e4f44ede97 Utbedre WCAG 2.2 AA-avvik og legg til tilgjengelighetserklæring
Fire WCAG-avvik utbedret før appen kan lisensieres til offentlig
sektor (WAD / EN 301 549):

- SC 1.4.3: Advarselsbanner til #BF360C (~5,5:1 mot hvit, var 3,75:1).
- SC 2.4.7: defaultFocusHighlightEnabled i temaet; ikonknapper
  bruker bundet selectableItemBackground.
- SC 4.1.2: DirectionArrowView rapporterer ImageView-rolle og
  annonserer retning + avstand til TalkBack når en 45°-sektor
  krysses, med 750 ms-struping mot spam.
- SC 2.3.3: Snapper til nærmeste 45° når brukeren har slått av
  animasjoner (ANIMATOR_DURATION_SCALE=0).

Nye retningsstrenger i nb/nn/en. JVM-unittester for
sektoraritmetikken sikrer grensetilfeller (negative vinkler,
360°-overgang, vilkårlige vinkler).

ACCESSIBILITY.md dokumenterer tilgjengelighetserklæring etter
WAD artikkel 7, i bokmål med engelsk preambel og
vedlikeholdsjekkliste.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 19:02:55 +02:00
22fad9e1db Fjern shelters.json frå git-sporing
Fila vart lagt til .gitignore i 012da23 men var framleis spora.
Ho vert generert av `bun run fetch-shelters` og skal ikkje versjonerast.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 16:44:11 +01:00
029cfa45f9 Bump versjon til v1.8.0 (versionCode 12) v1.8.0
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 16:39:16 +01:00
015bc0d926 Bytt djuplenkjer frå tilfluktsrom:// til HTTPS App Links
SMS-appar gjenkjenner ikkje eigendefinerte URI-skjema som klikkbare
lenkjer. Brukar no https://tilfluktsrom.naiv.no/shelter/{id} som
opnar appen direkte (Android App Links med autoVerify) eller fell
tilbake til PWA i nettlesaren.

Android: DEEP_LINK_DOMAIN i build.gradle.kts, HTTPS intent-filter,
oppdatert handleDeepLinkIntent og shareShelter med HTTPS-URL.

PWA: assetlinks.json for Android-verifisering, djuplenkjehandtering
i app.ts, base-sti endra frå './' til '/', config.ts for domene.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 16:37:13 +01:00
ae249d5d47 Dokumenter arkitektur for Android-app og PWA
Beskriver designprinsipp, datapipeline, plattformspesifikke
implementasjonsdetaljar, delte algoritmar (Haversine, UTM-konvertering),
fråkobla-først-strategi og sikkerheit/personvern.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 16:04:49 +01:00
7d40c9e9a8 Fiks PWA: sivilforsvarsinfo, knappetekst og kompassvisning
- Info-knappen (ℹ) åpner nå sivilforsvarsdialog med alle 5 steg,
  med «Om»-lenke i bunnen (som Android-appen)
- Laste-overleggets knapper («Lagre kart» / «Hopp over») får
  tekst fra i18n i stedet for å være tomme
- Kompassvisningen resizes canvas når den blir synlig, fikser
  0×0-canvas når den initialiseres mens containeren er skjult

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 15:51:42 +01:00
012da23628 Legg shelters.json til .gitignore
Filen genereres ved bygging fra Geonorge-data og skal ikke
spores i git.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 15:41:19 +01:00
85c3d6953c Gjør PWA-stier relative for fleksibel utrulling
Appen kan nå serveres både på / og under en understi som
/tilfluktsrom uten endringer.

- Sett base: './' i vite.config.ts
- Endre alle absolutte stier i index.html til relative
- Oppdater manifest.webmanifest med start_url: "." og scope: "."
- navigateFallback uten ledende skråstrek

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 15:35:39 +01:00
8e6dbb6b24 Dokumenter utgivelsesprosess med PWA-distribusjon
Legger til Release Process-seksjon i CLAUDE.md med:
- Steg-for-steg for å lage ny utgivelse
- Bygging av Android APK-er og PWA-tarball
- fj release create og fj release asset create syntaks
- Oppdatert Distribution-seksjon med PWA-tarball

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 15:30:24 +01:00
4a95e0e23f Fjern unpkg CDN-avhengigheit og legg til slett-buffer-knapp
Leaflet vendora:
- Fjerna CDN <link> for Leaflet CSS (allereie bundla via npm-import)
- Kartmarkør-ikon brukar bundla bilete i staden for unpkg URL-ar
- CSP stramma: unpkg ikkje lenger naudsynt i style-src/img-src

Slett buffer:
- «Slett lagra data»-knapp i om-dialogen
- Slettar localStorage, IndexedDB og tenestararbeidar-bufferar
- Lokalisert til en/nb/nn

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 15:10:30 +01:00
97225d1e77 Bump versjon til v1.7.0 (versionCode 11) v1.7.0
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 15:03:19 +01:00
a829742fe6 Dokumenter bruk av emulator og Maestro for skjermbilete
Legg til Screenshots-seksjon i CLAUDE.md med:
- Emulatoroppsett (AVD, headless start, fake GPS)
- Maestro v2.3.0 for repeterbare skjermbiletesekvensar
- Fastlane-mappestiar for alle tre språk
- Liste over gjeldande skjermbilete

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 15:00:44 +01:00
73937c163d Oppdater skjermbilete og README med nye funksjonar
Nye skjermbilete frå emulator (Bergen sentrum):
- Kartvisning, valt tilfluktsrom, kompass med nordindikator,
  sivilforsvarsinfo, og ny om-side med personvernerklæring

README oppdatert:
- Femte skjermbilete (om-side) lagt til
- Nordindikator og tilgjengelegheit nemnde i funksjonslista
- Datakjelde retta: DSB, distribuert via Geonorge
- Sikkerheitsavsnittet utfylt med CSP, 24t GPS-utløp, User-Agent
- Personvernavsnittet utvida

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 14:57:26 +01:00
b34408bc7b Rett datakjelde: tilfluktsromdata kjem frå DSB, ikkje Geonorge
Geonorge er distribusjonsplattforma, men dataeigar er DSB
(Direktoratet for samfunnstryggleik og beredskap). Oppdatert
om-side og personverntekst i alle tre språk (en/nb/nn) for
både Android og PWA.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 14:31:47 +01:00
c1ac68e746 Legg til om-side, personvernerklæring og sikkerheitsforbetring
Om-side (Android + PWA):
- Ny AboutDialog med personvernerklæring, datakjelder og opphavsrett
- Opphavsrett flytta frå sivilforsvardialogen til om-sida
- Tilgjengeleg via «Om denne appen»-lenke i sivilforsvarsdialogen (Android)
  og ny om-knapp i statuslinja (PWA)
- Lokalisert til en/nb/nn

Personvern og sikkerheit:
- Lagra GPS-posisjon utløper etter 24 timar (widget_prefs)
- Widget viser «Trykk for å oppdatere» når posisjon manglar eller er utløpt
- Eigendefinert User-Agent (Tilfluktsrom/1.6.1) i OkHttp
- Content Security Policy (CSP) meta-tag i PWA
- Tenararbeidar bufrar berre HTTP 200-svar (ikkje opake)
- Kartbuffer-metadata runda til ~11km presisjon i localStorage
- crossorigin="anonymous" på Leaflet CSS

i18n-opprydding:
- Unicode-escapes erstatta med UTF-8-teikn i nb.ts og nn.ts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 14:27:45 +01:00
6ba35add2f Legg til TalkBack-støtte og nordindikator på kompasset
Tilgjengelegheit (Android + PWA):
- Semantiske landemerke (header, main, aside, role=dialog)
- aria-live-regionar for statusoppdateringar og lasteoverlegg
- Fokusindikatorar (:focus-visible) og prefers-reduced-motion
- Auka trykkmål til 48dp (infoknapp, oppdater, del, widget)
- contentDescription på kart, kompass og framdriftsindikator
- aria-current og role=listitem på tilfluktsromliste
- Fokusfangst og fokusgjenoppretting i lasteoverlegg
- Ikkje-farge-indikator (▶) for valt tilfluktsrom
- Dynamisk lang-attributt basert på oppdaga språk
- Lokaliserte aria-label (en/nb/nn)

Nordindikator:
- DirectionArrowView teiknar diskret «N»-markør på omkrinsen
- Roterer uavhengig av hovudpila for kompasskalibrering
- Berre på stor kompassvisning, ikkje minipila

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 14:02:32 +01:00
f9f8ac3d60 Dokumenter byggvariantar og distribusjon i CLAUDE.md
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 18:30:36 +01:00
f5c064ab92 Bump versjon til v1.6.1 (versionCode 10) v1.6.1
- Fjern dependency metadata frå APK-signeringsblokka (dependenciesInfo)
  for F-Droid-kompatibilitet

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 13:15:14 +01:00