Flixy heißt ab hier Halo
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>
This commit is contained in:
co-authored by
Claude Opus 5
parent
2fcf6821c8
commit
4b9a1e7b67
@@ -1,8 +1,8 @@
|
||||
/* ============================================================================
|
||||
Flixy für Jellyfin Web
|
||||
Halo für Jellyfin Web
|
||||
----------------------------------------------------------------------------
|
||||
Bringt Jellyfins Weboberfläche auf die Farben, Schrift und Formen der
|
||||
Flixy-App. Es ist ein Kleid, kein Umbau: die Oberfläche bleibt Jellyfins,
|
||||
Halo-App. Es ist ein Kleid, kein Umbau: die Oberfläche bleibt Jellyfins,
|
||||
sie sieht nur anders aus.
|
||||
|
||||
EINBAUEN
|
||||
@@ -26,32 +26,32 @@
|
||||
Orchid #C04AC9 · Rose #F76190
|
||||
Voreingestellt ist Orchid — die Farbe, die auf dem iPad eingestellt
|
||||
ist. Die App selbst kommt ab Werk mit Mint. */
|
||||
--flixy-accent: #C04AC9;
|
||||
--halo-accent: #C04AC9;
|
||||
|
||||
/* ---- Die Flächen der App, von hinten nach vorn ---------------------- */
|
||||
--flixy-canvas: #0B0B0D; /* Seitenhintergrund */
|
||||
--flixy-surface: #141417; /* Karten, Kopfbereiche */
|
||||
--flixy-elevated: #1D1D21; /* Blätter, Menüs */
|
||||
--flixy-placeholder: #26262B; /* Platzhalter, gedrückte Zustände */
|
||||
--halo-canvas: #0B0B0D; /* Seitenhintergrund */
|
||||
--halo-surface: #141417; /* Karten, Kopfbereiche */
|
||||
--halo-elevated: #1D1D21; /* Blätter, Menüs */
|
||||
--halo-placeholder: #26262B; /* Platzhalter, gedrückte Zustände */
|
||||
|
||||
--flixy-text: #F5F5F7;
|
||||
--flixy-text-secondary: #A0A0A8;
|
||||
--flixy-text-muted: #6E6E76;
|
||||
--flixy-destructive: #E5484D;
|
||||
--flixy-separator: rgba(255, 255, 255, 0.10);
|
||||
--halo-text: #F5F5F7;
|
||||
--halo-text-secondary: #A0A0A8;
|
||||
--halo-text-muted: #6E6E76;
|
||||
--halo-destructive: #E5484D;
|
||||
--halo-separator: rgba(255, 255, 255, 0.10);
|
||||
|
||||
/* ---- Formen --------------------------------------------------------- */
|
||||
--flixy-radius-card: 8px;
|
||||
--flixy-radius-control: 10px;
|
||||
--flixy-radius-sheet: 16px;
|
||||
--flixy-radius-panel: 22px; /* die schwebende Leiste */
|
||||
--halo-radius-card: 8px;
|
||||
--halo-radius-control: 10px;
|
||||
--halo-radius-sheet: 16px;
|
||||
--halo-radius-panel: 22px; /* die schwebende Leiste */
|
||||
|
||||
/* ---- Schrift --------------------------------------------------------
|
||||
Der größte einzelne Hebel. Jellyfin liefert Noto Sans aus; die
|
||||
Systemschrift macht aus derselben Seite sofort eine, die auf den
|
||||
Rechner gehört — SF auf Mac und iPhone, Segoe UI Variable auf
|
||||
Windows 11. */
|
||||
--flixy-font: -apple-system, BlinkMacSystemFont, "SF Pro Text",
|
||||
--halo-font: -apple-system, BlinkMacSystemFont, "SF Pro Text",
|
||||
"Segoe UI Variable Text", "Segoe UI", system-ui,
|
||||
Roboto, "Helvetica Neue", sans-serif;
|
||||
|
||||
@@ -59,52 +59,52 @@
|
||||
Hier entsteht der Großteil der Wirkung: Jellyfin baut auf einer
|
||||
MUI-Palette auf, und wer die verstellt, verstellt alles, was darauf
|
||||
aufsetzt — inklusive Bauteilen, die dieses CSS gar nicht kennt. */
|
||||
--jf-palette-background-default: var(--flixy-canvas);
|
||||
--jf-palette-background-default: var(--halo-canvas);
|
||||
--jf-palette-background-defaultChannel: 11 11 13;
|
||||
--jf-palette-background-paper: var(--flixy-surface);
|
||||
--jf-palette-background-paper: var(--halo-surface);
|
||||
--jf-palette-background-paperChannel: 20 20 23;
|
||||
|
||||
--jf-palette-primary-main: var(--flixy-accent);
|
||||
--jf-palette-primary-dark: var(--flixy-accent);
|
||||
--jf-palette-primary-light: var(--flixy-accent);
|
||||
--jf-palette-secondary-main: var(--flixy-accent);
|
||||
--jf-palette-secondary-dark: var(--flixy-accent);
|
||||
--jf-palette-secondary-light: var(--flixy-accent);
|
||||
--jf-palette-primary-main: var(--halo-accent);
|
||||
--jf-palette-primary-dark: var(--halo-accent);
|
||||
--jf-palette-primary-light: var(--halo-accent);
|
||||
--jf-palette-secondary-main: var(--halo-accent);
|
||||
--jf-palette-secondary-dark: var(--halo-accent);
|
||||
--jf-palette-secondary-light: var(--halo-accent);
|
||||
/* Schrift auf dem Akzent: hell, weil die Palette der App durchweg
|
||||
kräftige Farben hat. Bei einem hellen Akzent (Amber, Lime) hier auf
|
||||
#101013 stellen, sonst verschwindet die Beschriftung. */
|
||||
--jf-palette-primary-contrastText: #FFFFFF;
|
||||
--jf-palette-secondary-contrastText: #FFFFFF;
|
||||
|
||||
--jf-palette-text-primary: var(--flixy-text);
|
||||
--jf-palette-text-secondary: var(--flixy-text-secondary);
|
||||
--jf-palette-text-disabled: var(--flixy-text-muted);
|
||||
--jf-palette-text-icon: var(--flixy-text-secondary);
|
||||
--jf-palette-divider: var(--flixy-separator);
|
||||
--jf-palette-text-primary: var(--halo-text);
|
||||
--jf-palette-text-secondary: var(--halo-text-secondary);
|
||||
--jf-palette-text-disabled: var(--halo-text-muted);
|
||||
--jf-palette-text-icon: var(--halo-text-secondary);
|
||||
--jf-palette-divider: var(--halo-separator);
|
||||
|
||||
--jf-palette-error-main: var(--flixy-destructive);
|
||||
--jf-palette-error-main: var(--halo-destructive);
|
||||
--jf-palette-error-dark: #B4373B;
|
||||
--jf-palette-error-light: #EC6E72;
|
||||
|
||||
--jf-palette-action-hover: rgba(255, 255, 255, 0.06);
|
||||
--jf-palette-action-selected: rgba(255, 255, 255, 0.12);
|
||||
--jf-palette-action-disabled: var(--flixy-text-muted);
|
||||
--jf-palette-action-disabled: var(--halo-text-muted);
|
||||
|
||||
/* Die Kopfleiste trägt die Insel — sie selbst bleibt durchsichtig. */
|
||||
--jf-palette-AppBar-defaultBg: transparent;
|
||||
--jf-palette-AppBar-darkBg: transparent;
|
||||
|
||||
--jf-card-borderRadius: var(--flixy-radius-card);
|
||||
--jf-shape-borderRadius: var(--flixy-radius-control);
|
||||
--jf-card-borderRadius: var(--halo-radius-card);
|
||||
--jf-shape-borderRadius: var(--halo-radius-control);
|
||||
}
|
||||
|
||||
/* ---- Grundfläche und Schrift --------------------------------------------
|
||||
`html` bekommt seinen Hintergrund bei Jellyfin unmittelbar gesetzt und
|
||||
nicht über die Palette — deshalb steht er hier noch einmal ausdrücklich. */
|
||||
html {
|
||||
background-color: var(--flixy-canvas) !important;
|
||||
font-family: var(--flixy-font) !important;
|
||||
color: var(--flixy-text);
|
||||
background-color: var(--halo-canvas) !important;
|
||||
font-family: var(--halo-font) !important;
|
||||
color: var(--halo-text);
|
||||
}
|
||||
|
||||
body,
|
||||
@@ -117,12 +117,12 @@ textarea,
|
||||
.emby-select,
|
||||
.cardText,
|
||||
.sectionTitle {
|
||||
font-family: var(--flixy-font) !important;
|
||||
font-family: var(--halo-font) !important;
|
||||
}
|
||||
|
||||
.backgroundContainer,
|
||||
.mainAnimatedPage {
|
||||
background-color: var(--flixy-canvas) !important;
|
||||
background-color: var(--halo-canvas) !important;
|
||||
}
|
||||
|
||||
/* ---- Die Kopfleiste als schwebende Insel --------------------------------
|
||||
@@ -136,8 +136,8 @@ textarea,
|
||||
background: rgba(20, 20, 23, 0.72) !important;
|
||||
backdrop-filter: saturate(180%) blur(20px);
|
||||
-webkit-backdrop-filter: saturate(180%) blur(20px);
|
||||
border: 1px solid var(--flixy-separator);
|
||||
border-radius: var(--flixy-radius-panel);
|
||||
border: 1px solid var(--halo-separator);
|
||||
border-radius: var(--halo-radius-panel);
|
||||
margin: 10px 12px 0;
|
||||
width: calc(100% - 24px);
|
||||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45);
|
||||
@@ -149,18 +149,18 @@ textarea,
|
||||
|
||||
/* ---- Die Seitenleiste ---------------------------------------------------- */
|
||||
.mainDrawer {
|
||||
background-color: var(--flixy-surface) !important;
|
||||
border-right: 1px solid var(--flixy-separator);
|
||||
background-color: var(--halo-surface) !important;
|
||||
border-right: 1px solid var(--halo-separator);
|
||||
}
|
||||
|
||||
.navMenuOption {
|
||||
border-radius: var(--flixy-radius-control);
|
||||
border-radius: var(--halo-radius-control);
|
||||
margin: 2px 8px;
|
||||
}
|
||||
|
||||
.navMenuOption-selected {
|
||||
background: var(--flixy-elevated) !important;
|
||||
color: var(--flixy-accent) !important;
|
||||
background: var(--halo-elevated) !important;
|
||||
color: var(--halo-accent) !important;
|
||||
}
|
||||
|
||||
/* ---- Karten -------------------------------------------------------------
|
||||
@@ -171,7 +171,7 @@ textarea,
|
||||
.cardContent,
|
||||
.cardScalable,
|
||||
.cardOverlayContainer {
|
||||
border-radius: var(--flixy-radius-card) !important;
|
||||
border-radius: var(--halo-radius-card) !important;
|
||||
}
|
||||
|
||||
.cardBox {
|
||||
@@ -179,11 +179,11 @@ textarea,
|
||||
}
|
||||
|
||||
.cardText {
|
||||
color: var(--flixy-text);
|
||||
color: var(--halo-text);
|
||||
}
|
||||
|
||||
.cardText-secondary {
|
||||
color: var(--flixy-text-secondary);
|
||||
color: var(--halo-text-secondary);
|
||||
}
|
||||
|
||||
.defaultCardBackground,
|
||||
@@ -192,13 +192,13 @@ textarea,
|
||||
.defaultCardBackground3,
|
||||
.defaultCardBackground4,
|
||||
.defaultCardBackground5 {
|
||||
background-color: var(--flixy-placeholder) !important;
|
||||
background-color: var(--halo-placeholder) !important;
|
||||
}
|
||||
|
||||
/* Der Fortschrittsbalken auf angefangenen Titeln — in der App trägt er den
|
||||
Akzent, und er ist dünner als Jellyfins Voreinstellung. */
|
||||
.itemProgressBarForeground {
|
||||
background-color: var(--flixy-accent) !important;
|
||||
background-color: var(--halo-accent) !important;
|
||||
}
|
||||
|
||||
.itemProgressBar {
|
||||
@@ -211,18 +211,18 @@ textarea,
|
||||
.emby-button,
|
||||
.button-flat,
|
||||
.detailButton {
|
||||
border-radius: var(--flixy-radius-control) !important;
|
||||
font-family: var(--flixy-font) !important;
|
||||
border-radius: var(--halo-radius-control) !important;
|
||||
font-family: var(--halo-font) !important;
|
||||
}
|
||||
|
||||
.emby-button.raised {
|
||||
background: var(--flixy-elevated);
|
||||
color: var(--flixy-text);
|
||||
background: var(--halo-elevated);
|
||||
color: var(--halo-text);
|
||||
}
|
||||
|
||||
.emby-button.raised.button-submit,
|
||||
.button-submit {
|
||||
background: var(--flixy-accent) !important;
|
||||
background: var(--halo-accent) !important;
|
||||
color: #FFFFFF !important;
|
||||
}
|
||||
|
||||
@@ -236,22 +236,22 @@ textarea,
|
||||
.emby-input,
|
||||
.emby-select,
|
||||
.emby-textarea {
|
||||
background-color: var(--flixy-elevated) !important;
|
||||
border: 1px solid var(--flixy-separator) !important;
|
||||
border-radius: var(--flixy-radius-control) !important;
|
||||
color: var(--flixy-text) !important;
|
||||
background-color: var(--halo-elevated) !important;
|
||||
border: 1px solid var(--halo-separator) !important;
|
||||
border-radius: var(--halo-radius-control) !important;
|
||||
color: var(--halo-text) !important;
|
||||
}
|
||||
|
||||
.emby-input:focus,
|
||||
.emby-select:focus {
|
||||
border-color: var(--flixy-accent) !important;
|
||||
border-color: var(--halo-accent) !important;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.inputLabel,
|
||||
.selectLabel,
|
||||
.fieldDescription {
|
||||
color: var(--flixy-text-secondary) !important;
|
||||
color: var(--halo-text-secondary) !important;
|
||||
}
|
||||
|
||||
/* ---- Blätter, Menüs, Dialoge --------------------------------------------- */
|
||||
@@ -259,9 +259,9 @@ textarea,
|
||||
.formDialog,
|
||||
.actionSheet,
|
||||
.paper-icon-button-light + .actionSheet {
|
||||
background-color: var(--flixy-elevated) !important;
|
||||
border-radius: var(--flixy-radius-sheet) !important;
|
||||
border: 1px solid var(--flixy-separator);
|
||||
background-color: var(--halo-elevated) !important;
|
||||
border-radius: var(--halo-radius-sheet) !important;
|
||||
border: 1px solid var(--halo-separator);
|
||||
}
|
||||
|
||||
.actionSheetMenuItem:hover,
|
||||
@@ -278,7 +278,7 @@ textarea,
|
||||
|
||||
.detailSectionContent,
|
||||
.detailTableBodyCell {
|
||||
color: var(--flixy-text-secondary);
|
||||
color: var(--halo-text-secondary);
|
||||
}
|
||||
|
||||
/* Das Hintergrundbild soll nach unten in die Seitenfarbe auslaufen, statt an
|
||||
@@ -296,7 +296,7 @@ textarea,
|
||||
|
||||
/* ---- Überschriften ------------------------------------------------------- */
|
||||
.sectionTitle {
|
||||
color: var(--flixy-text) !important;
|
||||
color: var(--halo-text) !important;
|
||||
font-weight: 600;
|
||||
letter-spacing: -0.01em;
|
||||
}
|
||||
@@ -305,11 +305,11 @@ textarea,
|
||||
.listItem-border,
|
||||
.detailTableBodyCell,
|
||||
hr {
|
||||
border-color: var(--flixy-separator) !important;
|
||||
border-color: var(--halo-separator) !important;
|
||||
}
|
||||
|
||||
::selection {
|
||||
background: var(--flixy-accent);
|
||||
background: var(--halo-accent);
|
||||
color: #FFFFFF;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user