diff --git a/app/entry.client.tsx b/app/entry.client.tsx
index 170d52bc3..27ab5d3c9 100644
--- a/app/entry.client.tsx
+++ b/app/entry.client.tsx
@@ -4,6 +4,13 @@ import { i18nLoader } from "./modules/i18n";
import i18next from "i18next";
import { I18nextProvider } from "react-i18next";
+if ("serviceWorker" in navigator) {
+ window.addEventListener("load", () => {
+ // we will register it after the page complete the load
+ void navigator.serviceWorker.register("/sw.js");
+ });
+}
+
i18nLoader()
.then(() =>
hydrateRoot(
diff --git a/app/root.tsx b/app/root.tsx
index 1f8bb8526..e19849584 100644
--- a/app/root.tsx
+++ b/app/root.tsx
@@ -57,8 +57,10 @@ export const meta: MetaFunction = () => ({
title: "sendou.ink",
description:
"Competitive Splatoon Hub featuring gear planner, event calendar, builds by top players, and more!",
- viewport: "width=device-width,initial-scale=1",
- "theme-color": "#02011e",
+ viewport: "initial-scale=1, viewport-fit=cover, user-scalable=no",
+ "apple-mobile-web-app-status-bar-style": "black-translucent",
+ "apple-mobile-web-app-capable": "yes",
+ "theme-color": "#010115",
"og:image": COMMON_PREVIEW_IMAGE,
});
@@ -125,6 +127,8 @@ function Document({
+
+
@@ -141,23 +145,6 @@ function Document({
);
}
-function Fonts() {
- return (
- <>
-
-
-
- >
- );
-}
-
// TODO: this should be an array if we can figure out how to make Typescript
// enforce that it has every member of keyof CustomTypeOptions["resources"] without duplicating the type manually
export const namespaceJsonsToPreloadObj: Record<
@@ -214,3 +201,198 @@ export const ErrorBoundary: ErrorBoundaryComponent = ({ error }) => {
);
};
+
+function Fonts() {
+ return (
+ <>
+
+
+
+ >
+ );
+}
+
+function PWALinks() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/app/styles/common.css b/app/styles/common.css
index cc4949033..f60bbe32b 100644
--- a/app/styles/common.css
+++ b/app/styles/common.css
@@ -13,6 +13,7 @@ body {
-moz-osx-font-smoothing: antialiased;
line-height: 1.55;
overflow-x: hidden;
+ -webkit-tap-highlight-color: transparent;
}
*:focus:not(:focus-visible) {
diff --git a/app/styles/layout.css b/app/styles/layout.css
index 916eacfbb..d26754c46 100644
--- a/app/styles/layout.css
+++ b/app/styles/layout.css
@@ -256,6 +256,17 @@
background-color: var(--theme-transparent);
}
+@media screen and (display-mode: standalone) {
+ .layout__header {
+ height: 80px;
+ align-items: flex-end;
+ }
+
+ .layout__main {
+ padding-block-start: var(--s-26);
+ }
+}
+
@media screen and (max-width: 900px) {
.layout__side-nav {
display: none;
diff --git a/app/styles/vars.css b/app/styles/vars.css
index d4ec1be9e..218a78518 100644
--- a/app/styles/vars.css
+++ b/app/styles/vars.css
@@ -68,6 +68,7 @@
--s-16: 4rem;
--s-20: 5rem;
--s-24: 6rem;
+ --s-26: 6.5rem;
--s-28: 7rem;
--s-32: 8rem;
--s-40: 10rem;
diff --git a/public/app.webmanifest b/public/app.webmanifest
new file mode 100644
index 000000000..c1649601e
--- /dev/null
+++ b/public/app.webmanifest
@@ -0,0 +1,51 @@
+{
+ "name": "sendou.ink",
+ "start_url": "/",
+ "display": "standalone",
+ "id": "sendou.ink",
+ "description": "Competitive Splatoon Hub",
+ "theme_color": "#010115",
+ "background_color": "#02011e",
+ "icons": [
+ {
+ "src": "/static-assets/img/app-icon.png",
+ "type": "image/png",
+ "sizes": "512x512"
+ }
+ ],
+ "shortcuts": [
+ {
+ "name": "Builds",
+ "url": "/builds",
+ "icons": [
+ {
+ "src": "/static-assets/img/pwa-icons/builds.png",
+ "type": "image/png",
+ "sizes": "96x96"
+ }
+ ]
+ },
+ {
+ "name": "Build Analyzer",
+ "url": "/analyzer",
+ "icons": [
+ {
+ "src": "/static-assets/img/pwa-icons/analyzer.png",
+ "type": "image/png",
+ "sizes": "96x96"
+ }
+ ]
+ },
+ {
+ "name": "Calendar",
+ "url": "/calendar",
+ "icons": [
+ {
+ "src": "/static-assets/img/pwa-icons/calendar.png",
+ "type": "image/png",
+ "sizes": "96x96"
+ }
+ ]
+ }
+ ]
+}
diff --git a/public/static-assets/img/app-icon.png b/public/static-assets/img/app-icon.png
new file mode 100644
index 000000000..6fcb355f6
Binary files /dev/null and b/public/static-assets/img/app-icon.png differ
diff --git a/public/static-assets/img/pwa-icons/analyzer.png b/public/static-assets/img/pwa-icons/analyzer.png
new file mode 100644
index 000000000..17f4ceade
Binary files /dev/null and b/public/static-assets/img/pwa-icons/analyzer.png differ
diff --git a/public/static-assets/img/pwa-icons/builds.png b/public/static-assets/img/pwa-icons/builds.png
new file mode 100644
index 000000000..939f1e42e
Binary files /dev/null and b/public/static-assets/img/pwa-icons/builds.png differ
diff --git a/public/static-assets/img/pwa-icons/calendar.png b/public/static-assets/img/pwa-icons/calendar.png
new file mode 100644
index 000000000..89968914f
Binary files /dev/null and b/public/static-assets/img/pwa-icons/calendar.png differ
diff --git a/public/static-assets/img/splash-screens/10.2__iPad_landscape.png b/public/static-assets/img/splash-screens/10.2__iPad_landscape.png
new file mode 100644
index 000000000..1dc72a155
Binary files /dev/null and b/public/static-assets/img/splash-screens/10.2__iPad_landscape.png differ
diff --git a/public/static-assets/img/splash-screens/10.2__iPad_portrait.png b/public/static-assets/img/splash-screens/10.2__iPad_portrait.png
new file mode 100644
index 000000000..5166e1040
Binary files /dev/null and b/public/static-assets/img/splash-screens/10.2__iPad_portrait.png differ
diff --git a/public/static-assets/img/splash-screens/10.5__iPad_Air_landscape.png b/public/static-assets/img/splash-screens/10.5__iPad_Air_landscape.png
new file mode 100644
index 000000000..bbcf9b0a2
Binary files /dev/null and b/public/static-assets/img/splash-screens/10.5__iPad_Air_landscape.png differ
diff --git a/public/static-assets/img/splash-screens/10.5__iPad_Air_portrait.png b/public/static-assets/img/splash-screens/10.5__iPad_Air_portrait.png
new file mode 100644
index 000000000..3535ad352
Binary files /dev/null and b/public/static-assets/img/splash-screens/10.5__iPad_Air_portrait.png differ
diff --git a/public/static-assets/img/splash-screens/10.9__iPad_Air_landscape.png b/public/static-assets/img/splash-screens/10.9__iPad_Air_landscape.png
new file mode 100644
index 000000000..09bb6771c
Binary files /dev/null and b/public/static-assets/img/splash-screens/10.9__iPad_Air_landscape.png differ
diff --git a/public/static-assets/img/splash-screens/10.9__iPad_Air_portrait.png b/public/static-assets/img/splash-screens/10.9__iPad_Air_portrait.png
new file mode 100644
index 000000000..03d419db6
Binary files /dev/null and b/public/static-assets/img/splash-screens/10.9__iPad_Air_portrait.png differ
diff --git a/public/static-assets/img/splash-screens/11__iPad_Pro__10.5__iPad_Pro_landscape.png b/public/static-assets/img/splash-screens/11__iPad_Pro__10.5__iPad_Pro_landscape.png
new file mode 100644
index 000000000..9826cabf6
Binary files /dev/null and b/public/static-assets/img/splash-screens/11__iPad_Pro__10.5__iPad_Pro_landscape.png differ
diff --git a/public/static-assets/img/splash-screens/11__iPad_Pro__10.5__iPad_Pro_portrait.png b/public/static-assets/img/splash-screens/11__iPad_Pro__10.5__iPad_Pro_portrait.png
new file mode 100644
index 000000000..e69d4c1e1
Binary files /dev/null and b/public/static-assets/img/splash-screens/11__iPad_Pro__10.5__iPad_Pro_portrait.png differ
diff --git a/public/static-assets/img/splash-screens/12.9__iPad_Pro_landscape.png b/public/static-assets/img/splash-screens/12.9__iPad_Pro_landscape.png
new file mode 100644
index 000000000..13a808681
Binary files /dev/null and b/public/static-assets/img/splash-screens/12.9__iPad_Pro_landscape.png differ
diff --git a/public/static-assets/img/splash-screens/12.9__iPad_Pro_portrait.png b/public/static-assets/img/splash-screens/12.9__iPad_Pro_portrait.png
new file mode 100644
index 000000000..6fb540317
Binary files /dev/null and b/public/static-assets/img/splash-screens/12.9__iPad_Pro_portrait.png differ
diff --git a/public/static-assets/img/splash-screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_landscape.png b/public/static-assets/img/splash-screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_landscape.png
new file mode 100644
index 000000000..8d9da563f
Binary files /dev/null and b/public/static-assets/img/splash-screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_landscape.png differ
diff --git a/public/static-assets/img/splash-screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_portrait.png b/public/static-assets/img/splash-screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_portrait.png
new file mode 100644
index 000000000..e8d169b81
Binary files /dev/null and b/public/static-assets/img/splash-screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_portrait.png differ
diff --git a/public/static-assets/img/splash-screens/8.3__iPad_Mini_landscape.png b/public/static-assets/img/splash-screens/8.3__iPad_Mini_landscape.png
new file mode 100644
index 000000000..1b29e1ec6
Binary files /dev/null and b/public/static-assets/img/splash-screens/8.3__iPad_Mini_landscape.png differ
diff --git a/public/static-assets/img/splash-screens/8.3__iPad_Mini_portrait.png b/public/static-assets/img/splash-screens/8.3__iPad_Mini_portrait.png
new file mode 100644
index 000000000..236cefd30
Binary files /dev/null and b/public/static-assets/img/splash-screens/8.3__iPad_Mini_portrait.png differ
diff --git a/public/static-assets/img/splash-screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_landscape.png b/public/static-assets/img/splash-screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_landscape.png
new file mode 100644
index 000000000..354f52c1a
Binary files /dev/null and b/public/static-assets/img/splash-screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_landscape.png differ
diff --git a/public/static-assets/img/splash-screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_portrait.png b/public/static-assets/img/splash-screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_portrait.png
new file mode 100644
index 000000000..31e5b3f1b
Binary files /dev/null and b/public/static-assets/img/splash-screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_portrait.png differ
diff --git a/public/static-assets/img/splash-screens/iPhone_11_Pro_Max__iPhone_XS_Max_landscape.png b/public/static-assets/img/splash-screens/iPhone_11_Pro_Max__iPhone_XS_Max_landscape.png
new file mode 100644
index 000000000..6e972c520
Binary files /dev/null and b/public/static-assets/img/splash-screens/iPhone_11_Pro_Max__iPhone_XS_Max_landscape.png differ
diff --git a/public/static-assets/img/splash-screens/iPhone_11_Pro_Max__iPhone_XS_Max_portrait.png b/public/static-assets/img/splash-screens/iPhone_11_Pro_Max__iPhone_XS_Max_portrait.png
new file mode 100644
index 000000000..a06ced7d5
Binary files /dev/null and b/public/static-assets/img/splash-screens/iPhone_11_Pro_Max__iPhone_XS_Max_portrait.png differ
diff --git a/public/static-assets/img/splash-screens/iPhone_11__iPhone_XR_landscape.png b/public/static-assets/img/splash-screens/iPhone_11__iPhone_XR_landscape.png
new file mode 100644
index 000000000..e372584ae
Binary files /dev/null and b/public/static-assets/img/splash-screens/iPhone_11__iPhone_XR_landscape.png differ
diff --git a/public/static-assets/img/splash-screens/iPhone_11__iPhone_XR_portrait.png b/public/static-assets/img/splash-screens/iPhone_11__iPhone_XR_portrait.png
new file mode 100644
index 000000000..d2933a298
Binary files /dev/null and b/public/static-assets/img/splash-screens/iPhone_11__iPhone_XR_portrait.png differ
diff --git a/public/static-assets/img/splash-screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_landscape.png b/public/static-assets/img/splash-screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_landscape.png
new file mode 100644
index 000000000..f76778b09
Binary files /dev/null and b/public/static-assets/img/splash-screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_landscape.png differ
diff --git a/public/static-assets/img/splash-screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_portrait.png b/public/static-assets/img/splash-screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_portrait.png
new file mode 100644
index 000000000..603ac4e66
Binary files /dev/null and b/public/static-assets/img/splash-screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_portrait.png differ
diff --git a/public/static-assets/img/splash-screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_landscape.png b/public/static-assets/img/splash-screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_landscape.png
new file mode 100644
index 000000000..df82607f1
Binary files /dev/null and b/public/static-assets/img/splash-screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_landscape.png differ
diff --git a/public/static-assets/img/splash-screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_portrait.png b/public/static-assets/img/splash-screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_portrait.png
new file mode 100644
index 000000000..d7cc008c4
Binary files /dev/null and b/public/static-assets/img/splash-screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_portrait.png differ
diff --git a/public/static-assets/img/splash-screens/iPhone_14_Pro_Max_landscape.png b/public/static-assets/img/splash-screens/iPhone_14_Pro_Max_landscape.png
new file mode 100644
index 000000000..791b91b79
Binary files /dev/null and b/public/static-assets/img/splash-screens/iPhone_14_Pro_Max_landscape.png differ
diff --git a/public/static-assets/img/splash-screens/iPhone_14_Pro_Max_portrait.png b/public/static-assets/img/splash-screens/iPhone_14_Pro_Max_portrait.png
new file mode 100644
index 000000000..4b3120e5a
Binary files /dev/null and b/public/static-assets/img/splash-screens/iPhone_14_Pro_Max_portrait.png differ
diff --git a/public/static-assets/img/splash-screens/iPhone_14_Pro_landscape.png b/public/static-assets/img/splash-screens/iPhone_14_Pro_landscape.png
new file mode 100644
index 000000000..08917f831
Binary files /dev/null and b/public/static-assets/img/splash-screens/iPhone_14_Pro_landscape.png differ
diff --git a/public/static-assets/img/splash-screens/iPhone_14_Pro_portrait.png b/public/static-assets/img/splash-screens/iPhone_14_Pro_portrait.png
new file mode 100644
index 000000000..0e803f3f6
Binary files /dev/null and b/public/static-assets/img/splash-screens/iPhone_14_Pro_portrait.png differ
diff --git a/public/static-assets/img/splash-screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_landscape.png b/public/static-assets/img/splash-screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_landscape.png
new file mode 100644
index 000000000..8f86c94cc
Binary files /dev/null and b/public/static-assets/img/splash-screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_landscape.png differ
diff --git a/public/static-assets/img/splash-screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_portrait.png b/public/static-assets/img/splash-screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_portrait.png
new file mode 100644
index 000000000..c1a9b7a8b
Binary files /dev/null and b/public/static-assets/img/splash-screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_portrait.png differ
diff --git a/public/static-assets/img/splash-screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_landscape.png b/public/static-assets/img/splash-screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_landscape.png
new file mode 100644
index 000000000..24cd7196c
Binary files /dev/null and b/public/static-assets/img/splash-screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_landscape.png differ
diff --git a/public/static-assets/img/splash-screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_portrait.png b/public/static-assets/img/splash-screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_portrait.png
new file mode 100644
index 000000000..adbb429a0
Binary files /dev/null and b/public/static-assets/img/splash-screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_portrait.png differ
diff --git a/public/static-assets/img/splash-screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_landscape.png b/public/static-assets/img/splash-screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_landscape.png
new file mode 100644
index 000000000..208dca2ed
Binary files /dev/null and b/public/static-assets/img/splash-screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_landscape.png differ
diff --git a/public/static-assets/img/splash-screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_portrait.png b/public/static-assets/img/splash-screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_portrait.png
new file mode 100644
index 000000000..6fc7a32d3
Binary files /dev/null and b/public/static-assets/img/splash-screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_portrait.png differ
diff --git a/public/sw.js b/public/sw.js
new file mode 100644
index 000000000..ec9c1d84c
--- /dev/null
+++ b/public/sw.js
@@ -0,0 +1,3 @@
+self.addEventListener("fetch", function () {
+ return;
+});