+ {/* På en telefon ryms inte LOCALIZATION i en fjärdedels
+ skärmbredd, och ett tvingat radbrott mitt i ordet är inte
+ tydligare än inget namn alls. Under 640 px bär bokstaven
+ och statussymbolen informationen — vilket är precis vad
+ A·L·V·A är till för — medan raden ovanför namnger den
+ aktiva fasen och dess syfte i klartext. */}
+
{f.namn}
+
{f.namn}
+
{f.syfte}
@@ -293,34 +304,84 @@ export function Knapp({
);
}
+/**
+ * Tabell — med en andra form för smala skärmar.
+ *
+ * En sexkolumnstabell på en telefon har två utfall, och bägge är dåliga:
+ * antingen tvingas hela sidan i sidled, eller så scrollar tabellen inuti
+ * sig själv och läsaren ser tre tecken av varje kolumn. Det första är vad
+ * som hände här — dokumentet blev 842 px brett på en 390 px-skärm och
+ * texten kapades.
+ *
+ * Under 640 px blir varje rad därför en grupp namngivna fält i stället:
+ * kolumnrubriken som etikett, cellen som värde. Det är samma form som
+ * `Falt` redan använder, och samma princip som resten av ytan — ett
+ * instrumentpanelsblad läser man uppifrån och ner, inte i sidled.
+ *
+ * Bägge formerna renderas och växlas med bredd, inte med JavaScript. Det
+ * håller markeringen fri från tillstånd och fungerar innan skriptet
+ * kört.
+ */
export function Tabell({ kolumner, rader }: { kolumner: string[]; rader: ReactNode[][] }) {
return (
-
-
-
- {kolumner.map((k) => (
- |
- {k}
- |
- ))}
-
-
-
- {rader.map((rad, i) => (
-
- {rad.map((cell, j) => (
- |
- {cell}
- |
+ <>
+
+
+
+
+ {kolumner.map((k) => (
+ |
+ {k}
+ |
+ ))}
+
+
+
+ {rader.map((rad, i) => (
+
+ {rad.map((cell, j) => (
+ |
+ {cell}
+ |
+ ))}
+
))}
-
+
+
+
+
+
+ {rader.map((rad, i) => (
+
+ {rad.map((cell, j) => (
+
+
-
+ {kolumner[j]}
+
+ -
+ {cell}
+
+
+ ))}
+
))}
-
-
+
+ >
);
}
diff --git a/felsokning/app/src/felsokning/__tests__/alva-yta.test.ts b/felsokning/app/src/felsokning/__tests__/alva-yta.test.ts
index d11d63f..b75d957 100644
--- a/felsokning/app/src/felsokning/__tests__/alva-yta.test.ts
+++ b/felsokning/app/src/felsokning/__tests__/alva-yta.test.ts
@@ -119,3 +119,40 @@ describe("ALVA-ytan är fri från andra produkters meddelanden", () => {
expect(banner).toMatch(/pathname === p \|\| pathname\.startsWith\(`\$\{p\}\/`\)/);
});
});
+
+// ---- Mobil: ytan får aldrig bli bredare än skärmen ---------------------
+//
+// Portalens tabeller sköt ut dokumentet till 842 px på en 390 px-skärm.
+// Texten kapades i högerkanten och sidan gick att dra i sidled — det som
+// syntes i skärmdumpen från en telefon.
+//
+// Testet läser koden i stället för att rendera, vilket är trubbigt men
+// fångar just de konstruktioner som orsakade det: en tabell utan smal
+// form, en navigationsrad som inte bryts, och en flexkolumn som inte får
+// krympa under sitt innehåll. Den faktiska bredden mäts i genomgången.
+describe("ALVA-ytan håller sig inom skärmbredden", () => {
+ const komponenter = filer.find(([n]) => n.endsWith("alva/komponenter.tsx"))![1];
+ const ram = filer.find(([n]) => n.endsWith("pages/alva/Ram.tsx"))![1];
+
+ it("Tabell har en smal form för telefon, inte bara sidledsscroll", () => {
+ // En sexkolumnstabell som scrollar i sidled ryms, men går inte att
+ // läsa. Den smala formen är staplade namngivna fält.
+ expect(komponenter).toContain("sm:hidden");
+ expect(komponenter).toMatch(/