Reine Umbenennung, kein Verhalten geändert — bewusst als eigener Commit, damit „umbenannt" und „umgebaut" im Nachhinein auseinanderzuhalten sind. 712 mal `Flixy`, 778 mal `flixy`, 7 mal `FLIXY` in 169 Dateien, dazu 25 Pfade. Ziele: `Halo`, `HaloTV`, `HaloTopShelf`, `HaloUITests`, `HaloKit` mit `HaloDesign`, `HaloDownloads`, `HaloPlayback` und `HaloProbe`. `MediaKit`, `JellyfinKit` und `DownloadWidget` tragen den Namen nicht und bleiben. `docs/superpowers/specs/` ist ausgenommen. Datierte Entwurfsdokumente sind ein Protokoll getroffener Entscheidungen; sie nachträglich umzuschreiben hiesse, die Vergangenheit zu glätten. **Die Bundle-ID wandert mit** — ausdrücklich so gewollt, mit bekanntem Preis: `com.scarriffleservices.halo` ist für iOS eine *andere* App. Die installierte Fassung bleibt daneben stehen, mit Downloads und Anmeldung in ihrem Container; Halo startet leer. Einmal neu anmelden, heruntergeladene Folgen einmal neu laden. Dasselbe gilt für die App-Gruppe, die sich TV-App und Top Shelf teilen. **Eine Folge davon, die beim Entscheiden noch nicht auf dem Tisch lag:** der Aufräumschritt aus dem vorigen Commit kommt an die alten Plex-Token nicht mehr heran. Der Schlüsselbund grenzt nach Team und Bundle-Kennung ab — was unter `…flixy` liegt, ist für `…halo` unerreichbar. Erledigt wird es trotzdem, nur anders: **die alte App löschen.** iOS räumt deren Schlüsselbund-Einträge beim Deinstallieren mit ab. Der Code bleibt stehen, weil er für jeden Stand vor dieser Umbenennung richtig ist und im Jahr einen Startvergleich kostet. Die Projektdatei ist aus `project.yml` neu erzeugt, der alte Ordner gelöscht statt umbenannt — sie steht ohnehin nicht im Repo. Das Verzeichnis des Repos selbst heißt weiter `Flixy`; das umzubenennen ist ein Handgriff ausserhalb des Projekts. 368 Tests grün. iOS und tvOS bauen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
62 lines
2.4 KiB
Swift
62 lines
2.4 KiB
Swift
import SwiftUI
|
|
import HaloDesign
|
|
|
|
/// Der erste Buchstabe auf einer Scheibe.
|
|
///
|
|
/// **Kein Platzhalterbild.** Jellyfin gibt kein Profilbild heraus, ohne dass
|
|
/// eines hinterlegt ist, und am Konto führt die App heute keines mit. Ein
|
|
/// Buchstabe ist ehrlicher als eine graue Silhouette, die bei jedem gleich
|
|
/// aussieht — und man erkennt an ihm wenigstens, mit welchem Konto man
|
|
/// angemeldet ist.
|
|
///
|
|
/// Stand bis eben in `AccountBar` und wird jetzt zweimal gebraucht: dort in
|
|
/// der Seitenleiste und auf dem iPhone oben rechts, wo seit dem Wegfall des
|
|
/// Einstellungen-Tabs der Weg dorthin liegt.
|
|
struct AccountAvatar: View {
|
|
let name: String
|
|
var diameter: CGFloat = 26
|
|
|
|
@Environment(\.haloAccent) private var accent
|
|
|
|
var body: some View {
|
|
Text(name.prefix(1).uppercased())
|
|
// Mit der Scheibe wachsen, nicht fest: oben rechts auf dem
|
|
// Telefon ist er grösser als in der Leiste, und ein Buchstabe in
|
|
// Kleinschrift auf einer grossen Scheibe sieht aus wie ein
|
|
// Fehler.
|
|
.font(.system(size: diameter * 0.46, weight: .semibold))
|
|
.foregroundStyle(Color.haloCanvas)
|
|
.frame(width: diameter, height: diameter)
|
|
.background(accent, in: .circle)
|
|
}
|
|
}
|
|
|
|
extension EnvironmentValues {
|
|
/// Öffnet die Einstellungen.
|
|
///
|
|
/// **Über die Umgebung, weil der Knopf an mehreren Stellen steht.** Das
|
|
/// Blatt gehört der Wurzel — nur sie überlebt den Wechsel des Bereichs.
|
|
/// Jeder Bildschirm, der den Knopf zeigt, müsste den Weg dorthin sonst
|
|
/// als Argument durchgereicht bekommen.
|
|
@Entry var haloOpenSettings: () -> Void = {}
|
|
}
|
|
|
|
/// Das Monogramm als Knopf für eine Werkzeugleiste.
|
|
///
|
|
/// **Als Ansicht und nicht als Modifikator.** Ein Modifikator hängt seine
|
|
/// Einträge aussen an, und SwiftUI reiht aussen zuerst — das Monogramm stand
|
|
/// damit **vor** Suche, Filter und Ansicht statt dahinter. Wo in der Reihe es
|
|
/// steht, kann nur der entscheiden, der die Reihe schreibt.
|
|
struct AccountToolbarButton: View {
|
|
@Environment(HaloSession.self) private var session
|
|
@Environment(\.haloOpenSettings) private var openSettings
|
|
|
|
var body: some View {
|
|
Button(action: openSettings) {
|
|
AccountAvatar(name: session.accountName ?? session.serverName, diameter: 34)
|
|
}
|
|
.buttonStyle(.plain)
|
|
.accessibilityLabel(Text("sidebar.settings"))
|
|
}
|
|
}
|