diff --git a/python-backend/.gitignore b/python-backend/.gitignore index 258c6ae..51d5292 100644 --- a/python-backend/.gitignore +++ b/python-backend/.gitignore @@ -1,4 +1,5 @@ config.yml tippen-curriculum.yml +tippen-curriculum-dino.yml tippen-progress.json /.musicmouse-cache diff --git a/web/public/dinosaur-mascot.png b/web/public/dinosaur-mascot.png new file mode 100644 index 0000000..7c602ed Binary files /dev/null and b/web/public/dinosaur-mascot.png differ diff --git a/web/public/dinosaur-remote.png b/web/public/dinosaur-remote.png new file mode 100644 index 0000000..7711b96 Binary files /dev/null and b/web/public/dinosaur-remote.png differ diff --git a/web/public/dinosaur/apple-touch-icon.png b/web/public/dinosaur/apple-touch-icon.png new file mode 100644 index 0000000..0aa3245 Binary files /dev/null and b/web/public/dinosaur/apple-touch-icon.png differ diff --git a/web/public/dinosaur/icon-192.png b/web/public/dinosaur/icon-192.png new file mode 100644 index 0000000..f0880c6 Binary files /dev/null and b/web/public/dinosaur/icon-192.png differ diff --git a/web/public/dinosaur/icon-512.png b/web/public/dinosaur/icon-512.png new file mode 100644 index 0000000..9e613c1 Binary files /dev/null and b/web/public/dinosaur/icon-512.png differ diff --git a/web/public/dinosaur/icon-maskable-512.png b/web/public/dinosaur/icon-maskable-512.png new file mode 100644 index 0000000..544b596 Binary files /dev/null and b/web/public/dinosaur/icon-maskable-512.png differ diff --git a/web/public/dinosaur/manifest.webmanifest b/web/public/dinosaur/manifest.webmanifest new file mode 100644 index 0000000..94106be --- /dev/null +++ b/web/public/dinosaur/manifest.webmanifest @@ -0,0 +1,22 @@ +{ + "name": "Musik Dino", + "short_name": "Musik", + "description": "Musik und Hörbücher für die MusicMouse", + "start_url": "/?theme=dinosaur", + "scope": "/", + "display": "standalone", + "orientation": "any", + "background_color": "#1c311c", + "theme_color": "#1c311c", + "lang": "de", + "icons": [ + { "src": "/dinosaur/icon-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" }, + { "src": "/dinosaur/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" }, + { + "src": "/dinosaur/icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/web/public/sw.js b/web/public/sw.js index 22a4f77..56eacc7 100644 --- a/web/public/sw.js +++ b/web/public/sw.js @@ -3,7 +3,7 @@ // work offline - the audio, the library and the state all live on the mouse, and a // cached answer for any of those would be a lie. -const SHELL = "musikdelphin-shell-v1"; +const SHELL = "musikdelphin-shell-v2"; // There is no cover cache any more; `activate` below deletes every cache that is not // SHELL, which retires the two generations of cover cache this worker used to keep. @@ -16,6 +16,7 @@ self.addEventListener("install", (event) => { "/", "/manifest.webmanifest", "/dolphin-mascot.png", + "/dinosaur-mascot.png", "/fonts/nunito.css", "/fonts/nunito-latin.woff2", "/fonts/nunito-latin-ext.woff2", diff --git a/web/src/App.tsx b/web/src/App.tsx index c80ab0f..759ed99 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -40,6 +40,7 @@ import { playPop } from "./lib/pop"; import { targetForAlbum } from "./lib/remote"; import type { Group, Mode, Results, SongHit } from "./lib/search"; import { buildSearchIndex, categoryMatches, groupOf, results as computeResults } from "./lib/search"; +import { SKIN } from "./lib/skins"; import { SHOW_AMBIENCE, SHOW_CARD_BLUR, SHOW_GLASS_BLUR } from "./lib/theme"; // The room page and the typing game are each a tab away from the player and together a @@ -557,7 +558,7 @@ export function App() { fontWeight: 800, padding: "10px 20px", borderRadius: 999, - boxShadow: "0 8px 24px oklch(15% 0.05 210 / .4)", + boxShadow: "0 8px 24px oklch(15% 0.05 var(--hue) / .4)", }} > {assignStatus} @@ -654,7 +655,7 @@ export function App() { border: "none", borderRadius: 999, cursor: "pointer", - background: "oklch(15% 0.03 210 / .35)", + background: "oklch(15% 0.03 var(--hue) / .35)", color: "#fff", opacity: 0.5, }} @@ -680,7 +681,7 @@ export function App() { border: "none", borderRadius: 999, cursor: "pointer", - background: "oklch(15% 0.03 210 / .35)", + background: "oklch(15% 0.03 var(--hue) / .35)", color: "#fff", opacity: 0.5, }} @@ -734,10 +735,10 @@ function CornerButton({ display: "flex", alignItems: "center", justifyContent: "center", - background: "oklch(97% 0.01 210 / .95)", + background: "oklch(97% 0.01 var(--hue) / .95)", border: "none", borderRadius: 999, - boxShadow: "0 6px 18px oklch(15% 0.05 210 / .4)", + boxShadow: "0 6px 18px oklch(15% 0.05 var(--hue) / .4)", fontSize: 20, fontWeight: 900, color: "var(--ink)", @@ -762,7 +763,7 @@ function ConnectionDot({ online, state }: { online: boolean; state: { active_fig fontSize: 14, fontWeight: 800, color: online ? "var(--paper)" : "oklch(75% 0.16 30)", - background: "oklch(97% 0.01 210 / .16)", + background: "oklch(97% 0.01 var(--hue) / .16)", padding: "6px 14px", borderRadius: 999, }} @@ -776,15 +777,15 @@ function Splash({ error }: { error: string | null }) { return (