Add progressive web app companion for cross-platform access

Vite + TypeScript PWA that mirrors the Android app's core features:
- Pre-processed shelter data (build-time UTM33N→WGS84 conversion)
- Leaflet map with shelter markers, user location, and offline tiles
- Canvas compass arrow (ported from DirectionArrowView.kt)
- IndexedDB shelter cache with 7-day staleness check
- Service worker with CacheFirst tiles and precached app shell
- i18n for en, nb, nn (ported from Android strings.xml)
- iOS/Android compass handling with low-pass filter
- Respects user map interaction (no auto-snap on pan/zoom)
- Build revision cache-breaker for reliable SW updates

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Ole-Morten Duesund 2026-03-08 17:41:38 +01:00
commit e8428de775
12051 changed files with 1799735 additions and 0 deletions

61
pwa/node_modules/workbox-build/build/lib/errors.d.ts generated vendored Normal file
View file

@ -0,0 +1,61 @@
export declare const errors: {
'unable-to-get-rootdir': string;
'no-extension': string;
'invalid-file-manifest-name': string;
'unable-to-get-file-manifest-name': string;
'invalid-sw-dest': string;
'unable-to-get-sw-name': string;
'unable-to-get-save-config': string;
'unable-to-get-file-hash': string;
'unable-to-get-file-size': string;
'unable-to-glob-files': string;
'unable-to-make-manifest-directory': string;
'read-manifest-template-failure': string;
'populating-manifest-tmpl-failed': string;
'manifest-file-write-failure': string;
'unable-to-make-sw-directory': string;
'read-sw-template-failure': string;
'sw-write-failure': string;
'sw-write-failure-directory': string;
'unable-to-copy-workbox-libraries': string;
'invalid-generate-sw-input': string;
'invalid-glob-directory': string;
'invalid-dont-cache-bust': string;
'invalid-exclude-files': string;
'invalid-get-manifest-entries-input': string;
'invalid-manifest-path': string;
'invalid-manifest-entries': string;
'invalid-manifest-format': string;
'invalid-static-file-globs': string;
'invalid-templated-urls': string;
'templated-url-matches-glob': string;
'invalid-glob-ignores': string;
'manifest-entry-bad-url': string;
'modify-url-prefix-bad-prefixes': string;
'invalid-inject-manifest-arg': string;
'injection-point-not-found': string;
'multiple-injection-points': string;
'populating-sw-tmpl-failed': string;
'useless-glob-pattern': string;
'bad-template-urls-asset': string;
'invalid-runtime-caching': string;
'static-file-globs-deprecated': string;
'dynamic-url-deprecated': string;
'urlPattern-is-required': string;
'handler-is-required': string;
'invalid-generate-file-manifest-arg': string;
'invalid-sw-src': string;
'same-src-and-dest': string;
'only-regexp-routes-supported': string;
'bad-runtime-caching-config': string;
'invalid-network-timeout-seconds': string;
'no-module-name': string;
'bad-manifest-transforms-return-value': string;
'string-entry-warning': string;
'no-manifest-entries-or-runtime-caching': string;
'cant-find-sourcemap': string;
'nav-preload-runtime-caching': string;
'cache-name-required': string;
'manifest-transforms': string;
'invalid-handler-string': string;
};