diff --git a/felsokning/app/src/alva/komponenter.tsx b/felsokning/app/src/alva/komponenter.tsx
index 1a367e0..85e2f0d 100644
--- a/felsokning/app/src/alva/komponenter.tsx
+++ b/felsokning/app/src/alva/komponenter.tsx
@@ -303,12 +303,21 @@ export function Knapp({
onClick,
variant = "primar",
disabled,
+ bred = false,
type = "button",
}: {
children: ReactNode;
onClick?: () => void;
variant?: "primar" | "sekundar";
disabled?: boolean;
+ /**
+ * Fyller sin behållare i stället för att vara innehållsbred.
+ *
+ * För knappar som står bredvid varandra: två olika breda knappar läser
+ * sig som en huvudåtgärd och en eftertanke, oavsett vad de heter. Med
+ * lika bredd skiljs vikten av fyllning mot kontur i stället.
+ */
+ bred?: boolean;
type?: "button" | "submit";
}) {
const primär = variant === "primar";
@@ -317,7 +326,12 @@ export function Knapp({
type={type}
onClick={onClick}
disabled={disabled}
- className="border px-4 py-2 text-[13px] font-semibold uppercase tracking-[0.08em] disabled:opacity-40"
+ // `h-full` och inte bara `w-full`: lika breda knappar där den ena
+ // texten bryts till två rader blir olika HÖGA, vilket är samma
+ // obalans en rad ned. Bägge fyller sin cell.
+ className={`border px-4 py-2 text-[13px] font-semibold uppercase tracking-[0.08em] disabled:opacity-40${
+ bred ? " h-full w-full" : ""
+ }`}
style={{
background: primär ? FARG.graphite : FARG.white,
color: primär ? FARG.white : FARG.graphite,
diff --git a/felsokning/app/src/felsokning/__tests__/alva-yta.test.ts b/felsokning/app/src/felsokning/__tests__/alva-yta.test.ts
index c65dacc..850aa1f 100644
--- a/felsokning/app/src/felsokning/__tests__/alva-yta.test.ts
+++ b/felsokning/app/src/felsokning/__tests__/alva-yta.test.ts
@@ -416,7 +416,13 @@ describe("inloggningen heter samma sak överallt", () => {
const namn = ram.match(/\{ till: "\/alva\/logga-in", text: "([^"]+)" \}/)?.[1];
expect(namn).toBeTruthy();
// Varje länk till inloggningen på startsidan bär samma text.
- const knappar = [...start.matchAll(/to="\/alva\/logga-in">\s*]*>([^<]+)<\/Knapp>/g)];
+ //
+ // Mönstret tål attribut på länken. Första versionen gjorde inte det,
+ // och när fick en className matchade den noll knappar — testet
+ // slutade mäta i stället för att falla. Det enda som avslöjade det var
+ // kravet nedan på att den ska hitta NÅGOT, vilket är därför det står
+ // där och inte som en självklarhet.
+ const knappar = [...start.matchAll(/to="\/alva\/logga-in"[^>]*>\s*]*>([^<]+)<\/Knapp>/g)];
expect(knappar.length).toBeGreaterThan(0);
for (const [, text] of knappar) expect(text.trim()).toBe(namn);
});
diff --git a/felsokning/app/src/pages/alva/Ram.tsx b/felsokning/app/src/pages/alva/Ram.tsx
index 2f86c88..f1d7e7d 100644
--- a/felsokning/app/src/pages/alva/Ram.tsx
+++ b/felsokning/app/src/pages/alva/Ram.tsx
@@ -49,11 +49,16 @@ export function Ram({ children, portal = false }: { children: ReactNode; portal?
- {/* Portalens fem länkar fick inte plats på en telefon och sköt
- ut dokumentet i sidled i stället för att brytas. Raden bryts
- nu, med tätare mellanrum på smal skärm. */}
-
-
-
- Request account
+ {/* Lika breda, inte innehållsbreda. Två knappar bredvid varandra
+ där den ena är dubbelt så bred som den andra läser sig som en
+ huvudåtgärd och en eftertanke — och det är inte förhållandet
+ mellan dem. Rutnätet ger dem samma bredd; vikten skiljs av
+ fyllning mot kontur, som resten av systemet gör. */}
+
+
+ Request account
-
- Login
+
+ Login
@@ -278,12 +283,12 @@ export default function Start() {