Eine Elefantenherde die sich langsam auflöst. Eine moderne Eieruhr!
Wenn dir dieses Projekt hilft oder gefällt, kannst du die Weiterentwicklung über GitHub Sponsors unterstützen:
Diese App zeigt 20 Elefanten-Bilder zufällig über den gesamten Bildschirm verteilt. Anschließend verschwinden die Bilder nacheinander: Immer das aktuell vorderste Bild (zuletzt eingefügt) schrumpft über eine definierte Dauer auf 0 und wird entfernt. Sobald ein Bild weg ist, startet der gleiche Ablauf mit dem nächsten, bis keine Bilder mehr sichtbar sind. Über den Button Neu starten wird die Szene komplett neu aufgebaut und der Ablauf beginnt von vorne.
Zusätzlich ist das Projekt als PWA konfiguriert und kann im Browser installiert werden (Standalone-Modus mit Service Worker und Manifest).
- 20 Bilder werden beim Start zufällig im Viewport positioniert.
- Dynamische Bildgröße basierend auf den echten Maßen von
public/elephant.gif. - Zeitsteuerung über Buttons
2 Minuten,4 Minuten,6 Minuten. - Sequentielles Verschwinden mit Schrumpf-Animation.
- Reihenfolge: Vordergrund zuerst (reverse Einfügereihenfolge via
z-index). - Neustart per Button
Neu starten. - Installierbare PWA inkl. Manifest und Favicon.
src/main.ts: App-Logik, Positionierung, Verschwinden, Neustart.src/style.css: Layout, Button-Styling, Shrink-Animation.vite.config.ts: Vite- und PWA-Konfiguration.public/elephant.gif: Bildquelle für alle Elefanten.public/eier2min.png,public/eier4min.png,public/eier6min.png: Transparente Icons für die Zeitbuttons.public/favicon.ico: Favicon für Browser/PWA.scripts/generate-favicon.mjs: Konvertierung GIF -> ICO.
Die wichtigsten Parameter findest du in src/main.ts und kannst sie direkt dort anpassen:
TOTAL_ELEPHANTS: Anzahl der angezeigten Bilder.DURATION_OPTIONS_MINUTES: Auswahl der Gesamtzeit (Buttons).ELEPHANT_IMAGE_PATH: Pfad zur verwendeten Bilddatei.
Beispiele:
DURATION_OPTIONS_MINUTES = [2, 4, 6]zeigt drei Zeitbuttons.TOTAL_ELEPHANTS = 20zeigt 20 Bilder.
Hinweis: Die Dauer pro Elefant wird automatisch aus der gewählten Gesamtzeit
berechnet (Gesamtzeit / TOTAL_ELEPHANTS). Damit verschwindet der letzte
Elefant exakt nach der ausgewählten Zeit.
npm install
npm startVoraussetzung: Die App läuft über https:// (oder lokal über localhost).
- App in Safari öffnen.
- Auf Teilen tippen.
- Zum Home-Bildschirm auswählen.
- Optional Namen anpassen und mit Hinzufügen bestätigen.
- App in Chrome öffnen.
- Im Browser-Menü auf App installieren tippen.
- Falls nicht sichtbar: Zum Startbildschirm hinzufügen wählen.
- Installation bestätigen.
Hinweis: Nach der Installation startet die App im Standalone-Modus (ohne Browser-Adressleiste).
Für iOS wird zusätzlich ein apple-touch-icon verwendet (public/apple-touch-icon.png).
Wenn Dateien im Cache fehlen oder nach einem Deploy alte Assets geladen werden:
- App öffnen.
- DevTools öffnen (
F12) -> Application. - Unter Service Workers auf Update klicken.
- Unter Storage auf Clear site data klicken.
- Seite mit
Ctrl+F5hart neu laden. - Unter Cache Storage prüfen, ob die erwarteten Dateien enthalten sind.
- In Chrome die App-Seite öffnen.
- Menü (
⋮) -> Website-Einstellungen -> Speicher & Cache. - Löschen ausführen.
- Seite neu öffnen und einmal warten, bis der Service Worker wieder aktiv ist.
- Optional: installierte App vom Homescreen entfernen und erneut installieren.
- Falls installiert: App vom Home-Bildschirm löschen.
- Einstellungen -> Safari -> Verlauf und Websitedaten löschen.
- Safari neu öffnen und die Seite erneut aufrufen.
- Erneut über Teilen -> Zum Home-Bildschirm installieren.
Hinweis: Das erste Laden nach Cache-Löschung benötigt Internet, danach läuft die PWA wieder offline.
- Alter Service Worker aktiv: In DevTools unter Application -> Service Workers auf Update klicken und Seite hart neu laden.
- Falscher Base-Pfad: Prüfen, ob
baseinvite.config.tszur Deploy-URL passt (z. B. GitHub Pages Projektpfad). - Kein HTTPS: Installation und SW funktionieren nur mit
https://(Ausnahme:localhost). - Assets nicht im Precache: In
vite.config.tsunterVitePWA(... includeAssets ...)sicherstellen, dass alle benötigten Dateien gelistet sind. - Manifest/Icons veraltet: Nach Icon-Änderungen
npm run pwa-icons:generateund anschließendnpm run buildausführen.
- Die Seite muss über
https://laufen (Ausnahme:localhost). - Für einen realistischen lokalen Test: zuerst
npm run build, dannnpm run previewund die Vorschau-URL öffnen. - Auf Android kann die Option je nach Chrome-Version auch Zum Startbildschirm hinzufügen heißen.
Der Workflow ist in .github/workflows/deploy-pages.yml hinterlegt.
- Repository auf GitHub öffnen.
- Unter Settings > Pages bei Source auf GitHub Actions stellen.
- Sicherstellen, dass der Default-Branch
mainist (oder den Workflow entsprechend anpassen).
- Automatisch bei Push auf
main. - Oder manuell über den Workflow Deploy to GitHub Pages.
Hinweis: Der Build-Pfad (base) wird im Workflow automatisch korrekt gesetzt:
- User/Org-Page (
<user>.github.io) ->/ - Projektseite (
<user>.github.io/<repo>) ->/<repo>/
Der Release-Workflow liegt in .github/workflows/release.yml und wird bei Tag-Push gestartet.
Erlaubte Beispiele:
v1.2.3v1.2.3-rc.1v1.2.3+build.5
Nicht erlaubt sind z. B. v1, v1.2 oder release-1.2.3.
git tag v1.0.0
git push origin v1.0.0Der Workflow führt dann automatisch aus:
npm cinpm run build- ZIP-Erstellung aus
dist - GitHub Release inkl. automatisch generierter Release Notes und ZIP-Asset
Ausgangsdatei: public/elephant.gif
Zieldatei: public/favicon.ico
npm install --save-dev sharp png-to-iconpm run favicon:generatenpm run build- Das Projekt referenziert das Favicon bereits in
index.htmlund im PWA-Manifest (vite.config.ts). - Wenn du nur einmalig konvertierst, kannst du die Tools danach wieder entfernen:
npm uninstall --save-dev sharp png-to-icoCa. 90% dieses Code wurde von GPT-5.3-Codex generiert. Insgesammt wurden ca. 4 Stunden aufgewendet.
- Datei:
public/elephant.gif - Quelle: GIPHY Sticker – Canticos
- Hinweis: Rechte und Nutzungsbedingungen für dieses Asset liegen beim jeweiligen Rechteinhaber bzw. Plattformanbieter.
- Details: Siehe
THIRD_PARTY_NOTICES.md.
Dieses Projekt steht unter der MIT-Lizenz. Details siehe LICENSE.
Copyright (c) 2026 die.internauten.ch