From 4aba9f24a443fa5fbe80781747140e143939d6ee Mon Sep 17 00:00:00 2001 From: Jens Reinemann Date: Wed, 13 May 2026 23:56:56 +0200 Subject: [PATCH] chore: Dokumentation, SKILL.md und Drawables aktualisieren --- .github/skills/android-build/SKILL.md | 19 ++- Anforderungen/design/candidates.md | 84 ++++++++---- Anforderungen/design/requirements.md | 1 + .../res/drawable/ic_launcher_background.xml | 3 +- .../res/drawable/ic_launcher_foreground.xml | 128 +++++++++++++++++- 5 files changed, 202 insertions(+), 33 deletions(-) diff --git a/.github/skills/android-build/SKILL.md b/.github/skills/android-build/SKILL.md index b47d8b3..9549ae0 100644 --- a/.github/skills/android-build/SKILL.md +++ b/.github/skills/android-build/SKILL.md @@ -58,7 +58,20 @@ PowerShell konvertiert Binärdaten in UTF-16 und zerstört den PNG-Header. ### Direkter Gradle-Aufruf (Fallback) -Falls das Skript nicht verfügbar ist: +Falls das Skript nicht verfügbar ist, gibt es **zwei verlässliche Varianten**: + +#### Variante A – via `execution_subagent` (empfohlen) + +``` +cd x:\krisenvorrat ; .\gradlew assembleDebug test +``` + +- `.\gradlew` (ohne `.bat`) funktioniert hier einwandfrei +- Kein `| Out-String` nötig – `execution_subagent` wertet den Output korrekt aus +- Tasks können kombiniert werden: `assembleDebug test`, `assembleDebug assembleRelease` etc. +- `execution_subagent` meldet `BUILD SUCCESSFUL` zuverlässig, auch wenn Gradle Warnungen auf stderr ausgibt + +#### Variante B – via `run_in_terminal` (PowerShell direkt) ```powershell $env:ANDROID_HOME = "C:\Users\JensR\AppData\Local\Android\Sdk" @@ -66,7 +79,9 @@ cd "x:\krisenvorrat" .\gradlew.bat assembleDebug 2>&1 | Out-String ``` -**Wichtig:** Niemals `.\gradlew.bat ... 2>&1` ohne `| Out-String` verwenden – PowerShell interpretiert stderr-Warnungen sonst als Fehler und zeigt Exit-Code 1, obwohl Gradle `BUILD SUCCESSFUL` meldet. +**Wichtig:** Hier **muss** `.\gradlew.bat` (mit `.bat`) und `| Out-String` verwendet werden – +ohne `.bat` kann PowerShell die Ausgabe falsch interpretieren; ohne `| Out-String` werden +stderr-Warnungen als Fehler gewertet und Exit-Code 1 zurückgegeben, obwohl Gradle `BUILD SUCCESSFUL` meldet. --- diff --git a/Anforderungen/design/candidates.md b/Anforderungen/design/candidates.md index 62ae6b1..2553db7 100644 --- a/Anforderungen/design/candidates.md +++ b/Anforderungen/design/candidates.md @@ -9,43 +9,51 @@ Requirements file: anforderungen-v1.md + Anforderungen/design/requirements.md ### Candidate Table -| Name | Seed-Hex | Primär (Dark) | Charakter | M3-kompatibel | Lesbarkeit | Score | -|------|----------|----------------|-----------|---------------|------------|-------| -| A1 – Forest Green | `#2E7D32` | `#6EC072` (tone 80) | Klassisch dunkelgrün, bekannt, klar | ✅ | ✅ | 8 | -| A2 – Olivgrün / Militär | `#4A6741` | `#9CCB91` (tone 80) | Gedeckt, olivfarben, "Krisenvorrat"-Thema | ✅ | ✅ | 9 | -| A3 – Dunkelgrün Pure | `#1B5E20` | `#54BA5B` (tone 80) | Sehr satt, fast schwarz-grün, industriell | ✅ | ✅ | 7 | -| A4 – Waldgrün warm | `#3A5F3A` | `#8FCC8F` (tone 80) | Warm, natürlich, dezent | ✅ | ✅ | 8 | +| Name | Seed-Hex | Primär (Dark) | Charakter | M3-kompatibel | Lesbarkeit | Score | +| ----------------------- | --------- | ------------------- | ----------------------------------------- | ------------- | ---------- | ----- | +| A1 – Forest Green | `#2E7D32` | `#6EC072` (tone 80) | Klassisch dunkelgrün, bekannt, klar | ✅ | ✅ | 8 | +| A2 – Olivgrün / Militär | `#4A6741` | `#9CCB91` (tone 80) | Gedeckt, olivfarben, "Krisenvorrat"-Thema | ✅ | ✅ | 9 | +| A3 – Dunkelgrün Pure | `#1B5E20` | `#54BA5B` (tone 80) | Sehr satt, fast schwarz-grün, industriell | ✅ | ✅ | 7 | +| A4 – Waldgrün warm | `#3A5F3A` | `#8FCC8F` (tone 80) | Warm, natürlich, dezent | ✅ | ✅ | 8 | > Material 3 erzeugt aus dem Seed automatisch: primary, secondary, tertiary, surface, background, error – alle in Light + Dark. Anthrazit-Töne entstehen aus dem Low-Chroma-Neutral-Palette des Seeds. ### Details #### A1 – Forest Green (`#2E7D32`) + **Charakter:** Klassisches "Material Green 800". Klar erkennbar, professionell, gute Kontraste. **Dark-Theme-Primary:** ~`#6EC072` – mittelgrüner Akzent auf dunklem Hintergrund. -**Surfaces (Dark):** `#131A13` (Surface), `#1E251E` (SurfaceVariant) – dezent dunkelgrüne Tönung. +**Surfaces (Dark):** `#131A13` (Surface), `#1E251E` (SurfaceVariant) – dezent dunkelgrüne Tönung. + - ✅ Must: Alle erfüllt - ✅ Should: Erkennbarer Charakter, solide Kontraste - ⚠️ Missing: Nicht maximale "Krisenvorrat"-Eigenständigkeit – wirkt leicht wie Standard-Material-Grün #### A2 – Olivgrün / Militärgrün (`#4A6741`) + **Charakter:** Gedämpftes Oliv-Grün, militärische/Outdoor-Assoziation. Sehr gut zum Krisenvorrat-Kontext. **Dark-Theme-Primary:** ~`#9CCB91` – warmes, helles Olivgrün auf dunklem Hintergrund. -**Surfaces (Dark):** `#14191A` – leicht grünlich-anthrazit, sehr angenehm für den Ausdruck "Krisenvorrat". +**Surfaces (Dark):** `#14191A` – leicht grünlich-anthrazit, sehr angenehm für den Ausdruck "Krisenvorrat". + - ✅ Must: Alle erfüllt - ✅ Should: Maximale thematische Eigenständigkeit, excellent Lesbarkeit - ✅ Nice-to-Have: Ausgeprägte grüne Tönung der neutralen Flächen #### A3 – Dunkelgrün Pure (`#1B5E20`) + **Charakter:** Material Green 900 – sehr dunkel, fast schwarz-grün. Dramatischer Effekt. **Dark-Theme-Primary:** ~`#54BA5B` – lebhaftes Grün, guter Kontrast. -**Surfaces (Dark):** Sehr dunkle Flächen mit kaum sichtbarer Grün-Tönung. +**Surfaces (Dark):** Sehr dunkle Flächen mit kaum sichtbarer Grün-Tönung. + - ✅ Must: Alle erfüllt - ⚠️ Should: Surfaces wirken fast wie reines Schwarz, verliert Eigenständigkeit - ⚠️ Risiko: Wenig Differenzierung zwischen primärer Farbe und Surfaces #### A4 – Waldgrün warm (`#3A5F3A`) -**Charakter:** Warmer, natürlicher Grünton – liegt zwischen A1 und A2. + +**Charakter:** Warmer, natürlicher Grünton – liegt zwischen A1 und A2. + - ✅ Must: Alle erfüllt - ✅ Should: Gute Balance zwischen klar und charaktervoll - ⚠️ Missing: Leicht ähnlich zu A1, keine starke Eigenständigkeit @@ -56,15 +64,16 @@ Requirements file: anforderungen-v1.md + Anforderungen/design/requirements.md ### Candidate Table -| Option | Beschreibung | API-Anforderung | Markenkonsistenz | Wartungsaufwand | Score | -|--------|-------------|-----------------|------------------|-----------------|-------| -| B1 – Fixed Palette (custom Theme) | Fest definierte Farben aus Theme Builder | Android 5+ (API 21) | ✅ Immer gleich | Niedrig | 9 | -| B2 – Dynamic Color (wallpaper-basiert) | Monet-basiert, folgt dem Wallpaper | Android 12+ (API 31) | ❌ Variable | Niedrig | 3 | -| B3 – Hybrid: Fixed + Optional Dynamic | Fixed Palette als Fallback, Dynamic ab API 31 | Android 5+ mit Opt-in | ⚠️ Variabel auf API 31+ | Mittel | 6 | +| Option | Beschreibung | API-Anforderung | Markenkonsistenz | Wartungsaufwand | Score | +| -------------------------------------- | --------------------------------------------- | --------------------- | ----------------------- | --------------- | ----- | +| B1 – Fixed Palette (custom Theme) | Fest definierte Farben aus Theme Builder | Android 5+ (API 21) | ✅ Immer gleich | Niedrig | 9 | +| B2 – Dynamic Color (wallpaper-basiert) | Monet-basiert, folgt dem Wallpaper | Android 12+ (API 31) | ❌ Variable | Niedrig | 3 | +| B3 – Hybrid: Fixed + Optional Dynamic | Fixed Palette als Fallback, Dynamic ab API 31 | Android 5+ mit Opt-in | ⚠️ Variabel auf API 31+ | Mittel | 6 | ### Details #### B1 – Fixed Custom Palette ✅ **Empfohlen** + ```kotlin // In Theme.kt val DarkColorScheme = darkColorScheme( @@ -75,22 +84,26 @@ val DarkColorScheme = darkColorScheme( ) MaterialTheme(colorScheme = DarkColorScheme) { ... } ``` + - ✅ Funktioniert auf allen Android-Versionen - ✅ Konsistente "Krisenvorrat"-Markenidentität bei jedem User - ✅ Einfache Implementierung, geringer Wartungsaufwand - ✅ Die grün/anthrazite Ästhetik wird IMMER angezeigt #### B2 – Dynamic Color (Monet) + ```kotlin val colorScheme = if (Build.VERSION.SDK_INT >= 31) { dynamicDarkColorScheme(LocalContext.current) } else darkColorScheme(...) ``` + - 🔴 Verliert grüne Ästhetik – App sieht aus wie jede andere App - 🔴 Schließt Android 8–11 aus (>30% Marktanteil) - ❌ Does not fit: "Krisenvorrat-Ästhetik" ist explizit gefordert #### B3 – Hybrid + - ⚠️ Komplexität ohne echten Mehrwert für diesen Use Case - ⚠️ Auf Android 12+ weicht die "Krisenvorrat"-Ästhetik ab @@ -100,17 +113,18 @@ val colorScheme = if (Build.VERSION.SDK_INT >= 31) { ### Candidate Table -| Font | Dependency | Stil | Zahlen-Lesbarkeit | Compose-Support | Score | -|------|-----------|------|-------------------|-----------------|-------| -| C1 – Roboto (System) | Keine | Sachlich, neutral | ✅ Exzellent | Native | 8 | -| C2 – Inter (Google Fonts) | `ui-text-google-fonts` | Modern, clean | ✅ Sehr gut | Via GoogleFont API | 7 | -| C3 – Roboto Condensed | `ui-text-google-fonts` | Kompakt, industriell | ✅ Sehr gut | Via GoogleFont API | 7 | -| C4 – Source Sans 3 | `ui-text-google-fonts` | UI-optimiert, klar | ✅ Sehr gut | Via GoogleFont API | 7 | -| C5 – Roboto (default M3 TypeScale) | Keine | M3-Standard | ✅ Exzellent | Native | 9 | +| Font | Dependency | Stil | Zahlen-Lesbarkeit | Compose-Support | Score | +| ---------------------------------- | ---------------------- | -------------------- | ----------------- | ------------------ | ----- | +| C1 – Roboto (System) | Keine | Sachlich, neutral | ✅ Exzellent | Native | 8 | +| C2 – Inter (Google Fonts) | `ui-text-google-fonts` | Modern, clean | ✅ Sehr gut | Via GoogleFont API | 7 | +| C3 – Roboto Condensed | `ui-text-google-fonts` | Kompakt, industriell | ✅ Sehr gut | Via GoogleFont API | 7 | +| C4 – Source Sans 3 | `ui-text-google-fonts` | UI-optimiert, klar | ✅ Sehr gut | Via GoogleFont API | 7 | +| C5 – Roboto (default M3 TypeScale) | Keine | M3-Standard | ✅ Exzellent | Native | 9 | ### Details #### C5 – Roboto (default Material 3 TypeScale) ✅ **Empfohlen** + Jetpack Compose Material 3 verwendet Roboto als Standard. Die M3-TypeScale (Display/Headline/Title/Body/Label × Large/Medium/Small) ist bereits optimal für Android konfiguriert. **Keine zusätzliche Abhängigkeit, keine Netzwerk-Anfragen, kein APK-Overhead.** @@ -122,24 +136,29 @@ MaterialTheme( ... ) ``` + - ✅ Alle Must-Haves erfüllt: Exzellente Lesbarkeit, zahlenfreundlich, M3-kompatibel - ✅ Should: Sachliche, klare Anmutung – passt zu "klar, funktional, industriell" - ✅ Kein Google-Fonts-Netzwerkaufruf - ⚠️ Nice-to-Have: Keine typografische Eigenständigkeit gegenüber Standard-Android #### C2 – Inter (Google Fonts) + Beliebt in modernen UI-Projekten, leicht breitere Buchstabenform als Roboto. + ```kotlin val interFamily = FontFamily( Font(GoogleFont("Inter"), weight = FontWeight.Normal), Font(GoogleFont("Inter"), weight = FontWeight.Bold) ) ``` + - ✅ Slightly more distinct appearance - ⚠️ Benötigt `androidx.compose.ui:ui-text-google-fonts` Dependency - ⚠️ First-launch Netzwerkabruf (downloadable fonts) – nicht Offline-First #### C3 – Roboto Condensed + - ✅ Passt gut zu "industriellem" Look - ⚠️ Auf kleinen Screens kann Kondensierung die Lesbarkeit bei kleineren Schriftgraden reduzieren @@ -149,16 +168,17 @@ val interFamily = FontFamily( ### Candidate Table -| Library | Icons | Compose-nativ | Dependency | Lizenz | APK-Impact | Score | -|---------|-------|---------------|------------|--------|------------|-------| -| D1 – Material Icons Extended | ~900 | ✅ Nativ | `compose.material:material-icons-extended` | Apache 2.0 | ~3MB (ProGuard eliminiert unused) | 9 | -| D2 – Lucide Icons (Compose) | ~1.400 | ✅ Nativ | `com.composables:icons-lucide` | ISC | ~4MB | 7 | -| D3 – Phosphor for Compose | ~1.600 | ✅ Nativ | `com.composables:icons-phosphor` | MIT | ~5MB | 7 | -| D4 – Custom SVG Icons | unbegrenzt | Via VectorDrawable | Kein | Eigen | Minimal | 4 | +| Library | Icons | Compose-nativ | Dependency | Lizenz | APK-Impact | Score | +| ---------------------------- | ---------- | ------------------ | ------------------------------------------ | ---------- | --------------------------------- | ----- | +| D1 – Material Icons Extended | ~900 | ✅ Nativ | `compose.material:material-icons-extended` | Apache 2.0 | ~3MB (ProGuard eliminiert unused) | 9 | +| D2 – Lucide Icons (Compose) | ~1.400 | ✅ Nativ | `com.composables:icons-lucide` | ISC | ~4MB | 7 | +| D3 – Phosphor for Compose | ~1.600 | ✅ Nativ | `com.composables:icons-phosphor` | MIT | ~5MB | 7 | +| D4 – Custom SVG Icons | unbegrenzt | Via VectorDrawable | Kein | Eigen | Minimal | 4 | ### Details #### D1 – Material Icons Extended ✅ **Empfohlen** + Die offizielle Google-Icon-Bibliothek für Compose. Enthält alle benötigten Icons für diese App: `Inventory2`, `Category`, `Place`, `Warning`, `DateRange`, `Edit`, `Delete`, `FileUpload`, `FileDownload`, `Settings`, `Search`, `Home`, `List`, `ShoppingCart`, `NotificationsActive`, `Add`, `Remove`, `MoreVert`, etc. @@ -178,16 +198,19 @@ Icon(Icons.Filled.Warning, contentDescription = "Warnung") - ⚠️ Nice-to-Have: Nicht maximale Eigenständigkeit (sehen wie Standard-Android aus) #### D2 – Lucide Icons + - ✅ Größere Auswahl, moderner Look - ⚠️ Drittanbieter-Dependency, noch nicht so etabliert in Android-Community - ⚠️ Nicht von Google maintained → Long-term Support-Risiko #### D3 – Phosphor + - ✅ Größte Auswahl, mehrere Styles (thin/light/regular/bold/fill/duotone) - ⚠️ Drittanbieter, Community-maintained - ⚠️ "Duotone"-Styles funktionieren in Compose nicht nativ #### D4 – Custom SVG Icons + - 🔴 Sehr hoher Aufwand (jedes Icon muss als VectorDrawable erstellt werden) - Nur sinnvoll für wenige, besondere Brand-Icons @@ -199,22 +222,25 @@ Date: 2026-05-13 Decided by: User ### A – Seed Color + **Gewählt:** `#4A6741` (Olivgrün / Militärgrün) **Begründung:** Passt thematisch optimal zum Krisenvorrat-Kontext. Material 3 generiert daraus einen anthrazitgrünen Dark-Theme-Look mit dezenter Grün-Tönung der Surfaces. **Alternativen:** `#2E7D32` (Forest Green, zu generisch), `#1B5E20` (zu dunkel), `#3A5F3A` (zu ähnlich zu Forest Green) ### B – Dynamic Color + **Gewählt:** Fixed Custom Palette (B1) **Begründung:** App-Identität ("Krisenvorrat"-Ästhetik) muss konsistent bleiben. Dynamic Color würde das grüne Branding überschreiben. Fixed Palette funktioniert auf allen Android-Versionen. **Alternativen:** Dynamic Color (verliert Branding), Hybrid (unnötige Komplexität) ### C – Typography + **Gewählt:** Default Roboto M3 TypeScale (C5) **Begründung:** Null Overhead, exzellente Lesbarkeit für zahlen-/datenlastige Ansichten, sachlich-industrielle Anmutung. Eigenständigkeit kommt über die Farbwahl, nicht den Font. **Alternativen:** Inter (Netzwerk-Dependency), Roboto Condensed (Lesbarkeitsverlust bei kleinen Graden) ### D – Icon-Set + **Gewählt:** Material Icons Extended (D1) **Begründung:** Native Compose-Integration, alle benötigten Icons vorhanden, von Google gepflegt, APK-Overhead durch R8 eliminiert. **Alternativen:** Lucide (Drittanbieter-Risiko), Phosphor (Drittanbieter-Risiko), Custom SVG (zu aufwändig) - diff --git a/Anforderungen/design/requirements.md b/Anforderungen/design/requirements.md index 913f93a..059fff0 100644 --- a/Anforderungen/design/requirements.md +++ b/Anforderungen/design/requirements.md @@ -11,6 +11,7 @@ Author: Tech-Decision Workflow Vor der Implementierung der ersten UI-Screens müssen vier visuelle Designentscheidungen getroffen werden, die direkt in die Compose-Theme-Datei einfließen. Die App ist eine native Android-App (Kotlin + Jetpack Compose + Material 3). Übergeordnetes Design-Ziel laut Anforderungen (anforderungen-v1.md, Abschnitt 6): + - **Stil:** Klar, funktional, industriell - **UI-Framework:** Material 3 Komponenten - **Farbschema:** Dark Theme, Dunkelgrün / Anthrazit – "Krisenvorrat-Ästhetik", gut lesbar diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index de42250..86f738e 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -4,7 +4,8 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml index d9a6832..c6a0d12 100644 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -4,7 +4,133 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:pathData="M44.5,34.5 m-1.2,0 a1.2,1.2 0 1,0 2.4,0 a1.2,1.2 0 1,0 -2.4,0" /> + + + + + + + + + + + + +