diff --git a/gerbil-manager-web/e2e/genotype-table.spec.ts b/gerbil-manager-web/e2e/genotype-table.spec.ts
new file mode 100644
index 0000000..0f518bc
--- /dev/null
+++ b/gerbil-manager-web/e2e/genotype-table.spec.ts
@@ -0,0 +1,54 @@
+/**
+ * UX-MOBILE-2: Genotyp-Tabellen-Overflow — die Tabelle scrollt horizontal,
+ * die Seite selbst bleibt NICHT breiter als der Viewport (kein horizontaler
+ * Page-Overflow auf 390px).
+ */
+import { de, expect, skipUnlessMock, test } from './fixtures'
+
+const tl = de.pages.litters
+
+test('Phone: Genotyp-Detail-Tabelle scrollt im eigenen Wrapper, kein Page-Overflow', async ({
+ page,
+}, testInfo) => {
+ skipUnlessMock()
+ if (testInfo.project.name !== 'phone') return
+
+ // Wurf w-kruemel hat beide Eltern mit Genotypen → BreedingResultView rendert.
+ await page.goto('/wuerfe/w-kruemel')
+ await expect(page.getByRole('heading', { name: 'Wurf K' })).toBeVisible()
+ await expect(page.getByText(tl.detail.expectedColors).first()).toBeVisible()
+
+ // Genotyp-Detail-Tabelle ausklappen.
+ await page.getByRole('button', { name: de.pages.genetik.showGenotypes }).click()
+
+ // Scroll-Wrapper und Tabelle müssen vorhanden und sichtbar sein.
+ const wrapper = page.locator('.genotype-table-scroll').first()
+ await expect(wrapper).toBeVisible()
+ await expect(wrapper.locator('.genotype-table')).toBeVisible()
+
+ // Wrapper ist selbst scrollbar (Tabelle breiter als der sichtbare Bereich).
+ const wrapperScrollable = await wrapper.evaluate(
+ (el) => el.scrollWidth > el.clientWidth,
+ )
+ expect(wrapperScrollable).toBe(true)
+
+ // Die Seite selbst darf NICHT breiter als der Viewport sein.
+ const pageOverflow = await page.evaluate(
+ () => document.documentElement.scrollWidth > document.documentElement.clientWidth,
+ )
+ expect(pageOverflow).toBe(false)
+})
+
+test('Desktop: Genotyp-Detail-Tabelle zeigt Wrapper auch auf breitem Viewport', async ({
+ page,
+}, testInfo) => {
+ skipUnlessMock()
+ if (testInfo.project.name !== 'desktop') return
+
+ await page.goto('/wuerfe/w-kruemel')
+ await expect(page.getByText(tl.detail.expectedColors).first()).toBeVisible()
+ await page.getByRole('button', { name: de.pages.genetik.showGenotypes }).click()
+
+ await expect(page.locator('.genotype-table-scroll').first()).toBeVisible()
+ await expect(page.locator('.genotype-table').first()).toBeVisible()
+})
diff --git a/gerbil-manager-web/src/components/BreedingResultView.tsx b/gerbil-manager-web/src/components/BreedingResultView.tsx
index b8941ac..207c583 100644
--- a/gerbil-manager-web/src/components/BreedingResultView.tsx
+++ b/gerbil-manager-web/src/components/BreedingResultView.tsx
@@ -65,28 +65,30 @@ export default function BreedingResultView({ result, title }: BreedingResultView
{showGenotypes && (
-
-
-
- | {t.genotypeLabel} |
- {t.genotypePreview} |
- {t.probability} |
-
-
-
- {result.offspring.map((o) => (
-
-
- {o.genotype}
- |
- {o.farbschlag} |
-
- {o.probability.percent} ({o.probability.text})
- |
+
+
+
+
+ | {t.genotypeLabel} |
+ {t.genotypePreview} |
+ {t.probability} |
- ))}
-
-
+
+
+ {result.offspring.map((o) => (
+
+
+ {o.genotype}
+ |
+ {o.farbschlag} |
+
+ {o.probability.percent} ({o.probability.text})
+ |
+
+ ))}
+
+
+
)}
>
)}
diff --git a/gerbil-manager-web/src/index.css b/gerbil-manager-web/src/index.css
index 2dbc2d4..115112e 100644
--- a/gerbil-manager-web/src/index.css
+++ b/gerbil-manager-web/src/index.css
@@ -77,6 +77,10 @@ a {
padding: 1rem;
max-width: 60rem;
width: 100%;
+ /* UX-MOBILE-2: prevent any wide content (e.g. genotype table) from making
+ the page body scroll horizontally. The .genotype-table-scroll wrapper
+ provides the per-table horizontal scroll. */
+ overflow-x: hidden;
}
/* Tab-Leiste unten */
@@ -559,8 +563,14 @@ textarea {
white-space: nowrap;
}
+/* UX-MOBILE-2: scroll wrapper so genotype table scrolls horizontally on mobile
+ instead of overflowing the page. */
+.genotype-table-scroll {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
.genotype-table {
- width: 100%;
border-collapse: collapse;
margin-top: 0.75rem;
font-size: 0.9rem;
@@ -571,6 +581,7 @@ textarea {
text-align: left;
padding: 0.4rem 0.5rem;
border-bottom: 1px solid var(--color-border);
+ white-space: nowrap;
}
.genotype-table code {