Die Oberfläche wirkte zusammengesetzt, nicht entworfen. Vier Gründe, alle am Quelltext belegbar. Die Farben waren von der App abgedriftet: elevated, placeholder, text, text-dim, text-muted und die Trennlinie wichen in der letzten Stelle ab, und der Standardakzent war in der App Lilac, im Browser Orchid. Einzeln unsichtbar, zusammen genau der Grund, warum App und Browser nicht wie dasselbe Programm aussahen. Alles auf FlaroDesign zurückgeführt. Vier konkurrierende Radien — 6 auf Plakaten, 8 auf Karten, 999 auf jedem Knopf, zweimal nacktes 3 — sind jetzt drei, und die ersten beiden stimmen wieder mit FlaroDesign überein. Pillen bleiben, wo sie hingehören: Suche und Filter. Sechs Überschriftengrössen ohne Verhältnis zueinander sind eine Skala. Der Kacheltitel war mit 13 px/500 leiser als die Metazeile daneben; das erzeugt keine Hierarchie, sondern Rauschen. Und der Akzent sass auf neun Dingen gleichzeitig. Wenn alles Akzent ist, markiert er nichts. Der Primärknopf ist jetzt hell mit dunkler Schrift — genau das macht Netflix, dessen Rot nur im Schriftzug vorkommt. Dazu drei Dinge, die vorher ganz fehlten: ein sichtbarer Fokusring auf allem Bedienbaren, ohne den die Oberfläche mit der Tastatur praktisch unbedienbar war; Rücksicht auf "Bewegung reduzieren", das im Projekt nirgends vorkam; und ein Hover, der mehr tut als zwei Bildpunkte zu heben — mitsamt einem Abspielknopf, der nicht länger das halbe Plakat verdeckt. Tools/tokens-pruefen.py vergleicht beide Quellen und läuft im Veröffentlichungsskript mit. Kein Generator: erzeugter Swift liest sich schlechter als geschriebener, und die Prüfung fängt dasselbe ab. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
75 lines
2.5 KiB
Bash
Executable File
75 lines
2.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# Baut das Flaro-Image für beide Architekturen und legt es in die Registry.
|
|
#
|
|
# **Der Weg von Hand** — für den Fall, dass kein Gitea-Runner läuft. Sonst
|
|
# macht das `.gitea/workflows/image.yml` bei jedem Push von selbst.
|
|
#
|
|
# Tools/image-veroeffentlichen.sh → :latest
|
|
# Tools/image-veroeffentlichen.sh 0.2.0 → :latest und :0.2.0
|
|
#
|
|
# Nur eine Architektur — deutlich schneller, weil die fremde sonst unter
|
|
# Emulation läuft:
|
|
#
|
|
# FLARO_PLATTFORMEN=linux/amd64 Tools/image-veroeffentlichen.sh
|
|
#
|
|
# Vorher einmalig anmelden — das Passwort tippst du selbst ein:
|
|
#
|
|
# docker login git.scarriffle.com
|
|
|
|
set -euo pipefail
|
|
|
|
REGISTRY="${FLARO_REGISTRY:-git.scarriffle.com}"
|
|
PFAD="${FLARO_IMAGE_PATH:-scarriffle/flaro}"
|
|
BILD="$REGISTRY/$PFAD"
|
|
FASSUNG="${1:-}"
|
|
PLATTFORMEN="${FLARO_PLATTFORMEN:-linux/amd64,linux/arm64}"
|
|
|
|
cd "$(dirname "$0")/.."
|
|
|
|
command -v docker >/dev/null || { echo "docker fehlt."; exit 1; }
|
|
|
|
# **Ohne Anmeldung bricht der Push erst nach dem ganzen Bau ab.** Zwei
|
|
# Minuten Arbeit für eine Fehlermeldung, die am Anfang gestanden hätte.
|
|
# Kein `docker info | grep -q`: `grep -q` beendet die Pipe beim ersten
|
|
# Treffer, Docker bekommt SIGPIPE, und mit `set -o pipefail` gilt das als
|
|
# Fehlschlag. Die Prüfung meldete dann „Docker läuft nicht", während es lief.
|
|
if ! docker info >/dev/null 2>&1; then
|
|
echo "Docker läuft nicht."; exit 1
|
|
fi
|
|
if ! grep -q "$REGISTRY" ~/.docker/config.json 2>/dev/null; then
|
|
echo "Nicht an $REGISTRY angemeldet. Erst:"
|
|
echo
|
|
echo " docker login $REGISTRY"
|
|
exit 1
|
|
fi
|
|
|
|
# **Vor dem Bauen, nicht danach.** Laufen App und Browser farblich
|
|
# auseinander, soll das auffallen, bevor ein Image daraus wird.
|
|
if command -v python3 >/dev/null && [ -f Tools/tokens-pruefen.py ]; then
|
|
python3 Tools/tokens-pruefen.py || {
|
|
echo
|
|
echo "Abgebrochen. Mit FLARO_DRIFT_EGAL=1 trotzdem bauen."
|
|
[ "${FLARO_DRIFT_EGAL:-}" = "1" ] || exit 1
|
|
}
|
|
fi
|
|
|
|
MARKEN=(-t "$BILD:latest")
|
|
[ -n "$FASSUNG" ] && MARKEN+=(-t "$BILD:$FASSUNG")
|
|
|
|
# **Ein eigener Builder.** Der Vorgabe-Builder von Docker Desktop kann kein
|
|
# Manifest mit zwei Architekturen bauen; `docker buildx create` schon.
|
|
docker buildx inspect flaro-bauer >/dev/null 2>&1 \
|
|
|| docker buildx create --name flaro-bauer --use >/dev/null
|
|
|
|
echo "Baue $BILD für $PLATTFORMEN."
|
|
docker buildx build \
|
|
--builder flaro-bauer \
|
|
--platform "$PLATTFORMEN" \
|
|
-f server/Dockerfile \
|
|
"${MARKEN[@]}" \
|
|
--push .
|
|
|
|
echo
|
|
echo "Fertig. Auf dem NAS:"
|
|
echo " image: $BILD:${FASSUNG:-latest}"
|