Add installable-app manifest, icons, and iOS splash screens
@@ -39,3 +39,4 @@ switches the directory app to the Google Sheets source. At startup the directory
|
||||
- `web/directory` — directory app page templates and static assets
|
||||
- `tools/screenshot` — dev-site page capture, see [screenshots.md](screenshots.md)
|
||||
- `tools/columns` — print the column names of each directory table in the configured source
|
||||
- `tools/splash` — extract the original app's iOS splash screens into `web/static/brand/splash`
|
||||
|
||||
@@ -4,7 +4,6 @@ What remains to build. Current behavior is documented in `docs/dev.md`, `docs/da
|
||||
|
||||
## Directory app
|
||||
|
||||
- Installable-app plumbing: manifest, icons, and meta tags per `docs/pwa.md`.
|
||||
- Self-service flows: photo and pronunciation upload, address update, opt-out.
|
||||
|
||||
## Hosting and deployment
|
||||
|
||||
@@ -11,10 +11,10 @@ The directory is used from phone home screens, so Heliosian ships as an installa
|
||||
|
||||
## What Heliosian serves
|
||||
|
||||
- `manifest.webmanifest` from the binary: name, short name, `display: standalone`, `start_url: /`, theme and background color `#014E54`, icons 192 and 512 as `any` plus maskable variants (maskable art keeps the lockup inside the safe zone on a full-bleed teal square).
|
||||
- Base template meta: `theme-color`, `viewport` including `viewport-fit=cover`, the two `apple-mobile-web-app-*` tags, and a 180px `apple-touch-icon`.
|
||||
- `manifest.webmanifest` at `/static/manifest.webmanifest` — under `/static/` because browsers fetch manifests without credentials and that path bypasses the sign-in wall. `scope` and `start_url` are `/`; name, `display: standalone`, theme and background color `#014E54`; icons 192 and 512 as `any` plus a 512 maskable (the maskable art keeps the lockup inside the safe zone on a full-bleed teal square). The server registers the `application/manifest+json` MIME type.
|
||||
- Both page templates (app and login) carry the manifest link, `theme-color` (light surface on the app page, teal on login), `viewport` including `viewport-fit=cover` and `user-scalable=no`, the two `apple-mobile-web-app-*` tags, 16/32 favicons, and the `apple-touch-icon`.
|
||||
- HTTPS comes with Cloud Run; installability requires it.
|
||||
- Splash screens for iOS are pre-rendered at the device-size matrix like the original; until that exists, launches show a plain background, which is acceptable.
|
||||
- Splash screens for iOS: both templates carry the original's full `apple-touch-startup-image` battery — 32 pre-rendered PNGs (the logo lockup on teal) covering every iPhone/iPad class in both orientations, served from `/static/brand/splash/`. `tools/splash` regenerates them by extracting the link matrix and images from the captured original page source.
|
||||
- A service worker is optional for install on current Chromium and adds offline shell caching; if added, it stays minimal — cache the static shell, never cache directory data (community data must not persist on shared devices beyond the session's needs).
|
||||
- `start_url` must resolve for a signed-out user by landing on the sign-in flow, then into the app.
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
"crypto/rand"
|
||||
"encoding/json"
|
||||
"log"
|
||||
"mime"
|
||||
"net/http"
|
||||
"os"
|
||||
"strings"
|
||||
@@ -82,6 +83,9 @@ func mapsKey(envName, file string) string {
|
||||
}
|
||||
|
||||
func main() {
|
||||
if err := mime.AddExtensionType(".webmanifest", "application/manifest+json"); err != nil {
|
||||
log.Fatalf("[ERROR] register manifest mime type: %v", err)
|
||||
}
|
||||
authn := auth.New(clientID(), sessionKey())
|
||||
serverKey := mapsKey("GOOGLE_MAPS_SERVER_KEY", "creds/geocoding.key")
|
||||
browserKey := mapsKey("GOOGLE_MAPS_BROWSER_KEY", "creds/maps.key")
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
// Command splash extracts the original app's ios splash screens into web/static/brand/splash.
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func main() {
|
||||
raw, err := os.ReadFile("screenshots/brand/page-source.html")
|
||||
if err != nil {
|
||||
log.Fatalf("[ERROR] read page source: %v", err)
|
||||
}
|
||||
blobs := regexp.MustCompile(`decodeURIComponent\("([^"]+)"\)`).FindAllStringSubmatch(string(raw), -1)
|
||||
links := [][]string{}
|
||||
linkRE := regexp.MustCompile(`<link rel="apple-touch-startup-image" media="([^"]+)" href="([^"]+)"`)
|
||||
for _, blob := range blobs {
|
||||
decoded, err := url.PathUnescape(blob[1])
|
||||
if err != nil {
|
||||
log.Fatalf("[ERROR] decode blob: %v", err)
|
||||
}
|
||||
decoded = strings.ReplaceAll(decoded, `\"`, `"`)
|
||||
links = append(links, linkRE.FindAllStringSubmatch(decoded, -1)...)
|
||||
}
|
||||
if len(links) == 0 {
|
||||
log.Fatal("[ERROR] no splash links found in page source")
|
||||
}
|
||||
mediaRE := regexp.MustCompile(`device-width: (\d+)px\) and \(device-height: (\d+)px\) and \(-webkit-device-pixel-ratio: (\d+)\) and \(orientation: (\w+)\)`)
|
||||
if err := os.MkdirAll("web/static/brand/splash", 0o755); err != nil {
|
||||
log.Fatalf("[ERROR] create splash dir: %v", err)
|
||||
}
|
||||
for _, link := range links {
|
||||
media, href := link[1], link[2]
|
||||
mm := mediaRE.FindStringSubmatch(media)
|
||||
if mm == nil {
|
||||
log.Fatalf("[ERROR] unparsed media query: %s", media)
|
||||
}
|
||||
name := fmt.Sprintf("splash-%sx%s-%sx-%s.png", mm[1], mm[2], mm[3], mm[4])
|
||||
resp, err := http.Get(strings.ReplaceAll(href, " ", "%20"))
|
||||
if err != nil {
|
||||
log.Fatalf("[ERROR] fetch %s: %v", href, err)
|
||||
}
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
log.Fatalf("[ERROR] fetch %s: %s", href, resp.Status)
|
||||
}
|
||||
data, err := io.ReadAll(resp.Body)
|
||||
resp.Body.Close()
|
||||
if err != nil {
|
||||
log.Fatalf("[ERROR] read %s: %v", href, err)
|
||||
}
|
||||
if err := os.WriteFile("web/static/brand/splash/"+name, data, 0o644); err != nil {
|
||||
log.Fatalf("[ERROR] write %s: %v", name, err)
|
||||
}
|
||||
fmt.Printf("<link rel=\"apple-touch-startup-image\" media=\"%s\" href=\"/static/brand/splash/%s\">\n", media, name)
|
||||
}
|
||||
}
|
||||
@@ -2,10 +2,48 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, user-scalable=no">
|
||||
<meta name="theme-color" content="#F6F6F6">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<title>Helios Who?</title>
|
||||
<link rel="manifest" href="/static/manifest.webmanifest">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/static/brand/favicon-16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/static/brand/favicon-32.png">
|
||||
<link rel="icon" href="/static/brand/icon-192.png">
|
||||
<link rel="apple-touch-icon" href="/static/brand/apple-touch-icon.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 1366px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/static/brand/splash/splash-1366x1024-2x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/static/brand/splash/splash-1024x1366-2x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 1194px) and (device-height: 834px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/static/brand/splash/splash-1194x834-2x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/static/brand/splash/splash-834x1194-2x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 1112px) and (device-height: 834px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/static/brand/splash/splash-1112x834-2x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/static/brand/splash/splash-834x1112-2x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 1080px) and (device-height: 810px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/static/brand/splash/splash-1080x810-2x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/static/brand/splash/splash-810x1080-2x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 1024px) and (device-height: 768px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/static/brand/splash/splash-1024x768-2x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/static/brand/splash/splash-768x1024-2x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 1133px) and (device-height: 744px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/static/brand/splash/splash-1133x744-2x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/static/brand/splash/splash-744x1133-2x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/static/brand/splash/splash-430x932-3x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/static/brand/splash/splash-393x852-3x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/static/brand/splash/splash-428x926-3x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/static/brand/splash/splash-390x844-3x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/static/brand/splash/splash-414x896-3x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/static/brand/splash/splash-375x812-3x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/static/brand/splash/splash-414x896-2x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/static/brand/splash/splash-414x736-3x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/static/brand/splash/splash-375x667-2x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/static/brand/splash/splash-320x568-2x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 932px) and (device-height: 430px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/static/brand/splash/splash-932x430-3x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 852px) and (device-height: 393px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/static/brand/splash/splash-852x393-3x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 926px) and (device-height: 428px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/static/brand/splash/splash-926x428-3x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 844px) and (device-height: 390px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/static/brand/splash/splash-844x390-3x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 896px) and (device-height: 414px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/static/brand/splash/splash-896x414-3x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 812px) and (device-height: 375px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/static/brand/splash/splash-812x375-3x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 896px) and (device-height: 414px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/static/brand/splash/splash-896x414-2x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 736px) and (device-height: 414px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/static/brand/splash/splash-736x414-3x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 667px) and (device-height: 375px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/static/brand/splash/splash-667x375-2x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 568px) and (device-height: 320px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/static/brand/splash/splash-568x320-2x-landscape.png">
|
||||
<link rel="stylesheet" href="/static/fonts/fonts.css">
|
||||
<link rel="stylesheet" href="/static/directory/style.css">
|
||||
</head>
|
||||
|
||||
@@ -2,10 +2,48 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, user-scalable=no">
|
||||
<meta name="theme-color" content="#014E54">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<title>Helios Who?</title>
|
||||
<link rel="manifest" href="/static/manifest.webmanifest">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/static/brand/favicon-16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/static/brand/favicon-32.png">
|
||||
<link rel="icon" href="/static/brand/icon-192.png">
|
||||
<link rel="apple-touch-icon" href="/static/brand/apple-touch-icon.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 1366px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/static/brand/splash/splash-1366x1024-2x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/static/brand/splash/splash-1024x1366-2x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 1194px) and (device-height: 834px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/static/brand/splash/splash-1194x834-2x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/static/brand/splash/splash-834x1194-2x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 1112px) and (device-height: 834px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/static/brand/splash/splash-1112x834-2x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/static/brand/splash/splash-834x1112-2x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 1080px) and (device-height: 810px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/static/brand/splash/splash-1080x810-2x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/static/brand/splash/splash-810x1080-2x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 1024px) and (device-height: 768px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/static/brand/splash/splash-1024x768-2x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/static/brand/splash/splash-768x1024-2x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 1133px) and (device-height: 744px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/static/brand/splash/splash-1133x744-2x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/static/brand/splash/splash-744x1133-2x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/static/brand/splash/splash-430x932-3x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/static/brand/splash/splash-393x852-3x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/static/brand/splash/splash-428x926-3x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/static/brand/splash/splash-390x844-3x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/static/brand/splash/splash-414x896-3x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/static/brand/splash/splash-375x812-3x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/static/brand/splash/splash-414x896-2x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/static/brand/splash/splash-414x736-3x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/static/brand/splash/splash-375x667-2x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/static/brand/splash/splash-320x568-2x-portrait.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 932px) and (device-height: 430px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/static/brand/splash/splash-932x430-3x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 852px) and (device-height: 393px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/static/brand/splash/splash-852x393-3x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 926px) and (device-height: 428px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/static/brand/splash/splash-926x428-3x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 844px) and (device-height: 390px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/static/brand/splash/splash-844x390-3x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 896px) and (device-height: 414px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/static/brand/splash/splash-896x414-3x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 812px) and (device-height: 375px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/static/brand/splash/splash-812x375-3x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 896px) and (device-height: 414px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/static/brand/splash/splash-896x414-2x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 736px) and (device-height: 414px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/static/brand/splash/splash-736x414-3x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 667px) and (device-height: 375px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/static/brand/splash/splash-667x375-2x-landscape.png">
|
||||
<link rel="apple-touch-startup-image" media="(device-width: 568px) and (device-height: 320px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/static/brand/splash/splash-568x320-2x-landscape.png">
|
||||
<link rel="stylesheet" href="/static/fonts/fonts.css">
|
||||
<style>
|
||||
body {
|
||||
|
||||
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 602 B |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 490 KiB |
|
After Width: | Height: | Size: 320 KiB |
|
After Width: | Height: | Size: 345 KiB |
|
After Width: | Height: | Size: 360 KiB |
|
After Width: | Height: | Size: 365 KiB |
|
After Width: | Height: | Size: 394 KiB |
|
After Width: | Height: | Size: 484 KiB |
|
After Width: | Height: | Size: 141 KiB |
|
After Width: | Height: | Size: 176 KiB |
|
After Width: | Height: | Size: 343 KiB |
|
After Width: | Height: | Size: 363 KiB |
|
After Width: | Height: | Size: 367 KiB |
|
After Width: | Height: | Size: 324 KiB |
|
After Width: | Height: | Size: 210 KiB |
|
After Width: | Height: | Size: 395 KiB |
|
After Width: | Height: | Size: 412 KiB |
|
After Width: | Height: | Size: 414 KiB |
|
After Width: | Height: | Size: 159 KiB |
|
After Width: | Height: | Size: 200 KiB |
|
After Width: | Height: | Size: 363 KiB |
|
After Width: | Height: | Size: 348 KiB |
|
After Width: | Height: | Size: 317 KiB |
|
After Width: | Height: | Size: 342 KiB |
|
After Width: | Height: | Size: 388 KiB |
|
After Width: | Height: | Size: 358 KiB |
|
After Width: | Height: | Size: 385 KiB |
|
After Width: | Height: | Size: 410 KiB |
|
After Width: | Height: | Size: 416 KiB |
|
After Width: | Height: | Size: 281 KiB |
|
After Width: | Height: | Size: 445 KiB |
|
After Width: | Height: | Size: 472 KiB |
|
After Width: | Height: | Size: 476 KiB |
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"name": "Helios Who?",
|
||||
"short_name": "Helios Who?",
|
||||
"description": "Please log in with your @heliosschool.org email address",
|
||||
"display": "standalone",
|
||||
"id": "/",
|
||||
"scope": "/",
|
||||
"start_url": "/",
|
||||
"theme_color": "#014E54",
|
||||
"background_color": "#014E54",
|
||||
"icons": [
|
||||
{"src": "/static/brand/icon-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any"},
|
||||
{"src": "/static/brand/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any"},
|
||||
{"src": "/static/brand/maskable-icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable"}
|
||||
]
|
||||
}
|
||||