Fix #130: Marke der Anmeldeseite an die Seitenleiste angleichen
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
9d771df028
commit
a2867bd806
6 changed files with 130 additions and 4 deletions
|
|
@ -31,6 +31,8 @@ Das Format folgt [Keep a Changelog](https://keepachangelog.com/de/1.1.0/).
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
- Anmeldeseite: Die Marke zeigt wie die Seitenleiste nach dem Anmelden das Coinstack-Symbol
|
||||||
|
und den fetten, zweifarbigen Schriftzug „Finanzmanager“ statt einer grauen Statusmarke (#130)
|
||||||
- Buchungsmaske: Eine falsche Splitsumme zeigte zwar die Fehlermeldung, riss aber über die
|
- Buchungsmaske: Eine falsche Splitsumme zeigte zwar die Fehlermeldung, riss aber über die
|
||||||
Weiterleitung zur leeren Maske alle gerade erfassten Splitzeilen heraus; jetzt bleibt die
|
Weiterleitung zur leeren Maske alle gerade erfassten Splitzeilen heraus; jetzt bleibt die
|
||||||
Maske mit den eigenen Eingaben stehen, bis die Summe stimmt (#95)
|
Maske mit den eigenen Eingaben stehen, bis die Summe stimmt (#95)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,12 @@
|
||||||
# Änderungen
|
# Änderungen
|
||||||
|
|
||||||
|
## Anmeldeseite: Marke wie in der Seitenleiste (12.10.2026)
|
||||||
|
|
||||||
|
- Anlass (#130): Icon und Schrift des Logos auf der Anmeldeseite wichen von der Marke im angemeldeten Zustand ab.
|
||||||
|
- Der schlichte Rahmen (`src/Views/layout/schlicht.php` – Anmeldung, Ersteinrichtung, Fehlerseite) zeigt jetzt das Coinstack-Symbol und den Schriftzug „Finanz**manager**“ im Schriftschnitt der Seitenleiste. Bisher erbte der Schriftzug die Regeln der kleinen Statusmarke (`.marke`) und stand grau mit Rahmen da.
|
||||||
|
- Weil die Karte hell ist, trägt die erste Worthälfte die Textfarbe und die zweite die lesbare Akzentfarbe (`--akzent-schrift`); im dunklen Thema entspricht das dem Blau der Seitenleiste.
|
||||||
|
- Tests: `tests/64_AnmeldeMarkeTest.php`, `tests/e2e/specs/smoke.spec.js`.
|
||||||
|
|
||||||
## Depotbuchung erfassen: Stück, Kurs und Betrag rechnen sich (12.10.2026)
|
## Depotbuchung erfassen: Stück, Kurs und Betrag rechnen sich (12.10.2026)
|
||||||
|
|
||||||
- Anlass (#129): Bei Kauf und Verkauf sollten sich Betrag, Stück und Kurs gegenseitig ergeben – Betrag = Stück × Kurs.
|
- Anlass (#129): Bei Kauf und Verkauf sollten sich Betrag, Stück und Kurs gegenseitig ergeben – Betrag = Stück × Kurs.
|
||||||
|
|
|
||||||
|
|
@ -1782,12 +1782,23 @@ body.schlicht {
|
||||||
max-width: 400px;
|
max-width: 400px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.marke.gross {
|
/* Die Marke der Anmeldung gleicht der Seitenleiste: Symbol, Schriftschnitt und
|
||||||
|
zweite Worthälfte in Akzentfarbe. Weiß auf der hellen Karte wäre unsichtbar,
|
||||||
|
deshalb trägt die erste Hälfte die Textfarbe und die zweite die lesbare
|
||||||
|
Variante des Akzents. */
|
||||||
|
.anmelde-marke {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: .6rem;
|
||||||
padding: 0 0 1.25rem;
|
padding: 0 0 1.25rem;
|
||||||
font-size: 1.3rem;
|
font-size: 1.3rem;
|
||||||
color: var(--text);
|
font-weight: 700;
|
||||||
|
letter-spacing: .01em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.anmelde-marke .marken-text { color: var(--text); }
|
||||||
|
.anmelde-marke .marken-text span { color: var(--akzent-schrift); }
|
||||||
|
|
||||||
/* ── Auswertungen ────────────────────────────────────────────────────────── */
|
/* ── Auswertungen ────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
/* Aufklappmenü ohne JavaScript: <details> in der Aktionsleiste. Ein eigenes
|
/* Aufklappmenü ohne JavaScript: <details> in der Aktionsleiste. Ein eigenes
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,12 @@ use Finanzmanager\View;
|
||||||
<body class="schlicht">
|
<body class="schlicht">
|
||||||
<?php include __DIR__ . '/meldungen.php'; ?>
|
<?php include __DIR__ . '/meldungen.php'; ?>
|
||||||
<div class="karte-mitte">
|
<div class="karte-mitte">
|
||||||
<div class="marke gross">Finanzmanager</div>
|
<!-- Dieselbe Marke wie oben in der Seitenleiste: Coinstack-Symbol und
|
||||||
|
zweifarbiger Schriftzug. -->
|
||||||
|
<div class="anmelde-marke">
|
||||||
|
<img src="/static/coinstack.png" alt="" class="marken-symbol">
|
||||||
|
<span class="marken-text">Finanz<span>manager</span></span>
|
||||||
|
</div>
|
||||||
<?= $inhalt ?>
|
<?= $inhalt ?>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
||||||
78
tests/64_AnmeldeMarkeTest.php
Normal file
78
tests/64_AnmeldeMarkeTest.php
Normal file
|
|
@ -0,0 +1,78 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Die Anmeldeseite (und jede andere Seite im schlichten Rahmen) trägt dieselbe
|
||||||
|
* Marke wie die Seitenleiste nach dem Anmelden: Coinstack-Symbol und
|
||||||
|
* zweifarbiger Schriftzug.
|
||||||
|
*/
|
||||||
|
class AnmeldeMarkeTest extends TestCase
|
||||||
|
{
|
||||||
|
protected string $testName = 'Test 64: Marke der Anmeldeseite';
|
||||||
|
|
||||||
|
public function run(): void
|
||||||
|
{
|
||||||
|
$this->anmeldungZeigtSymbolUndSchriftzug();
|
||||||
|
$this->stilblattGleichtDerSeitenleiste();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function anmeldungZeigtSymbolUndSchriftzug(): void
|
||||||
|
{
|
||||||
|
$seite = $this->rendereAnmeldung();
|
||||||
|
|
||||||
|
$this->assert(
|
||||||
|
str_contains($seite, '<div class="anmelde-marke">'),
|
||||||
|
'Die Anmeldeseite hat eine eigene Marke'
|
||||||
|
);
|
||||||
|
$this->assert(
|
||||||
|
str_contains($seite, '<img src="/static/coinstack.png" alt="" class="marken-symbol">'),
|
||||||
|
'Die Marke führt das Coinstack-Symbol wie die Seitenleiste'
|
||||||
|
);
|
||||||
|
$this->assert(
|
||||||
|
str_contains($seite, '<span class="marken-text">Finanz<span>manager</span></span>'),
|
||||||
|
'Der Schriftzug ist wie in der Seitenleiste zweigeteilt'
|
||||||
|
);
|
||||||
|
$this->assert(
|
||||||
|
!str_contains($seite, 'class="marke gross"'),
|
||||||
|
'Die alte Marke im Stil einer Statusmarke ist verschwunden'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function stilblattGleichtDerSeitenleiste(): void
|
||||||
|
{
|
||||||
|
$css = (string)file_get_contents(dirname(__DIR__) . '/public/static/app.css');
|
||||||
|
|
||||||
|
$this->assert(
|
||||||
|
(bool)preg_match('/\.anmelde-marke\s*\{[^}]*font-weight:\s*700;/', $css),
|
||||||
|
'Der Schriftzug ist fett wie in der Seitenleiste'
|
||||||
|
);
|
||||||
|
$this->assert(
|
||||||
|
(bool)preg_match('/\.anmelde-marke\s*\{[^}]*display:\s*flex;[^}]*align-items:\s*center;/', $css),
|
||||||
|
'Symbol und Schriftzug stehen nebeneinander auf einer Linie'
|
||||||
|
);
|
||||||
|
$this->assert(
|
||||||
|
(bool)preg_match('/\.anmelde-marke \.marken-text span\s*\{\s*color:\s*var\(--akzent-schrift\);/', $css),
|
||||||
|
'Die zweite Worthälfte trägt die Akzentfarbe'
|
||||||
|
);
|
||||||
|
$this->assert(
|
||||||
|
!preg_match('/\.marke\.gross\s*\{/', $css),
|
||||||
|
'Die alte Regel für die große Statusmarke ist entfernt'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function rendereAnmeldung(): string
|
||||||
|
{
|
||||||
|
$csrfToken = 'test';
|
||||||
|
$titel = 'Anmeldung';
|
||||||
|
$flash = [];
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
try {
|
||||||
|
include dirname(__DIR__) . '/src/Views/auth/login.php';
|
||||||
|
} finally {
|
||||||
|
$html = (string)ob_get_clean();
|
||||||
|
}
|
||||||
|
return $html;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -27,10 +27,33 @@ async function anmelden(page) {
|
||||||
test.describe('Grundgerüst', () => {
|
test.describe('Grundgerüst', () => {
|
||||||
test('Anmeldeseite ist erreichbar', async ({ page }) => {
|
test('Anmeldeseite ist erreichbar', async ({ page }) => {
|
||||||
await page.goto('/login')
|
await page.goto('/login')
|
||||||
await expect(page.locator('h1, .marke')).toContainText(/Finanzmanager|Anmeldung/)
|
await expect(page.locator('h1, .anmelde-marke')).toContainText(/Finanzmanager|Anmeldung/)
|
||||||
await expect(page.locator('#benutzername')).toBeVisible()
|
await expect(page.locator('#benutzername')).toBeVisible()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('Anmeldeseite zeigt dieselbe Marke wie die Seitenleiste', async ({ page }) => {
|
||||||
|
const stil = loc => loc.evaluate(k => {
|
||||||
|
const s = getComputedStyle(k)
|
||||||
|
return { familie: s.fontFamily, gewicht: s.fontWeight }
|
||||||
|
})
|
||||||
|
|
||||||
|
await page.goto('/login')
|
||||||
|
const marke = page.locator('.anmelde-marke')
|
||||||
|
await expect(marke.locator('img.marken-symbol')).toHaveAttribute('src', '/static/coinstack.png')
|
||||||
|
await expect(marke.locator('img.marken-symbol')).toBeVisible()
|
||||||
|
await expect(marke.locator('.marken-text')).toHaveText('Finanzmanager')
|
||||||
|
const anmeldung = await stil(marke.locator('.marken-text'))
|
||||||
|
// Die zweite Worthälfte hebt sich farblich ab, wie in der Seitenleiste.
|
||||||
|
const farben = await marke.locator('.marken-text').evaluate(k => [
|
||||||
|
getComputedStyle(k).color, getComputedStyle(k.querySelector('span')).color,
|
||||||
|
])
|
||||||
|
expect(farben[0]).not.toBe(farben[1])
|
||||||
|
|
||||||
|
await anmelden(page)
|
||||||
|
const leiste = await stil(page.locator('.seitenleisten-marke .marken-text'))
|
||||||
|
expect(anmeldung).toEqual(leiste)
|
||||||
|
})
|
||||||
|
|
||||||
test('Ohne Anmeldung führt jeder Weg zur Anmeldung', async ({ page }) => {
|
test('Ohne Anmeldung führt jeder Weg zur Anmeldung', async ({ page }) => {
|
||||||
await page.goto('/einstellungen')
|
await page.goto('/einstellungen')
|
||||||
await expect(page).toHaveURL(/\/(login|einrichtung)/)
|
await expect(page).toHaveURL(/\/(login|einrichtung)/)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue