diff --git a/web/e2e/smoke.spec.js b/web/e2e/smoke.spec.js
index e5557bf..b2324ff 100644
--- a/web/e2e/smoke.spec.js
+++ b/web/e2e/smoke.spec.js
@@ -4362,19 +4362,25 @@ test('dagens plan står på I dag, og ikke kun som en besked', async ({ page })
});
/**
- * En kalenderadresse gør ikke siden bredere end telefonen.
+ * Adresserne på integrationssiden kan ses helt på en telefon.
*
- * Adressen på et abonnement er ét ord på et par hundrede tegn uden et mellemrum i,
- * og den stod i en liste uden noget, der lod den ombryde. Det, man så, var ikke en
- * linje, der løb ud over kanten — det var hele siden, der fik et vandret
- * rullepanel, fordi det bredeste element på en side bestemmer sidens bredde. Derfor
- * måler prøven dokumentet og ikke elementet: det er dokumentet, der var galt.
+ * En URL er ét ord på et par hundrede tegn uden et mellemrum i, og den kan derfor
+ * ikke ombryde af sig selv. Det gav to forskellige fejl på den samme side, og
+ * prøven her holder øje med dem begge:
+ *
+ * Abonnementets adresse lå i en liste uden noget, der lod den bryde, og det
+ * bredeste element på en side bestemmer sidens bredde — så hele indholdsspalten fik
+ * et vandret rullepanel, ikke bare den ene linje.
+ *
+ * Feed'et, krogen og CalDAV-serveren lå i skrivebeskyttede , som ruller
+ * indeni i stedet for at ombryde. Der var ikke noget rullepanel at se: adressen
+ * stoppede bare midt i kassen, og resten fandtes kun ved at trække inde i feltet.
*
* Abonnementet kommer fra et svar, prøven selv skriver. Serveren ville skulle hente
* kalenderen for at have et at vise, og en prøve, der går på nettet, er en prøve,
* der fejler en dag af en anden grund end sin egen.
*/
-test('en lang kalenderadresse giver ikke vandret rulning', async ({ page }) => {
+test('adresserne på integrationssiden kan ses helt på en telefon', async ({ page }) => {
const trouble = watchForTrouble(page);
await page.route('**/api/v1/calendar', (route) =>
@@ -4421,5 +4427,30 @@ test('en lang kalenderadresse giver ikke vandret rulning', async ({ page }) => {
expect(spill.content).toBe(0);
expect(spill.past).toBeLessThanOrEqual(0);
+ // Og adresserne på siden står der helt. De lå i skrivebeskyttede , som
+ // ikke kan ombryde: kassen var 306 px og indholdet 595, så resten af adressen
+ // fandtes kun ved at rulle inde i feltet — hvilket ingen opdager. Et felt, der
+ // er klippet, er et felt, hvor scrollWidth er større end clientWidth, og det er
+ // præcis det, der måles her.
+ //
+ // Felterne står ved navn og ikke som en forespørgsel på en klasse: en prøve, der
+ // måler `.field output` og finder nul, består — også den dag felterne er lavet om
+ // til noget andet klippet. Den skal fejle, hvis et af dem forsvinder.
+ const clipped = await page.evaluate(() =>
+ ['feed', 'mail', 'hook', 'hookcurl', 'caldav']
+ .map((id) => {
+ const el = document.getElementById(id);
+ if (!el) return `${id}: findes ikke`;
+ if (el.scrollWidth - el.clientWidth > 1) return `${id}: ${el.scrollWidth} > ${el.clientWidth}`;
+ return null;
+ })
+ .filter(Boolean)
+ );
+ expect(clipped).toEqual([]);
+
+ // Selve teksten, ikke kun kassens mål: krogens adresse er den, der skal kunne
+ // læses af, hvis man taster den ind i en genvej på telefonen.
+ await expect(page.locator('#hook')).toHaveText(/^https?:\/\/.+\/inbound\/hook\/.+/);
+
expect(trouble).toEqual([]);
});
diff --git a/web/src/routes/indstillinger/+layout.svelte b/web/src/routes/indstillinger/+layout.svelte
index b43ac4e..948b4e1 100644
--- a/web/src/routes/indstillinger/+layout.svelte
+++ b/web/src/routes/indstillinger/+layout.svelte
@@ -151,7 +151,8 @@
.settings :global(.field input),
.settings :global(.field select),
- .settings :global(.field textarea) {
+ .settings :global(.field textarea),
+ .settings :global(.field output) {
width: 100%;
padding: var(--s2) var(--s3);
background: var(--surface-sunken);
@@ -168,6 +169,22 @@
border-color: var(--accent);
}
+ /* Adresserne — feed'et, krogen, CalDAV-serveren — vises i et