diff --git a/AGENTS.md b/AGENTS.md index 2f6d893..00187df 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -6188,3 +6188,38 @@ Fahrzeugfoto von 42 %/78 % auf 26 %/96 %; FIN statt „Fahrgestellnummer"; Solld `watchPosition` statt `getCurrentPosition` für die Live-Ortung, mit Abmeldung beim Verlassen der Seite; `NSLocationWhenInUseUsageDescription` in `ios-signieren.sh` (in der ausgelieferten `.ipa` fehlte jeder Location-Schlüssel — deshalb fragte iOS nie). + +### App-Symbol (2026-08-31) + +Gewaehlt: Entwurf 3 bei 54 % Fahrzeuggroesse — **DataMetric** oben, das CI-Fahrzeug in der Mitte, +**360** in Audi-Rot unten, auf Nacht-Grund. Zwoelf Varianten wurden dafuer nebeneinander gezeigt, +jede zweimal: gross und bei 60 pt, der Groesse auf dem Homescreen. Genau daran entschied es sich — +gestapelte Elemente teilen sich dort 60 Punkte, und was gross elegant wirkt, ist klein oft ein Fleck. + +- Vektorquelle: `companion-app/native/logo/AppIcon-{hell,dunkel,getoent}.svg`, erzeugt von + `scripts/logo-bauen.cjs`. Das Fahrzeug liest das Skript aus `ICONS.audi` im Panel — eine zweite + Kopie des Pfades waere eine zweite Quelle fuer dieselbe Form. Die Schriften stecken als + data:-URI in der SVG: ohne das haengt das Ergebnis davon ab, welche Fonts auf dem + rasternden Rechner installiert sind, und das faellt erst am fertigen Symbol auf. +- Fertige Vorlage: `companion-app/native/AppIcon.appiconset/` (drei 1024er-PNG plus + `Contents.json`). `ios-signieren.sh` legt sie ueber die von Capacitor erzeugte — `ios/` ist + gitignored, ein in Xcode eingesetztes Symbol waere beim naechsten `cap add ios` wieder weg. +- Drei Ausfuehrungen, wie iOS 18 sie erwartet: **hell** mit eigenem Grund, **dunkel** und + **getoent** ohne. Bei den letzten beiden legt das System seinen eigenen Grund darunter; ein + mitgeliefertes Schwarz bliebe darauf als Kasten sichtbar. Getoent wertet iOS die Helligkeit aus, + deshalb wird die 360 dort ein helleres Grau statt Rot — abgesetzt, ohne eine Farbe zu behaupten, + die es getoent nicht gibt. +- Die PNG sind in Chromium aus den SVG gerastert (die eingebettete Schrift steht nur dort + zuverlaessig zur Verfuegung). Bei einer Aenderung: `node scripts/logo-bauen.cjs`, dann neu + rastern — die SVG sind die Quelle, die PNG das Ergebnis. + +### Der Xcode-Lauf braucht jetzt keine Handgriffe mehr + +`ios-signieren.sh` erledigt der Reihe nach: Git-Stand pruefen, Webbuendel bauen, `cap sync`, +Standort-Berechtigung, Share-Erweiterung, App-Symbol, Versionsnummer aus der `manifest.json`, +alte Bereitstellungsprofile dieser App wegraeumen, archivieren, exportieren, Luftweg vorbereiten. + +Was zwangslaeufig manuell bleibt: die App-Gruppe und die App-ID `app.datametric360.teilen` im +Apple-Portal (einmalig), das Keychain-„Immer erlauben" beim ersten Signieren (einmalig pro +Schluesselbund; der nicht-interaktive Weg verlangt das Anmeldepasswort auf der Kommandozeile und +scheidet damit aus), und `git push` der fertigen `.ipa`, weil das Telefon sie aus dem Repo laedt. diff --git a/companion-app/native/AppIcon.appiconset/AppIcon-dunkel.png b/companion-app/native/AppIcon.appiconset/AppIcon-dunkel.png new file mode 100644 index 0000000..18f82ae Binary files /dev/null and b/companion-app/native/AppIcon.appiconset/AppIcon-dunkel.png differ diff --git a/companion-app/native/AppIcon.appiconset/AppIcon-getoent.png b/companion-app/native/AppIcon.appiconset/AppIcon-getoent.png new file mode 100644 index 0000000..9a1f7eb Binary files /dev/null and b/companion-app/native/AppIcon.appiconset/AppIcon-getoent.png differ diff --git a/companion-app/native/AppIcon.appiconset/AppIcon-hell.png b/companion-app/native/AppIcon.appiconset/AppIcon-hell.png new file mode 100644 index 0000000..72504eb Binary files /dev/null and b/companion-app/native/AppIcon.appiconset/AppIcon-hell.png differ diff --git a/companion-app/native/AppIcon.appiconset/Contents.json b/companion-app/native/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..6221212 --- /dev/null +++ b/companion-app/native/AppIcon.appiconset/Contents.json @@ -0,0 +1,38 @@ +{ + "images" : [ + { + "filename" : "AppIcon-hell.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "AppIcon-dunkel.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "AppIcon-getoent.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/companion-app/native/logo/AppIcon-dunkel.svg b/companion-app/native/logo/AppIcon-dunkel.svg new file mode 100644 index 0000000..b0ad1cb --- /dev/null +++ b/companion-app/native/logo/AppIcon-dunkel.svg @@ -0,0 +1,11 @@ + + + DataMetric + + 360 + diff --git a/companion-app/native/logo/AppIcon-getoent.svg b/companion-app/native/logo/AppIcon-getoent.svg new file mode 100644 index 0000000..4e85222 --- /dev/null +++ b/companion-app/native/logo/AppIcon-getoent.svg @@ -0,0 +1,11 @@ + + + DataMetric + + 360 + diff --git a/companion-app/native/logo/AppIcon-hell.svg b/companion-app/native/logo/AppIcon-hell.svg new file mode 100644 index 0000000..96150f3 --- /dev/null +++ b/companion-app/native/logo/AppIcon-hell.svg @@ -0,0 +1,12 @@ + + + + DataMetric + + 360 + diff --git a/companion-app/scripts/ios-signieren.sh b/companion-app/scripts/ios-signieren.sh index e48c253..dbff0d6 100755 --- a/companion-app/scripts/ios-signieren.sh +++ b/companion-app/scripts/ios-signieren.sh @@ -119,6 +119,25 @@ fi echo "==> Share-Erweiterung einrichten" node scripts/ios-teilen-einrichten.mjs +# App-Symbol einspielen. +# +# Capacitors Vorlage bringt ein eigenes Platzhalter-Symbol mit, und ios/ ist +# gitignored - ein in Xcode eingesetztes Symbol waere beim naechsten +# `npx cap add ios` wieder weg. Die Vorlage liegt deshalb versioniert unter +# native/AppIcon.appiconset und wird hier ueber die von Capacitor erzeugte +# gelegt. +# +# Drei Ausfuehrungen, wie iOS 18 sie erwartet: hell mit eigenem Grund, dunkel +# und getoent ohne - dort legt das System seinen eigenen Grund darunter, und +# ein mitgeliefertes Schwarz bliebe darauf als Kasten sichtbar. +echo "==> App-Symbol einspielen" +SYMBOLZIEL="ios/App/App/Assets.xcassets/AppIcon.appiconset" +rm -rf "$SYMBOLZIEL" +mkdir -p "$SYMBOLZIEL" +cp -R native/AppIcon.appiconset/. "$SYMBOLZIEL"/ +[ -f "$SYMBOLZIEL/Contents.json" ] || { echo "FEHLER: App-Symbol nicht eingespielt." >&2; exit 1; } +echo " hell, dunkel, getoent" + # Versionsnummer aus der manifest.json in die App schreiben. # # Capacitors Vorlage setzt 1.0/1 und laesst es dabei - zwei nacheinander diff --git a/companion-app/scripts/logo-bauen.cjs b/companion-app/scripts/logo-bauen.cjs new file mode 100644 index 0000000..12a4de3 --- /dev/null +++ b/companion-app/scripts/logo-bauen.cjs @@ -0,0 +1,135 @@ +/** + * Baut die drei App-Symbol-Vorlagen als SVG. + * + * Gewaehlt wurde Entwurf 3 bei 54 % Fahrzeuggroesse: DataMetric oben, das + * CI-Fahrzeug in der Mitte, 360 in Audi-Rot unten, auf Nacht-Grund. + * + * WARUM DIE SCHRIFTEN EINGEBETTET WERDEN + * -------------------------------------- + * Eine SVG-Datei, die nur `font-family: "Audi Type"` nennt, sieht nur dort + * richtig aus, wo die Schrift installiert ist. Auf einem anderen Rechner - und + * in jedem Rasterisierer - faellt sie auf eine Ersatzschrift zurueck, und das + * faellt erst am fertigen Symbol auf. Die woff2-Dateien stecken deshalb als + * data:-URI in der Datei; sie ist damit fuer sich allein vollstaendig. + * + * DIE DREI AUSFUEHRUNGEN VON iOS 18 + * --------------------------------- + * hell - die Kachel wie entworfen, mit eigenem Grund. + * dunkel - ohne Grund. iOS legt seinen eigenen dunklen Verlauf darunter; ein + * mitgeliefertes Schwarz wuerde darauf als Kasten sichtbar bleiben. + * getoent - ohne Grund und ohne Farbe. iOS faerbt das Bild selbst nach der + * Wahl des Nutzers ein und wertet dafuer die Helligkeit aus - das + * Rot der 360 wird deshalb zu einem helleren Grau als der Rest, + * damit die Zahl auch getoent noch abgesetzt bleibt. + * + * MASSE + * ----- + * Alles als Anteil der Kantenlaenge, hergeleitet aus dem freigegebenen + * Entwurf (Flex-Spalte, Abstand 0,02 - siehe index.html): + * + * Wort 0,095 | Abstand 0,02 | Fahrzeug 0,54 | Abstand 0,02 | Zahl 0,17 + * zusammen 0,845, der Rest verteilt sich gleichmaessig oben und unten. + */ + +const fs = require("fs") +const path = require("path") + +const SCHRIFTEN = path.join(__dirname, "..", "src", "assets", "audi", "schriften") + +/* Das CI-Fahrzeug kommt aus dem Panel selbst - eine zweite Kopie des Pfades + waere eine zweite Quelle fuer dieselbe Form. */ +const PANEL = path.join( + __dirname, + "..", + "..", + "custom_components", + "audi_dashboard", + "frontend", + "audi-dashboard-app.js", +) +const MARKE = "audi: '` +} + +/** + * @param {object} o + * @param {string|null} o.grund Hintergrund, oder null fuer keinen + * @param {string} o.vorn Wort und Fahrzeug + * @param {string} o.akzent die 360 + */ +function symbol({ grund, vorn, akzent }) { + return ` + +${grund ? ` \n` : ""}\ + DataMetric +${fahrzeug(vorn)} + 360 + +` +} + +const AUSFUEHRUNGEN = { + /* Nacht-Canvas und Audi-Rot aus den Tokens des Projekts. */ + hell: { grund: "#0C1014", vorn: "#FFFFFF", akzent: "#F50537" }, + dunkel: { grund: null, vorn: "#FFFFFF", akzent: "#F50537" }, + /* Getoent wertet iOS die Helligkeit aus: Weiss fuer Wort und Fahrzeug, ein + helles Grau fuer die Zahl - so bleibt sie abgesetzt, ohne eine Farbe zu + behaupten, die es getoent nicht gibt. */ + getoent: { grund: null, vorn: "#FFFFFF", akzent: "#B4B4B8" }, +} + +const ZIEL = path.join(__dirname, "..", "native", "logo") +fs.mkdirSync(ZIEL, { recursive: true }) + +for (const [name, o] of Object.entries(AUSFUEHRUNGEN)) { + const datei = path.join(ZIEL, `AppIcon-${name}.svg`) + fs.writeFileSync(datei, symbol(o), "utf8") + console.log(`${path.basename(datei)} ${(fs.statSync(datei).size / 1024).toFixed(0)} KB`) +} + +console.log("") +console.log("Masse bei 1024:") +console.log(` Wort Mitte y=${wortMitte.toFixed(1)} Groesse ${(A.wort * S).toFixed(1)}`) +console.log(` Fahrzeug oben y=${autoOben.toFixed(1)} Kante ${autoKante.toFixed(1)}`) +console.log(` Zahl Mitte y=${zahlMitte.toFixed(1)} Groesse ${(A.zahl * S).toFixed(1)}`)